为什么我的unmarshaller会等到使用XMLStreamReader返回以下start元素?

时间:2012-02-28 22:47:48

标签: java xml jaxb stax

我有一个并行运行的Python脚本和Java测试。他们都试图做同样的事情 - 打开一个套接字,接收一个永无止境的XML流,并在收到XML时解析它。 Python脚本使用Expat,而Java测试使用的是XMLStreamReader和Unmarshaller。

Python脚本始终是Java测试之前的一步/对象,例如当我有足够的XML来解组一个对象时,Python脚本会立即这样做,而Java unmarshaller只会BEGINS解组,而WAITS会在返回先前未编组的对象之前将下一个XML开始标记的开头流入。如果我以相隔20秒的速度接收XML对象,那么Java unmarshaller将不会返回,直到收到下一个。

  1. XML已收到
  2. Python和Java开始解组
  3. Python立即返回
  4. 收到新XML
  5. Java unmarshaller返回
  6. 返回第2步

    XMLStreamReader reader = XMLInputFactory.newFactory()。createXMLStreamReader(socket.getInputStream());

    while(reader.hasNext()){     // Unmarshal here - 挂起直到下一个XML进来 }

  7. XMLStreamReader 是com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl

    这个问题似乎也很好地描述了它:http://java.net/jira/browse/JAXB-419

    该问题中提及的2.1.10类似乎是:

1 个答案:

答案 0 :(得分:0)

unmarshaller想要将“光标”放在事件之后它已经解组的部分的结束元素事件。因此,它会“挂起”,直到有东西可用。来自API doc:

  

此方法假定解析器位于START_DOCUMENT或   START_ELEMENT活动。解组将从此开始事件中完成   到相应的结束事件。如果此方法成功返回,   读者将在结束事件发生后立即指向令牌。

但是,任何XML事件都可以:也许你可以通过在流中插入XML注释来做一些技巧......