将XML映射到与XML结构不匹配的Java对象

白詹森

我从对旧版系统的调用中得到了一个平面XML文档,我希望能够使用注释将其解组为多个Java对象(理想情况下)。

XML没有xsd,我想维护Java类的当前结构,因为它们映射到我从静态服务返回的JSON结构。

我已经反向使用MOXy看到了此问题的示例,但没有确切地看到此问题的示例。

所以给...

    <xml>
        <body>
            <a>A</a>
            <b>B</b>
            <c>C</c>
            <d>D</d>
            <e>E</e>
        </body>
    </xml>

我想将这些值映射到

    public class wrapper {

        private Object1 one;
        private Object2 two;
        private Object3 thr;
    }

    public class Object1 {

        private String a;
        private String b;

    }

    public class Object2 {

        private String c;
        private String d;
    }

    public class Object3 {

        private String e;
    }

很明显,这样做的长途方法是手动解析XML文档,以检索文本节点值并将其设置在我的java对象上,但是我试图避免这种情况,因为XML相当大,我将不得不重复该过程为几种服务。

任何需要大量手动处理的解决方案都将使我很难证明偏离当前的长手方法。

提前致谢

博多安

相关的MOXy功能

MOXy当前支持使用来将子对象的映射属性直接写入父对象元素中@XmlPath(".")(请参阅:http : //blog.bdoughan.com/2010/07/xpath-based-mapping.html)。

用例的有趣之处

使您的用例棘手的是,您的示例中增加了嵌套级别。我们今天不直接支持此功能,但是我添加了一个增强请求(请参阅:http : //bugs.eclipse.org/432029)。实施此操作后,您将可以执行以下操作:

@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class wrapper {

    @XmlPath("body")
    private Object1 one;

    @XmlPath("body")
    private Object2 two;

    @XmlPath("body")
    private Object3 thr;

}

变通

使用当前功能,您可以执行以下操作:

Java模型

@XmlRootElement(name="body")
@XmlAccessorType(XmlAccessType.FIELD)
public class wrapper {

    @XmlPath(".")
    private Object1 one;

    @XmlPath(".")
    private Object2 two;

    @XmlPath(".")
    private Object3 thr;

}

演示版

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);
        while(!(xsr.isStartElement() && "body".equals(xsr.getLocalName()))) {
            xsr.next();
        }

        JAXBContext jc = JAXBContext.newInstance(wrapper.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        wrapper result = (wrapper) unmarshaller.unmarshal(xsr);
     }

}

欲获得更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章