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

具有未知@XmlRootElement的Jaxb Unmarishop

尉迟华翰
2023-03-14

我无法在不了解根元素的情况下取消 XML 的编组。例如。

<foo>
   <bar/>
</foo>

<bar>
   <bar/>
</bar>

等等...

我想在类上映射解组结果,例如:

// @XmlRootElement ??
public class Container
    implements Serializable
{
    private Bar bar;
}

我总是需要修复< code>@XmlRootElement。< br >我搜索了如何在运行时设置@XmlRootElement,但没有成功。知道吗?

我在Spring Batch上下文中,我可以使用我选择的解组器。

注意:我不能使用这里显示的< code>@XmlElementDecl或< code>ObjectFactory,因为我不知道可能的根名称。

共有2个答案

商飞航
2023-03-14

你传的哪个xml有根元素,你提到的XML有两个文件

<foo>
  <bar/>
</foo>

<bar>
 <bar/>

这里有两个根名foo或bar,所以为每个创建两个类,如果哪个根名将调用那个类

左丘宜年
2023-03-14

调整了他的方法:https://stackoverflow.com/a/33824472/181336

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;

public class Test {

    @XmlAccessorType(XmlAccessType.PROPERTY)
    public static class Bar {
        private String name;

        public String getName() {
            return name;
        }

        @XmlElement
        public void setName(String name) {
            this.name = name;
        }
    }

    @XmlAccessorType(XmlAccessType.PROPERTY)
    public static class Container implements Serializable {
        private Bar bar;

        public Bar getBar() {
            return bar;
        }

        @XmlElement
        public void setBar(Bar bar) {
            this.bar = bar;
        }
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(Container.class);
        String xml = "<foo><bar><name>Barry</name></bar></foo>";
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        InputStream is = new ByteArrayInputStream(xml.getBytes());
        JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class);
        Container container = barWrapperElement.getValue();

        System.out.println(container.getBar().getName());
    }
}

它工作!

 类似资料:
  • 问题内容: 我需要在sakila数据库中找到电影的最长租借期。我有这个尝试: 但我得到了错误: 有人知道为什么吗?我使用了应该是汇总数据的列..我缺少什么 问题答案: 如文档中所写 SQL标准要求HAVING必须仅引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL支持对此行为的扩展,并允许HAVING引用SELECT列表中的列以及外部子查询中的列。 您必须在select子句中指定

  • 问题内容: 我的错误输出: 无效的配置对象。已使用与API模式不匹配的配置对象初始化Webpack。-configuration.module具有未知的属性“ loaders”。这些属性是有效的:对象{exprContextCritical?,exprContextRecursive?,exprContextRegExp?,exprContextRequest?,noParse ?、规则?,def

  • 问题内容: 我正在尝试从FpML(金融产品标记语言)4.5版生成Java类。生成了大量代码,但是我不能使用它。尝试序列化一个简单的文档,我得到以下信息: 实际上,没有任何类具有@XmlRootElement批注,那么我该怎么做呢?我将xjc(JAXB 2.1)指向fpml-main-4-5.xsd,其中包括所有类型。 问题答案: v

  • 问题内容: 我有一个无法控制其生成方式的XML。我想通过将其分解为我手工编写的类来创建一个对象。 其结构的一个片段如下所示: 我该如何处理这种情况?当然,元素数是可变的。 问题答案: 如果使用以下对象模型,则每个未映射的key_#元素都将保留为org.w3c.dom.Element的实例: 如果任何元素对应于使用@XmlRootElement批注映射的类,则可以使用@XmlAnyElement(l