Java 重新排序XML标记

Java 重新排序XML标记,java,xml,reflection,jaxb,Java,Xml,Reflection,Jaxb,我正在尝试实现将java对象的内容树写回XML文件(对象编组)(我知道有很多API可以实现这一点,但这是我的要求),我想让用户按照自己的意愿重新排序标记,我知道使用JAXB的注释可以解决这一问题,但我认为使用注释可能会带来很多痛苦。如果有人能提供任何好的方法,那将是非常有帮助的 感谢实现提供了两种不同的机制,用于在将内容编组为XML时指定XML元素的顺序。JAXB不要求元素在解组时处于有序状态 选项#1-@XmlType(proporter={“c”、“b”、“a”) @XmlType注释上的p

我正在尝试实现将java对象的内容树写回XML文件(对象编组)(我知道有很多API可以实现这一点,但这是我的要求),我想让用户按照自己的意愿重新排序标记,我知道使用JAXB的注释可以解决这一问题,但我认为使用注释可能会带来很多痛苦。如果有人能提供任何好的方法,那将是非常有帮助的

感谢

实现提供了两种不同的机制,用于在将内容编组为XML时指定XML元素的顺序。JAXB不要求元素在解组时处于有序状态

选项#1-@XmlType(proporter={“c”、“b”、“a”)

@XmlType
注释上的
proporter
属性允许您指定订单

根目录

输出

输出


注意:我是领导和专家组成员

在本文中,我描述了用于指定元素顺序的标准JAXB机制。在此回答中,我将解释如何使用MOXy的外部映射文档来解决您问题的这一部分:

我想让用户按照自己的意愿重新排序标签,我知道 使用类似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;
    }

}
<?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>
jaxb.properties

要将MOXy指定为JAXB提供程序,需要在与域模型相同的包中添加一个名为JAXB.properties的文件,并使用以下条目(请参阅):

绑定acb.xml

MOXy有一个外部映射文档扩展,允许您覆盖域模型上的映射(请参阅)。我们将使用此文档指定其他订购

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"?>
<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>
输出

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

<?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>

巴兹
酒吧
福
福
巴兹
酒吧
巴兹
福
酒吧
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;
    }

}
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<?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>
<?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>
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>