簡體   English   中英

Java 8 - 使用Stax拆分巨大的XML文件會產生意想不到的結果

[英]Java 8 - Split huge XML file using Stax gives unexpected results

在拆分一個巨大的XML文件時,我看到了一個使用Stax和Transformer.transform()的非常好的解決方案。 很好,但我看到一些標簽丟失了。 這是為什么?

帶有Name ...的XML文件給出以下結果。 在EVENT場合,元素標記被省略。

 Element: <?xml version="1.0" encoding="UTF-8"?><car><name>car1</name></car> Element: <?xml version="1.0" encoding="UTF-8"?><name>car2</name> Element: <?xml version="1.0" encoding="UTF-8"?><car><name>car3</name></car> Element: <?xml version="1.0" encoding="UTF-8"?><name>car4</name> 

我怎樣才能獲得正確的元素? 這與變換(s,r)干擾輸入流讀取有關嗎?

這是我的代碼(我喜歡在很多地方看到了這一個 )。 使用StringReader或FileReader時沒有任何變化。

我期待這個:循環{advance to start-tag; 訪問該元素}我看到的是:第一個:元素+第二個:元素的部分+重復。

String testCars = "<root><car><name>car1</name></car><car><name>car2</name></car><car><name>car3</name></car><car><name>car4</name></car></root>";
String element = "car";
try {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLStreamReader streamReader = factory.createXMLStreamReader(new StringReader(testCars));
    streamReader.nextTag();
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    while(streamReader.nextTag() == XMLStreamConstants.START_ELEMENT) {
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            t.transform(new StAXSource(streamReader), result);
            System.out.println("Element: " + writer.toString());
    }
} catch (Exception e) { ... }

感謝Andreas,這是解決方案:

String testCars = "<root><car><name>car1</name></car><other><something>Unknown</something></other><car><name>car2</name></car></root>";
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
    XMLStreamReader streamReader = factory.createXMLStreamReader(new StringReader(testCars));
    streamReader.nextTag();
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    streamReader.nextTag();
    while ( streamReader.isStartElement() ||
          ( ! streamReader.hasNext() && streamReader.nextTag() == XMLStreamConstants.START_ELEMENT)) {
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        t.transform(new StAXSource(streamReader), result);
        System.out.println( "XmlElement: " + writer.toString());
    }
} catch (Exception e) { ... }

輸入是:

<root>
  <car>
    <name>car1</name>
  </car>
  <other>
    <something>Unknown</something>
  </other>
  <car>
    <name>car2</name>
  </car>
</root>

輸出是:

XmlElement: <?xml version="1.0" encoding="UTF-8"?><car><name>car1</name></car>
XmlElement: <?xml version="1.0" encoding="UTF-8"?><other><something>Unknown</something></other>
XmlElement: <?xml version="1.0" encoding="UTF-8"?><car><name>car2</name></car>

暫無
暫無

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

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