Доступ к подэлементам в dom4j - PullRequest
0 голосов
/ 17 октября 2018

Ниже приведен 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].

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете создать пользовательскую 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;
    }

}
...