首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8-使用Stax拆分大型XML文件会产生意想不到的结果

Java 8-使用Stax拆分大型XML文件会产生意想不到的结果
EN

Stack Overflow用户
提问于 2019-04-27 01:51:33
回答 1查看 229关注 0票数 0

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

名为...的XML文件给出以下结果。在这种情况下,省略了元素标记。

元素: car1元素: car2元素: car3元素: car4

如何才能获得正确的元素?这是否与转换( s,r)干扰输入流读取有关?

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

我希望是这样:循环{前进到start-tag;获取对元素的访问}我看到的是:1:元素+2:元素的部分+重复。

代码语言:javascript
复制
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) { ... }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-28 01:19:08

感谢Andreas,这就是解决方案:

代码语言:javascript
复制
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) { ... }

输入为:

代码语言:javascript
复制
<root>
  <car>
    <name>car1</name>
  </car>
  <other>
    <something>Unknown</something>
  </other>
  <car>
    <name>car2</name>
  </car>
</root>

输出为:

代码语言:javascript
复制
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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55872732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档