2012-06-27 37 views
3

我想實現的東西是寫回java對象的內容樹到XML文件(對象編組)(我知道有很多的API來做到這一點,但它對我來說是必需的),我想要讓用戶按照他/她想要的順序重新排序標籤,我知道使用像JAXB具有的解釋那樣的註釋,但我認爲使用註釋可能會導致很多痛苦。如果任何人能提供任何好的方法,這將是非常有幫助的。重新排序的XML標籤

由於

回答

1

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

} 
2

注:我是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>