【问题标题】:Java Stax how to get only value of specific child nodesJava Stax如何仅获取特定子节点的值
【发布时间】:2020-09-19 22:09:27
【问题描述】:

我使用 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;
     }
}

【问题讨论】:

  • 我不知道它是否与您的问题有关,但在示例 XML 中您提供的 &lt;lang&gt; 结束标记是错误的。应该是&lt;/lang&gt;
  • @zolv 这与我的问题无关,但谢谢!我刚刚编辑了
  • 我刚刚检查了您的代码,在日志中我可以清楚地看到每个记录的标签 - 完全符合预期。

标签: java xml stax


【解决方案1】:

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

   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());
}

【讨论】:

    【解决方案2】:

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

    如果您想获取您的 XML 元素的子元素,您需要自己跟踪它。

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

    【讨论】:

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