将结构不同的xml映射到普通的java对象

时间:2013-07-15 11:13:36

标签: xml jboss jaxb unmarshalling

我的情况是我有2个结构不同的XML,我需要从这些中提取数据(一次只需要解析XML)并将其提交给某些逻辑然后填充到通用格式。

<xml1>
    <a>hello</a>
    <b>shreyas</b>
    <c>123</c>
</xml1>

<xml2>
    <d>
        <name>
            <my>hello</my>
        </name>
    </d>
    <e>shreyas</e>
    <f>124</f>
</xml2>

和填写的常用对象

public class Gobj {

    String fName;
    String lName;
    String id;
}

我正在寻找某种运行时注释解析器。我尝试使用Jboss在Jaxb上实现的JaxbIntros,但我找不到xpath支持。

此问题也可以使用基本的SAX解析器解决,但我想要一些像jaxb等的方法。代码的可读性很容易。

-Thanks Shreyas

1 个答案:

答案 0 :(得分:1)

注意:我是EclipseLink JAXB (MOXy)潜在客户和JAXB (JSR-222)专家组的成员。

以下是使用MOXy的外部映射文件扩展名支持此用例的方法。

XML 1的元数据

我们将使用标准的JAXB注释将Gobj类映射到第一个XML表示。

package forum17652921;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="xml1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Gobj {

    @XmlElement(name="a")
    String fName;

    @XmlElement(name="b")
    String lName;

    @XmlElement(name="c")
    String id;

}

XML 2的元数据

我们将使用MOXy的外部映射文档将同一个类映射到第二个XML表示。默认情况下,映射文档用于扩充注释提供的元数据。如果我们将xml-metadata-complete标志设置为true,那么您可以完全替换该元数据。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum17652921"
    xml-accessor-type="FIELD"
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="Gobj">
            <xml-root-element name="xml2"/>
            <java-attributes>
                <xml-element java-attribute="fName" xml-path="d/name/my/text()"/>
                <xml-element java-attribute="lName" name="e"/>
                <xml-element java-attribute="id" name="f"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

<强>演示

在下面的演示代码中,有JAXBContext的两个实例。我们将使用第一个将XML表示1读取到Gobj的实例。然后我们将使用第二个JAXBContext将同一个Gobj实例封送到第二个XML表示。

package forum17652921;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc1 = JAXBContext.newInstance(Gobj.class);

        Unmarshaller unmarshaller = jc1.createUnmarshaller();
        File xml = new File("src/forum17652921/xml1.xml");
        Gobj gobj = (Gobj) unmarshaller.unmarshal(xml);

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17652921/oxm.xml");
        JAXBContext jc2 = JAXBContext.newInstance(new Class[] {Gobj.class}, properties);

        Marshaller marshaller = jc2.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(gobj, System.out);
    }

}

<强> xml1.xml

<xml1>
    <a>hello</a>
    <b>shreyas</b>
    <c>123</c>
</xml1>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<xml2>
   <d>
      <name>
         <my>hello</my>
      </name>
   </d>
   <e>shreyas</e>
   <f>123</f>
</xml2>

了解更多信息