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

时间:2018-07-02 21:09:06

标签: java parsing xml-parsing

当前,我正在使用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的所有标签打印3次(在文件,子文件和图像中)。

2 个答案:

答案 0 :(得分:1)

请勿使用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);

答案 1 :(得分:0)

Element.getElementsByTagName(String)返回具有提供的标签名称的所有 descendant 节点,而不仅仅是直接子节点。您可以使用getChildNodes()并在返回的NodeList上进行迭代,或使用getFirstChild()并使用getNextSibling()进行迭代来导航树。

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