XmlStreamReader在开始时随机运行

时间:2016-03-30 20:59:11

标签: java xmlstreamreader

我希望XmlStreamReader从文档的开头(显然)开始,然后在我调用next()时跳转到XML文档的根目录。然而,可怕的是,我看到它跳转到第一个带有文本的标签,并且总是省略根,经常(???)第二个标签。

该文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<objektliste xmlns="http://www.pixelboxx.de/ns/erco/translations/1.0">
  <uebersetzungen key="122671" attribute="7505">
    <thumbnail>abrakadabra.jpg</thumbnail>
    <text sprache="1031">We like the abla abla abla</text>
    <text sprache="2057">We like the spoonBlaBlaBla[en]</text>
    <text sprache="1036">Wicher</text>
  </uebersetzungen>
  <uebersetzungen key="122679" attribute="7505">
    <thumbnail>122679.jpg</thumbnail>
    <text sprache="1031">Kiefer</text>
    <text sprache="1036">franek</text>
  </uebersetzungen>
</objektliste>

我疯了,我的日食是疯了还是我看不到明显的东西? 该程序似乎总是省略“objektliste”并且通常首先跳转到“缩略图”,即使在之前的调试会话中它似乎表现得更加随机。 帮助!

不过,代码非常简单:

    XMLStreamReader streamReader = factory.createXMLStreamReader( is);

    while( streamReader.hasNext())
    {
//event type 7 here, everything seems to be ok. 
        streamReader.next();
//bang! armaggeddon - skips the root, jumps to thumbnail.

1 个答案:

答案 0 :(得分:1)

streamReader.next()的调用是基于事件的。

  

next()方法使读者读取下一个解析事件。 next()方法返回一个整数,用于标识刚刚读取的事件类型。

     

可以使用getEventType()确定事件类型。

我认为您可能遇到了显示最终元素事件的问题,而您并没有预料到它。

使用以下代码,我看到正在按预期处理正确的订单:

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader streamReader = factory.createXMLStreamReader(is);

while( streamReader.hasNext()) {
  int eventType = streamReader.next();
  switch (eventType) {
      case XMLStreamReader.START_ELEMENT:
          String elementName = streamReader.getLocalName();
          System.out.println("Element: " + elementName);
          break;
      case XMLStreamReader.END_ELEMENT:
          break;
  }
}

生成预期输出:

Element: objektliste
Element: uebersetzungen
Element: thumbnail
Element: text
Element: text
Element: text
Element: uebersetzungen
Element: thumbnail
Element: text
Element: text