首页 > 解决方案 > 获取子节点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>

标签: javaxmldomnodesnodelist

解决方案


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

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

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

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

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


推荐阅读