簡體   English   中英

Java Stax如何僅獲取特定子節點的值

[英]Java Stax how to get only value of specific child nodes

我使用 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'不同的所有子節點的值,我該如何處理才能獲取該值?

爪哇:

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 解析沒有關於您的文檔的詳細結構的任何信息。 請檢查DOM、SAX 或 StAXJava StAX 解析器之間的差異

如果您想獲得您的 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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM