我想實現的東西是寫回java對象的內容樹到XML文件(對象編組)(我知道有很多的API來做到這一點,但它對我來說是必需的),我想要讓用戶按照他/她想要的順序重新排序標籤,我知道使用像JAXB具有的解釋那樣的註釋,但我認爲使用註釋可能會導致很多痛苦。如果任何人能提供任何好的方法,這將是非常有幫助的。重新排序的XML標籤
由於
我想實現的東西是寫回java對象的內容樹到XML文件(對象編組)(我知道有很多的API來做到這一點,但它對我來說是必需的),我想要讓用戶按照他/她想要的順序重新排序標籤,我知道使用像JAXB具有的解釋那樣的註釋,但我認爲使用註釋可能會導致很多痛苦。如果任何人能提供任何好的方法,這將是非常有幫助的。重新排序的XML標籤
由於
JAXB (JSR-222)實現用於指定XML元素的順序時則內容被編組到XML提供了幾個不同的機制。 JAXB在解組時不需要這些元素。
OPTION#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>
更多信息
選項#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>
DEMO CODE
對FO使用演示代碼來產生上述每個選項的輸出。
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);
}
}
注:我是EclipseLink JAXB (MOXy)鉛和JAXB (JSR-222)專家小組的成員。
在another answer我描述了用於指定元素順序的標準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在同一個包中的以下項你的域模型(見Specifying EclipseLink MOXy as Your JAXB Provider):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
綁定acb.xml
MOXy有一個外部映射文檔擴展,它允許您覆蓋域模型上的映射(請參閱Extending JAXB - Representing Metadata as 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>