访问dom4j中的子元素

时间:2018-10-17 12:31:14

标签: java xml xml-parsing 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或通过Iteration进行。

还有其他方法可以访问此元素,因为迭代可能需要更多时间

请提供建议,以在不使用Xpath或通过迭代的情况下访问它

当前我正在使用dom4j.jar [版本2.1.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;
    }

}