【问题标题】:Getting child node Java获取子节点Java
【发布时间】:2020-08-24 11:54:16
【问题描述】:

我有以下代码

        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】:

    好问题。使用 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 文档而设计,非常强大和灵活。 详情请见How to read XML using XPath in Java

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

    【讨论】:

    • 感谢您的详细回复。现在要研究选项 B。
    【解决方案2】:

    尝试以下解决方案,

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多