如果Java中的另一个标记中存在同名的其他标记,如何提取XML文件中的特定标记内容?

如果Java中的另一个标记中存在同名的其他标记,如何提取XML文件中的特定标记内容?,java,parsing,xml-parsing,Java,Parsing,Xml Parsing,目前,我正在使用DOM在Java中解析XML文件。但我遇到了一个问题,即如果在另一个标记中有其他具有相同名称的标记,如何从XML文件中提取特定的标记内容,如以下场景所示: <file> <sub-file> <a> ....</a> <b> ....</b> <c> ....</c> </sub-file> <

目前,我正在使用DOM在Java中解析XML文件。但我遇到了一个问题,即如果在另一个标记中有其他具有相同名称的标记,如何从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三次。

不要使用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);
Element.getElementsByTagNameString返回具有提供的标记名的所有子代节点,而不仅仅是直接子代。您可以通过使用getChildNodes并在返回的NodeList上迭代,或者使用getFirstChild并使用getNextSibling进行迭代来导航树


如果您不仅限于使用DOM,还可以使用XPath来选择适当的节点,即//file/a.

很酷,我不认为用这种方式来查找标记的子节点。谢谢,这很有帮助。很好的解释,谢谢。我将搜索有关XPath解析的更多信息。