2011-07-07 61 views
3

Spring框架的XML語法是有些柔性。它允許您將某些信息定義爲屬性或嵌套元素。例如,結合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或在我不得不手動在整個XML和創建我的對象的DOM API。

到目前爲止,我還沒有想出如何使用xstream或jaxb從Java字段到xml中的兩個地方定義這種映射。

我試圖與Spring's xsd使用XJC(Java 6的JVM)。我想也許我會在生成的對象中找到一些見解。但是,xjc失敗並出現一些錯誤。

還有其他想法嗎?

回答

1

注:我是EclipseLink JAXB (MOXy)的領先者,也是JAXB 2.X(JSR-222)專家組的成員。

您可以利用這個用例莫西的XML元數據到多個綁定應用到字段/屬性:

binding.xml

元數據是通過莫西的XML元數據格式提供。這個元數據補充什麼通過JAXB和莫西的註解提供:

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

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

更多信息

+0

謝謝!這看起來很棒。 – Yoni