Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解组时起始元素丢失_Java_Jaxb_Unmarshalling - Fatal编程技术网

Java 解组时起始元素丢失

Java 解组时起始元素丢失,java,jaxb,unmarshalling,Java,Jaxb,Unmarshalling,早上好, 我试图在我们的代码中发现一个错误,即当XML不是pritty格式时,使用JAXB对XML进行解组。我做了很多调试和测试,但仍然找不到错误 xml的解释部分如下所示: <list> <m note="m1"><g><data /><adress /></g><e><data /><adress /></e></m> <m n

早上好, 我试图在我们的代码中发现一个错误,即当XML不是pritty格式时,使用JAXB对XML进行解组。我做了很多调试和测试,但仍然找不到错误

xml的解释部分如下所示:

<list>
  <m note="m1"><g><data /><adress /></g><e><data /><adress /></e></m>
  <m note="m2"><g><data /><adress /></g><e><data /><adress /></e></m>
  <m note="m3"><g><data /><adress /></g><e><data /><adress /></e></m>      
</list>
有关详细信息,请参阅用于
元素的解组器实现

public class BindingUnmarshallerImpl implements IUnmarshaller {

  private Unmarshaller unmarshaller = null;
  private Class c = null;

  public BindingUnmarshallerImpl(JAXBContext context, Class c) throws JAXBException {
    this.unmarshaller = context.createUnmarshaller();
    this.c = c;
  }

  @Override
  public JAXBElement unmarshall(XMLStreamReader reader) throws JAXBException {
    JAXBElement jaxb = null;
    jaxb = unmarshaller.unmarshal(reader, c);
    return jaxb;
  }
}      
  
  
问题来了:当xml中的每个
元素都位于自己的行上时,上面的代码工作得很好。在这种情况下,三个
元素(包括它们的子元素)被解组并继续。 在本例中,日志如下所示

为元素m创建解组器

为元素m创建解组器

为元素m创建解组器

这意味着所有三个
m
元素都已找到并正确解组

但是,当同一行中有多个
-元素时(不管它们之间是否有空格),它就会中断。给定以下XML

<list>
  <m note="m1"><g><data /><adress /></g><e><data /><adress /></e></m><m note="m2"><g><data /><adress /></g><e><data /><adress /></e></m>
  <m note="m3"><g><data /><adress /></g><e><data /><adress /></e></m>      
</list>

只有两个
元素(
m1
m3
)未被编组,而
m2
未被编组。查看日志显示未找到第二个
m
元素的启动事件

在本例中,日志如下所示

为元素m创建解组器

为元素g创建解组器

为元素创建解组器:数据

为元素创建解组器:地址

为元素e创建解组器

为元素创建解组器:数据

为元素创建解组器:地址

为元素m创建解组器

对我来说,这看起来像是读者无法识别第二个
m
元素。调试时,我更改了代码,只打印出读取器中
START\u元素
END\u元素
事件的名称,而不进行任何解组。看起来是这样的:

起始元素m

起始元素g

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件g

起始元素e

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件e

端部元件m

起始元素m

起始元素g

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件g

起始元素e

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件e

端部元件m

起始元素m

起始元素g

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件g

起始元素e

起始元素数据

端元素数据

起始元素地址

端元素地址

末端元件e

端部元件m

这表明在没有解组时读卡器工作正常,但如果我们每秒解组一行的
m
元素
m
元素,读卡器不会读取,但在解组时必须丢失。这一行为可以通过一行中任意数量的
m
元素看到。当有六个元素时,第一、第三和第五个元素被识别,但其他三个元素不被识别,依此类推

我希望你能理解我的解释,也许任何人都知道为什么会发生这种情况


错误发生在WAS 8.0(使用java 1.6)和WAS 8.5(使用java 1.8)上。

我的猜测是,当JAXB解组时,它最终将读取器移动到新的
START\u元素(第二个
m
元素)。

然后,在循环的新迭代中,再次执行
reader.next()
。这可能会中断您的解组过程。我不是100%确定,因为您没有显示完整的日志,但我会在整理后在调试器中检查reader的位置

谢谢您的想法-我可以通过在元素用JAXB解包时设置一个标记来消除该错误,而不是在元素没有解包时设置标记。如果前一个被取消了签名,我不会调用
reader.getNext
,而是调用
reader.getElementType
进行类型决策,并且无论换行符或任何其他内容,所有操作都正常。
<list>
  <m note="m1"><g><data /><adress /></g><e><data /><adress /></e></m><m note="m2"><g><data /><adress /></g><e><data /><adress /></e></m>
  <m note="m3"><g><data /><adress /></g><e><data /><adress /></e></m>      
</list>