1

我有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 等。代码的可读性很容易。

-谢谢Shreyas

4

1 回答 1

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-completeflag 设置为 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>

了解更多信息

于 2013-07-15T20:53:47.810 回答