获取子节点 Java

Getting child node Java

我有以下代码

        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 文档

a) 将 XML 文档解析为 Document 并使用 getElementsByTagName 提取所需的节点。这是您当前的方法。对于简单的文档来说没问题,但它不能很好地扩展,因为 Document class 对文档的结构一无所知。 getElementsByTagName() 方法必须假定它找到的任何标记 可能 出现不止一次。 但是你可以解决这个问题...

b) 为您的特定文档结构生成 Java classes。这要求您有一个 XML 架构来描述 您的 XML 的结构。然后,您可以使用 JAXB 生成 Java classes 来处理您特定的 XML 格式。在您的示例中,生成的代码将 知道 (从模式中)每个 FEATURE 标记中只有一个 NAME 和 VALUE 实例。 NAME 和 VALUE 的 getter 方法将 return 单个节点,因此您的代码不需要为单次出现的元素使用数组。 有关详细信息,请参阅 https://docs.oracle.com/javase/tutorial/jaxb/intro/index.html

c) 使用 Java 中内置的 XPath 支持来准确提取您需要的节点。 XPath 专为处理 XML 文档而设计,非常强大和灵活。 有关详细信息,请参阅 How to read XML using XPath in Java

选项 a) 几乎从未用于处理重要的 XML 文档。 b)和c)都很常见。

尝试以下解决方案,

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