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

JAXB如何推进XMLStreamReader?

董飞航
2023-03-14

我使用JAXB使用XMLStreamReader从非常大的XML文件散集对象。

如果我要解组的XML元素是分开的(用换行符,甚至是一个空格),这就可以了。

如果要解组的XML元素之间没有空格,那么我会丢失所有其他项—XML读取器似乎会在解组的元素之后吞下该元素。

演示这一点的简化可运行示例的源代码https://gist.github.com/dalelane/88df784c3cb74b214d5c

有趣的是:

XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
JAXBContext context = JAXBContext.newInstance(MyJAXBClass.class);
Unmarshaller unmarshaller = context.createUnmarshaller();

boolean running = true;
while (running){
    switch (reader.next()){
        case XMLStreamConstants.START_ELEMENT:
            if (reader.getLocalName().equals("myunmarshallobjname")){
                JAXBElement<MyJAXBClass> unmarshalledObj = unmarshaller.unmarshal(reader, MyJAXBClass.class);
                MyJAXBClass item = unmarshalledObj.getValue();
            }
            break;
        case XMLStreamConstants.END_DOCUMENT:
            reader.close();
            running = false;
            break;
    }
}

每次流读取器点击元素的开头,我都会将其传递给解组器,以解组该片段。

如果我有XML,它可以工作:

<myunmarshallobjname key="one"></myunmarshallobjname> <myunmarshallobjname key="two"></myunmarshallobjname>

但如果我有以下物品,则会丢失物品:

<myunmarshallobjname key="one"></myunmarshallobjname><myunmarshallobjname key="two"></myunmarshallobjname>

我做错了什么?我如何让读者不跳过元素?

共有1个答案

翟俊哲
2023-03-14

在解组调用后,仔细检查启用的元素事件。如果XMLStreamReader处于endElement状态,则需要调用next()作为循环的一部分,但它处于startElement状态,则不需要调用。

 类似资料:
  • 问题内容: 我有一个使用Jersey实现的JAX-RS REST服务。JAX-RS / Jersey的很酷的功能之一是,只需添加一些Java批注,就可以将POJO轻松转换为REST服务…包括使用JAXB批注将POJO转换为JSON的简单方法。 现在,我希望能够将这个酷炫的JSON修饰功能用于非REST用途-我很希望能够将其中一些对象序列化为JSON文本到磁盘。这是我要序列化的示例JAXB对象: J

  • 问题内容: 只是对jaxb的工作方式感到好奇,我有一个注释如下的类: 字段str的访问修饰符受到保护,为什么Jaxb仍然可以编组和解组它? 问题答案: 它使用反射。甲或字段或方法可以使用反射API(使用访问在相应的或对象)。 请记住- ,并且是 默认可见性的 控件,仅此而已。它们不(也不能)使用反射阻止访问。

  • 问题内容: 我正在使用JAXB marshaller创建和格式化我的.xml文件。除了一个地方,它运作良好。缩进缺少两个地方: .xml文件的其余部分看起来不错。我正在使用这种方法来美化整个代码: 不幸的是,它不适用于这两个元素。有任何想法吗? 问题答案: 可以通过将javax Transformer应用于输出来解决此烦人的问题。

  • 除了擅长编写 md 电子书来攒 Star,我还写了一系列的开源软件,也掌握了一些项目运营的技巧。 开源并不是你把软件、README 写好就行了,还有详细的文档、示例程序等等。 开源也不是你的项目好了,就会有一堆人参与进来。 开源还要你帮助别人解决 Bug,……。 人们做事都是有原因的,即动机。再举例一下,如果你的项目不够火,别人都没听过,那么写到简历上可能没啥用。 Marketing First

  • 问题内容: 我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同)。我编写了一些Java类,使用JaxB从中生成XML模式。但是,我注意到为了使用JaxB从Java对象生成XML文档的功能,我需要一个ObjectFactory。 如何生成ObjectFactory而不会浪费我现在已有的类? 问题答案: 更新 这个问题可能指的是创建一个角色的作用