【问题标题】:binding xml value as either attribute or element将 xml 值绑定为属性或元素
【发布时间】:2011-07-07 16:08:32
【问题描述】:

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 api,我必须在其中手动检查整个 xml 并创建我的对象。

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

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

还有其他想法吗?

【问题讨论】:

    标签: java jaxb xstream


    【解决方案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);
        }
    
    }
    

    一个

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

    更多信息

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多