Как извлечь содержимое конкретного тега в файл XML, если в другом теге Java есть другие теги с таким же именем? - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я работаю над анализом XML-файлов в Java с использованием DOM. Но я столкнулся с проблемой, связанной с извлечением конкретного содержимого тега из файла XML, если в другом теге есть другие теги с тем же именем, что и в следующем сценарии:

<file>
    <sub-file>
        <a> ....</a>
        <b> ....</b>
        <c> ....</c>
    </sub-file>

    <a> ..... some data here ....</a>
    <b> ..... some data here ....</b>
    <c> ..... some data here ....</c>

    <image>
        <a> ....</a>
        <b> ....</b>
        <c> ....</c>
    </image>
</file>

Итак, как я могу извлечь теги a, b, c, которые не находятся внутри другого (внутри вложенного файла или изображения)? Я пробовал пока этот код:

    File xmlfile=new File(path);
            factory = DocumentBuilderFactory.newInstance();
            builder=  factory.newDocumentBuilder();
            document= builder.parse(xmlfile);
            document.getDocumentElement().normalize();
            filelist= document.getElementsByTagName("file");
            for(int o=0;o<filelist.getLength();o++)
            {
                Node nNode = filelist.item(o);

                if (nNode.getNodeType() == Node.ELEMENT_NODE)
                {

                    Element element = (Element) nNode;
                        for (int a=0; a<element.getElementsByTagName("file").getLength(); a++)
                    {   

                            tagA=element.getElementsByTagName("a").item(a).getTextContent();

                            tagB=element.getElementsByTagName("b").item(a).getTextContent();

                            tagC=element.getElementsByTagName("c").item(a).getTextContent();

                    }       
                }
            }// loop
        }

Этот код печатает все теги a, b, c 3 раза (внутри файла, вложенного файла и изображения).

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Element.getElementsByTagName(String) возвращает все дочерние узлы с указанным именем тега, а не только непосредственные дочерние элементы. Вы можете перемещаться по дереву, используя getChildNodes() и итерируя по возвращенному NodeList или используя getFirstChild() и итерируя по getNextSibling().

Если вы не ограничены использованием только DOM, вы также можете использовать XPath для выбора соответствующих узлов, то есть //file/a.

0 голосов
/ 03 июля 2018

Не используйте getElementsByTagName(). Вместо этого, перемещайтесь по дереву DOM самостоятельно:

Node fileNode = filelist.item(o);
for (Node child = fileNode.getFirstChild(); child != null; child = child.getNextSibling()) {
    if (child.getNodeType() == Node.ELEMENT_NODE) {
        switch (child.getNodeName()) {
            case "a":
                tagA = child.getTextContent();
                break;
            case "b":
                tagB = child.getTextContent();
                break;
            case "c":
                tagC = child.getTextContent();
                break;
            default:
                // ignore
        }
    }
}

В качестве альтернативы вы также можете использовать XPath:

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();

tagA = xpath.evaluate("a", fileNode);
tagB = xpath.evaluate("b", fileNode);
tagC = xpath.evaluate("c", fileNode);
...