重新排序XML标签(reordering XML tags)

2019-09-18 13:47发布

我想实现的东西是写回的java对象的内容树XML文件(对象编组)(我知道有很多的API做这件事,但它从我需要),我想让用户重新排序的标签,因为他/她想要的,我知道使用注释像什么JAXB有可能解决这个问题,但我认为使用注释可能会造成很大的痛苦。 这将是如此有益的,如果任何一个都可能提供任何好办法。

谢谢

Answer 1:

注:我是的EclipseLink JAXB(莫西)领导和成员JAXB(JSR-222)专家小组。

另一个答案我所描述的标准JAXB机制用于指定元素的顺序。 在这个答案,我将解释莫西的外部映射文件如何被用来解决你的问题,这部分:

我想,让用户重新排序的标签,因为他/她想要的,我知道使用注释像什么JAXB有可能解决这个问题,但我认为使用注释可能会造成很大的痛苦。

Root类我已经使用了@XmlType批注指定的顺序。

package forum11217734;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder={"c", "b", "a"})
public class Root {

    private String a;
    private String b;
    private String c;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

}

jaxb.properties

要指定莫西为您的JAXB提供者,你需要在同一个包中添加一个名为jaxb.properties用如下条目(请参阅您的域模型指定的EclipseLink莫西为你JAXB提供者 ):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

绑定acb.xml

莫西具有外部映射文档扩展,它允许您覆盖域模型的映射(见扩展JAXB -代表元数据XML )。 我们将使用这个文件来指定另一个排序。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum11217734">
    <java-types>
        <java-type name="Root">
            <xml-type prop-order="a c b"/>
        </java-type>
    </java-types>
</xml-bindings>

绑定cab.xml

我们可以使用额外的映射文件中提供替代排序。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum11217734">
    <java-types>
        <java-type name="Root">
            <xml-type prop-order="c a b"/>
        </java-type>
    </java-types>
</xml-bindings>

演示

下面的演示代码演示了如何创建时充分利用外部映射文件JAXBContext 。 我们将元帅的同一个实例Root三种不同的方式。

package forum11217734;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        Root root = new Root();
        root.setA("Foo");
        root.setB("Bar");
        root.setC("Baz");

        // CBA
        JAXBContext cbaContext = JAXBContext.newInstance(Root.class);
        Marshaller cbaMarshaller = cbaContext.createMarshaller();
        cbaMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        cbaMarshaller.marshal(root, System.out);

        // ACB
        Map<String, Object> acbProperties = new HashMap<String, Object>(1);
        acbProperties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum11217734/binding-acb.xml");
        JAXBContext acbContext = JAXBContext.newInstance(new Class[] {Root.class}, acbProperties);
        Marshaller acbMarshaller = acbContext.createMarshaller();
        acbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        acbMarshaller.marshal(root, System.out);

        // CAB
        Map<String, Object> cabProperties = new HashMap<String, Object>(1);
        cabProperties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum11217734/binding-cab.xml");
        JAXBContext cabContext = JAXBContext.newInstance(new Class[] {Root.class}, cabProperties);
        Marshaller cabMarshaller = cabContext.createMarshaller();
        cabMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        cabMarshaller.marshal(root, System.out);
    }

}

产量

下面是从运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <c>Baz</c>
   <b>Bar</b>
   <a>Foo</a>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <a>Foo</a>
   <c>Baz</c>
   <b>Bar</b>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <c>Baz</c>
   <a>Foo</a>
   <b>Bar</b>
</root>


Answer 2:

JAXB(JSR-222)实现用于指定XML元素的顺序时则内容被编组到XML提供了几个不同的机制。 JAXB不需要解组时的元素是为了。

选项#1 - @XmlType(propOrder = { “C”, “B”, “A”})

propOrder的财产@XmlType注解允许你指定的顺序。

package forum11217734;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder={"c","b", "a"})
public class Root {

    private String a;
    private String b;
    private String c;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

}

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <c>Baz</c>
    <b>Bar</b>
    <a>Foo</a>
</root>

欲获得更多信息

  • http://blog.bdoughan.com/2012/02/jaxbs-xmltype-and-proporder.html

OPTION#2 - @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)

您也可以使用@XmlAccessorOrder批注指定属性应按照字母顺序整理。

package forum11217734;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Root {

    private String a;
    private String b;
    private String c;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

}

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <a>Foo</a>
    <b>Bar</b>
    <c>Baz</c>
</root>

演示代码

下面的演示代码被用于生产上面的每个选项的输出。

package forum11217734;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setA("Foo");
        root.setB("Bar");
        root.setC("Baz");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}


文章来源: reordering XML tags