Spring框架的xml语法比较灵活。它允许您将一些信息定义为属性或嵌套元素。例如,
<property name="accountDao" ref="accountDao"/>
或
<property name="accountDao">
<ref bean="accountDao">
</property>
我想在我的代码中做类似的事情
<a b="foo">
和
<a>
<attr name="b">foo</attr>
</a>
目的是让用户可以简单地使用属性,直到属性名称过于复杂(例如,其中有一个空格)或值是多行。但有一个问题:我想使用一些绑定(bind)或序列化框架,如 xstream 或 jaxb,而不是通常的 stax 或 dom api,在这些 api 中我必须手动遍历整个 xml 并创建我的对象。
到目前为止,我还没有想出如何用 xstream 或 jaxb 定义这样的映射,从 Java 字段到 xml 中的两个位置。
我尝试将 xjc (java 6 jvm) 与 Spring's xsd 一起使用.我想也许我会在生成的对象中找到一些见解。但是,xjc 因一些错误而失败。
还有其他想法吗?
最佳答案
注意:我是 EclipseLink JAXB (MOXy)领导,以及 JAXB 2.X ( JSR-222) 专家组的成员。
对于此用例,您可以利用 MOXy 的 XML 元数据将多个绑定(bind)应用到一个字段/属性:
binding.xml
元数据通过 MOXy 的 XML 元数据格式提供。此元数据补充了通过 JAXB 和 MOXy 的注释提供的内容:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="example">
<java-types>
<java-type name="A">
<xml-root-element/>
<java-attributes>
<xml-attribute java-attribute="b"/>
<xml-element java-attribute="b" xml-path="attr[@name='b']/text()" read-only="true"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
演示
以下代码演示了如何使用映射文件引导 JAXBContext 的 MOXy 实现。
package example;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
public class Demo {
private static final String ATTRIBUTE_XML = "<a b='foo'/>";
private static final String ELEMENT_XML = "<a><attr name='b'>bar</attr></a>";
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "example/binding.xml");
JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
A a1 = (A) unmarshaller.unmarshal(new StringReader(ATTRIBUTE_XML));
marshaller.marshal(a1, System.out);
A a2 = (A) unmarshaller.unmarshal(new StringReader(ELEMENT_XML));
marshaller.marshal(a2, System.out);
}
}
一个
package example;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class A {
private String b;
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
}
输出
尽管 MOXy 可以解码不同的格式,但编码格式是相同的。
<?xml version="1.0" encoding="UTF-8"?>
<a b="foo"/>
<?xml version="1.0" encoding="UTF-8"?>
<a b="bar"/>
了解更多信息
关于java - 将 xml 值绑定(bind)为属性或元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613645/