我的情况是我有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
答案 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>
了解更多信息