将xml值绑定为属性或元素

时间:2011-07-07 16:08:33

标签: java jaxb xstream

Spring框架的xml语法有些灵活。它允许您将某些信息定义为属性或嵌套元素。如,

<property name="accountDao" ref="accountDao"/>

<property name="accountDao">
    <ref bean="accountDao">
</property>

我想在我的代码中做类似的事情

<a b="foo">

<a>
    <attr name="b">foo</attr>
</a>

目的是为用户提供使用属性的简单性,直到属性名称过于复杂(例如,其中有空格)或值为多行的点。但有一个问题:我想使用一些绑定或序列化框架,比如xstream或jaxb,而不是通常的stax或dom apis,我必须手动遍历整个xml并创建我的对象。

到目前为止,我还没有想出如何使用xstream或jaxb定义这样的映射,从Java字段到xml中的两个位置。

我尝试将xjc(java 6 jvm)与Spring's xsd一起使用。我想也许我会在生成的对象中找到一些见解。但是,xjc失败了一些错误。

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

注意:我是EclipseLink JAXB (MOXy)负责人,也是JAXB 2.X(JSR-222)专家组的成员。

您可以将MOXy的XML元数据用于此用例,以将多个绑定应用于字段/属性:

<强> 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);
    }

}

<强> A

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"/>

了解更多信息