当前位置: 首页 > 知识库问答 >
问题:

解组时起始元素丢失

金秦斩
2023-03-14

早上好,我试图在我们的代码中找到一个错误,关于当xml没有被格式化时使用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>

列表最多可包含50.000<代码>

为此,我们有以下代码。解组器的创建被移动到一个接口,以区别我们希望通过jaxb解组的元素,包括子元素(如m元素)和那些(如

程序方法

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory.createXMLStreamReader(xmlInputReader);

while (reader.hasNext()) {
  // Check for start elements
  int type = reader.next();
  if (type == XMLStreamConstants.START_ELEMENT) {
    
    // Create unmarshaller 
    String elementName = reader.getLocalName();
    LOG.trace("Create unmarshaller for element: {}", elementName);
    IUnmarshaller<?> unmarshaller = context.createUnmarshaller(elementName);

    LOG.trace("Unmarshal Element");
    JAXBElement<?> element = unmarshaller.unmarshall(reader);

    // proceeding the element
    proceed(element);
    }
  }
}
  

有关详细信息,请参阅用于

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元素都已找到并正确解组

但是当有几个

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

只有两个

在这种情况下日志看起来像这样

为元素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)上。


共有1个答案

邴俊达
2023-03-14

我的猜测是,当JAXB解组时,它最终将读取器移动到新的START\u元素(第二个m元素)
然后,在循环的新迭代中,您将执行reader。下一步()再次。这可能会中断您的解组过程。我不是100%确定,因为您没有显示完整的日志,但我会在编组后检查调试器中读取器的位置

 类似资料:
  • 我正在尝试使用JAXB以以下格式散集XML: 我想从user元素开始解组XML。但是,当我尝试使用“@XmlRootElement(name=“user”)”时,我收到以下错误: 这是我的帐户模型类: 服务:

  • 我试图散集XML。 这就是我的XML的样子 我正在尝试获取Obj123下的Id和姓名。然而,当我运行我的解组命令时,我得到了以下错误。 我的代码在主类中如下所示: 我的Obj123类如下所示: 我认为通过设置我的XMLRootElement,我应该能够跳过XML的前2行,但这似乎并没有发生。有什么想法吗? 编辑: 我的 JAXB 上下文就是这样制作的:

  • 我有一个拓扑结构如下所示: 注意,Bolt2和Bolt3从Bolt1和Bolt4接收元组。所有bolt都是运行python脚本的ShellBolts,而spout是运行从RabbitMQ读取的python脚本的ShellSpout。除了Bolt4之外,所有的工作都是预期的。如果我在RabbitMQ中一次添加一条消息,它就会全部工作并且干净利落地完成。如果我在Bolt4上挂起消息时对消息进行排队,则

  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • 我试图使用XPath将camunda:property元素解组到列表中,以跳过不必要的包装元素。不幸的是,我的财产列表总是空的。它位于Task类中。如有任何帮助,将不胜感激。 编辑#1:我遵循了以下链接,谁应该帮助我的问题,不幸的是,没有成功。http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html,这是官方

  • 在阅读如何在运行时访问元组元素时,我想到了以下使用运行时索引获取元组元素的实现 我自己用GCC11.2试过了。我调用了API来检索元组,但出现了以下错误 找到下面的代码(实时演示)