下面是我正在使用的XML。
<xxx>
<yyy>
<zzz>
<tag name="name1">
<innerEle attr = "qaqq">
</tag>
<tag name="name2">
<innerEle attr = "qaqq">
</tag>
<zzz>
<yyy>
</xxx>
对于上述xml,我有一个根元素
现在,如果我要访问“ innerEle”元素,则可以使用Xpath或通过Iteration进行。
还有其他方法可以访问此元素,因为迭代可能需要更多时间
请提供建议,以在不使用Xpath或通过迭代的情况下访问它
当前我正在使用dom4j.jar [版本2.1.1]。
答案 0 :(得分:0)
您可以创建一个自定义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;
}
}