【问题标题】:Java 8 - Split huge XML file using Stax gives unexpected resultsJava 8 - 使用 Stax 拆分巨大的 XML 文件会产生意想不到的结果
【发布时间】:2019-04-26 17:51:32
【问题描述】:

在拆分一个巨大的 XML 文件时,我看到了一个非常好的解决方案,它使用 Stax 和 Transformer.transform()。很好,但是我看到一些标签丢失了。这是为什么?

名称为...的 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>

如何获得正确的元素?这与 transform(s, r) 干扰输入流读取有关吗?

这是我的代码(我在很多地方都看到过,比如this one)。使用 StringReader 或 FileReader 时没有变化。

我预计会这样:循环 { 前进到开始标签;访问该元素 } 我看到的是:第一个:元素+第二个:元素的部分+重复。

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) { ... }

【问题讨论】:

  • 你认为streamReader 在调用transform(...) 之后的位置是什么,你为什么相信,即你在哪里看到这种行为记录?
  • 那条评论应该是对我评论的回答吗?我没有问如果你不打电话给transform(...) 会发生什么。我问你期望读者的位置是在电话之后,我问为什么你期望那个,因为我不能看起来查找任何文档指定它将是什么,即它似乎是未指定。 --- “代码在更多地方显示为解决方案” 比如在哪里,你怎么知道它是有效的。仅仅因为你可以在网上找到它,并不意味着它是真的。
  • 好的,我更新了一个示例链接。这个样本也被其他地方引用。我期待什么?现在也在答案中。
  • 您是否阅读了您提供的链接上的last comment?
  • 太棒了!您可以将此添加为答案吗?

标签: java stax


【解决方案1】:

感谢 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2021-10-04
    • 1970-01-01
    • 2017-05-02
    • 2019-04-05
    相关资源
    最近更新 更多