访问 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;
    }

}