Java stax如何只获取特定子节点的值

Java Stax how to get only value of specific child nodes

我使用 Stax 获取我的 xml 文件(大小 90 MB)的节点名称和节点值:

<?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 StAX and Java 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());
}