获取子节点的Java

问题描述 投票:0回答:1

我有以下代码

        try {
            String xml = "<ADDITIONALIDENT><FEATURE MID=\"TEST\"><NAME>ONE NAME</NAME><VALUE>ONE VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>TWO NAME</NAME><VALUE>TWO VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>THREE NAME</NAME><VALUE>THREE VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>FOUR NAME</NAME><VALUE>FOUR VALUE</VALUE></FEATURE><FEATURE MID=\"TEST\"><NAME>FIVE NAME</NAME><VALUE>FIVE VALUE</VALUE></FEATURE></ADDITIONALIDENT>";

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            dbFactory.setNamespaceAware(true);
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document document = dBuilder.newDocument();
            document = dBuilder.parse(new InputSource(new StringReader(xml)));

            NodeList featureList = document.getElementsByTagName("FEATURE");
            for (int i = 0; i < featureList.getLength(); i++) {
                Element featureElement = (Element) featureList.item(i);
                NodeList nameList = featureElement.getElementsByTagName("NAME");
                NodeList valueList = featureElement.getElementsByTagName("VALUE");
                System.out.println("THIS IS NAME: " + nameList.item(0).getTextContent());
                System.out.println("THIS IS VALUE: " + valueList.item(0).getTextContent());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

它工作得很好,而且它能找到正确的值,但我认为我的方法不对。我觉得我不应该在实际的featureList元素中使用列表。

有没有一种方法可以在不做两个列表的情况下得到值?

<ADDITIONALIDENT>
    <FEATURE MID="TEST">
        <NAME>ONE NAME</NAME>
        <VALUE>ONE VALUE</VALUE>
    </FEATURE>
    <FEATURE MID="TEST">
        <NAME>TWO NAME</NAME>
        <VALUE>TWO VALUE</VALUE>
    </FEATURE>
<ADDITIONALIDENT>
java xml dom nodes nodelist
1个回答
1
投票

用下面的方法试试。

try {
    String xml = "YOUR_XML_CONTEN";

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    dbFactory.setNamespaceAware(true);
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document document = dBuilder.newDocument();
    document = dBuilder.parse(new InputSource(new StringReader(xml)));

    NodeList featureList = document.getElementsByTagName("FEATURE");
        for (int i = 0; i < featureList.getLength(); i++) {
            Element featureElement = (Element) featureList.item(i);
            System.out.println("THIS IS NAME: " + 
            featureElement.getElementsByTagName("NAME").item(0).getTextContent());
            System.out.println("THIS IS VALUE: " + 
            featureElement.getElementsByTagName("VALUE").item(0).getTextContent());
        }
    } catch (Exception e) {
       e.printStackTrace();
}

输出。

THIS IS NAME: ONE NAME
THIS IS VALUE: ONE VALUE
THIS IS NAME: TWO NAME
THIS IS VALUE: TWO VALUE
THIS IS NAME: THREE NAME
THIS IS VALUE: THREE VALUE
THIS IS NAME: FOUR NAME
THIS IS VALUE: FOUR VALUE
THIS IS NAME: FIVE NAME
THIS IS VALUE: FIVE VALUE

1
投票

好问题。使用Java查询XML文档有几种方法。

a) 把XML文档解析成Document,然后用getElementsByTagName提取你需要的节点。这是你目前的方法。对于简单的文档来说是可以的,但是它的扩展性不好,因为Document类对文档的结构一无所知。getElementsByTagName()方法必须假设它找到的任何标记都是 "标签"。可能 但你可以解决这个问题......。

b) 为你的特定文档结构生成Java类。这需要你有一个XML模式来描述你的文档结构。你的 XML。然后,您可以使用JAXB生成Java类来处理您特定的XML格式。在您的例子中,生成的代码将是 知道 (来自模式),每个FEATURE标签中正好有一个NAME和VALUE的实例。NAME和VALUE的getter方法将返回一个单一的Node,因此您的代码不需要为单次出现的元素使用数组。https:/docs.oracle.comjavasetutorialjaxbintroindex.html。 了解更多细节。

c) 使用Java中内置的XPath支持来准确地提取你所需要的节点,XPath是为处理XML文档而设计的,非常强大和灵活。XPath是为处理XML文档而设计的,它非常强大和灵活。如何在Java中使用XPath读取XML 以了解更多细节。

选项a)几乎不用于处理非平凡的XML文档。b)和c)都很常见。

© www.soinside.com 2019 - 2024. All rights reserved.