访问 dom4j 中的子元素
Accessing subElements in dom4j
下面是我正在使用的 XML。
<xxx>
<yyy>
<zzz>
<tag name="name1">
<innerEle attr = "qaqq">
</tag>
<tag name="name2">
<innerEle attr = "qaqq">
</tag>
<zzz>
<yyy>
</xxx>
对于上面的xml我有一个根元素
现在,如果我想访问 "innerEle" 元素,我可以使用 Xpath 或迭代。
是否有任何其他方式访问此元素,因为迭代可能需要更多时间
请提供不使用 Xpath 或迭代访问它的建议
目前我正在使用dom4j.jar[版本 2.1.1]。
您可以创建一个自定义 DocumentFactory,为您感兴趣的元素创建某种索引,并通过该索引访问它们。详细信息将非常具体到用例。
public static void main(String[] args) throws Exception {
SelectiveIndexedDocumentFactory factory = new SelectiveIndexedDocumentFactory(QName.get("innerEle"));
SAXReader reader = new SAXReader();
reader.setDocumentFactory(factory);
Document doc = reader.read(...);
factory.getElements(QName.get("innerEle")).stream()
.forEach(e -> System.out.println(e.getName()));
}
static class SelectiveIndexedDocumentFactory extends DocumentFactory {
private Set<QName> indexedElements = new HashSet<>();
private Map<QName, List<Element>> index = new HashMap<>();
public SelectiveIndexedDocumentFactory(QName...indexedElements) {
this.indexedElements.addAll(Arrays.asList(indexedElements));
}
public List<Element> getElements(QName qn) {
return index.containsKey(qn) ? index.get(qn) : Collections.emptyList();
}
@Override
public Element createElement(QName qname) {
Element e = super.createElement(qname);
if (indexedElements.contains(qname)) {
List<Element> l = index.get(qname);
if (l == null) {
l = new ArrayList<>();
index.put(qname, l);
}
l.add(e);
}
return e;
}
}
下面是我正在使用的 XML。
<xxx>
<yyy>
<zzz>
<tag name="name1">
<innerEle attr = "qaqq">
</tag>
<tag name="name2">
<innerEle attr = "qaqq">
</tag>
<zzz>
<yyy>
</xxx>
对于上面的xml我有一个根元素
现在,如果我想访问 "innerEle" 元素,我可以使用 Xpath 或迭代。
是否有任何其他方式访问此元素,因为迭代可能需要更多时间
请提供不使用 Xpath 或迭代访问它的建议
目前我正在使用dom4j.jar[版本 2.1.1]。
您可以创建一个自定义 DocumentFactory,为您感兴趣的元素创建某种索引,并通过该索引访问它们。详细信息将非常具体到用例。
public static void main(String[] args) throws Exception {
SelectiveIndexedDocumentFactory factory = new SelectiveIndexedDocumentFactory(QName.get("innerEle"));
SAXReader reader = new SAXReader();
reader.setDocumentFactory(factory);
Document doc = reader.read(...);
factory.getElements(QName.get("innerEle")).stream()
.forEach(e -> System.out.println(e.getName()));
}
static class SelectiveIndexedDocumentFactory extends DocumentFactory {
private Set<QName> indexedElements = new HashSet<>();
private Map<QName, List<Element>> index = new HashMap<>();
public SelectiveIndexedDocumentFactory(QName...indexedElements) {
this.indexedElements.addAll(Arrays.asList(indexedElements));
}
public List<Element> getElements(QName qn) {
return index.containsKey(qn) ? index.get(qn) : Collections.emptyList();
}
@Override
public Element createElement(QName qname) {
Element e = super.createElement(qname);
if (indexedElements.contains(qname)) {
List<Element> l = index.get(qname);
if (l == null) {
l = new ArrayList<>();
index.put(qname, l);
}
l.add(e);
}
return e;
}
}