【问题标题】:How to extract specific tag content in XML file if there are other tags with the same name inside another tag in Java?如果Java中的另一个标签内有其他同名标签,如何提取XML文件中的特定标签内容?
【发布时间】:2018-07-02 21:09:05
【问题描述】:

目前,我正在使用 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 次(内部文件、子文件和图像)。

【问题讨论】:

    标签: java parsing xml-parsing


    【解决方案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);
    

    【讨论】:

    • 酷,我没想到会以这种方式为标签寻找孩子。谢谢,这很有帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 很好的解释,谢谢。我会搜索更多关于 XPath 解析的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多