Java Stax如何仅获取特定子节点的值

问题描述

我使用Stax来获取我的xml文件(大小为90 MB)的nodeName和nodeValue:

<?xml version="1.0" encoding="UTF-8"?>
<name1>
    <type>
        <coord>67</coord>
        <umc>57657</umc>
    </type>
    <lang>
        <eng>989</eng>
        <spa>123</spa>
    </lang>
</name1>
<name2>
    <type>
        <coord>534</coord>
        <umc>654654</umc>
    </type>
    <lang>
        <eng>354</eng>
        <spa>2424</spa>
    </lang>
</name2>
<name3>
    <type>
        <coord>23432</coord>
        <umc>14324</umc>
    </type>
    <lang>
        <eng>141</eng>
        <spa>142</spa>
    </lang>
</name3>

我可以获取localName但不能获取子节点...如果我想获取'spa'不同的所有子节点的值,我该如何处理呢?

Java:

XMLStreamReader dataxML = factory.createXMLStreamReader(new FileReader(path));
while (dataxML.hasNext())
{
    int type = dataxML.next();
    switch(type)
    {
        case XMLStreamReader.START_ELEMENT:
             System.out.println(dataxML.getLocalName());
             break;

        case XMLStreamReader.CHaraCTERS:
             System.out.println(dataxML.getText());
             break;
     }
}

解决方法

您使用StAX解析。这意味着您从解析器中提取事件。 StAX解析没有有关您的文档的详细结构的任何信息。 请检查Differences between DOM,SAX or StAXJava StAX parser

如果要获取XML元素的子元素,则需要自己进行跟踪。

如果您真的希望通过方便的方式访问子级,请使用DOM解析策略。但是正如您所提到的,您的文档约为90MB,要完全加载它可能真的很重。

,

要跟踪要解析的元素,需要引入保存当前标签名称的变量以及带有感兴趣标签名称的变量:

   String localname = null;
   String tagName = "spa";

    while (dataXML.hasNext()) {
        int type = dataXML.next();
        switch (type) {

            case XMLStreamReader.SPACE:
                continue;

            case XMLStreamReader.START_ELEMENT:
                localname = dataXML.getLocalName();
                System.out.println(dataXML.getLocalName());
                break;

            case XMLStreamReader.CHARACTERS:
                if (!tagName.equals(localname)) {
                    System.out.println(dataXML.getText());
                }
                break;
        }
    }

如果要处理多个标签,可以将变量tagName替换为列表:

List<String> tagNames = new ArrayList<>();
tagNames.add("spa");

检查如下:

if (!tagNames.contains(localname)) {
    System.out.println(dataXML.getText());
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...