2013-02-01 101 views
1

我想傳入的XML綁定到一個java類型JAXB XSD元素(基本)

<?xml version="1.0" encoding="UTF-8"?> 
<apiKeys uri="http://api-keys"> 
<apiKey uri="http://api-keys/1933"/> 
<apiKey uri="http://api-keys/19334"/> 
</apiKeys> 

我希望用JAXB,所以我定義了一個XSD。我的XSD不正確,創建的對象在創建時是空的。

我的XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="apiKeys" type="ApiKeysResponseInfo2" /> 

<xsd:complexType name="ApiKeysResponseInfo2"> 
<xsd:sequence> 
<xsd:element name="uri" type="xsd:anyURI" minOccurs="1" maxOccurs="1"> 
</xsd:element> 
<xsd:element name="apiKey" type="xsd:anyURI" minOccurs="1" maxOccurs="unbounded"> 
</xsd:element> 
</xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 

顯然,我的元素定義是錯誤的。任何幫助非常感謝。謝謝。

回答

1

我希望使用JAXB,所以我定義了一個XSD。

JAXB不需要XML模式。我們將它設計爲從Java對象開始,添加了從XML模式生成註釋模型的功能,作爲便利機制。


我想傳入的XML綁定到一個java類型

你可以使用下面的對象模型:

ApiKeys

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class ApiKeys { 

    private String uri; 
    private List<ApiKey> apiKey; 

    @XmlAttribute 
    public String getUri() { 
     return uri; 
    } 

    public void setUri(String uri) { 
     this.uri = uri; 
    } 

    public List<ApiKey> getApiKey() { 
     return apiKey; 
    } 

    public void setApiKey(List<ApiKey> apiKey) { 
     this.apiKey = apiKey; 
    } 

} 

ApiKey

import javax.xml.bind.annotation.XmlAttribute; 

public class ApiKey { 

    private String uri; 

    @XmlAttribute 
    public String getUri() { 
     return uri; 
    } 

    public void setUri(String uri) { 
     this.uri = uri; 
    } 

} 

演示

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum14643483/input.xml"); 
     ApiKeys apiKeys = (ApiKeys) unmarshaller.unmarshal(xml); 

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

} 
+1

佑,感謝爲布萊斯 - 我給它一個去。我的動機實際上是與Json合作,所以我真正想要的就是Jaxb對象,並且不會維護XSD。 – Damo

+0

我目前的Jaxb物體看起來和你的一樣,但是我會咀嚼幾件東西並重新測試。我不明白的(翻譯)部分與有關 - 但是如果其中包含類似 http:// api-keys/1933「 - 我可以看到它是如何映射的。 – Damo

+0

@Damo - 「翻譯」部分是否指JSON? –