2010-08-31 143 views
1

我從某些第三方獲得了一個xsd文件,這個文件曾經是「include」而不是「import」。我正在使用這些xsd文件來使用jaxb生成java文件。 最初的xsd結構導致輸出中包含不同包中的相同類。 例如,如果兩個包分別生成, 「AA」 和 「BB」,既包括在相同的共同文件中:從xsd文件生成java類

AA/commonElement.java
AA/a.java

BB/commonElement.java
BB/b.java

這是我想避免的,我想commonElement.java在單一封裝一旦被創建和比其餘的進口,所以我已經開始使用進口替代。

<xs:schema xmlns="http://www.ns.com/aa" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:DD="http://www.ns.com/common" targetNamespace="http://www.ns.com/aa" elementFormDefault="qualified" jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"> 

<xs:import namespace="http://www.ns.com/common" schemaLocation="common.xsd"/> 
    <xs:element name="Response"> 
       <xs:complexType> 
         <xs:sequence> 
            <xs:element name="element" type="DD:commonElement" ../> 

java類是創建和編譯的,正如我所料。

通用/ commonElement.java
AA/aa.java

問題是,當我收到AA的結果,從API調用,並解組的結果,我得到commonElement AA級正確創建的,但與空的領域。

我的猜測是這些字段是空的,因爲unmarshler不明白他需要在「common」命名空間中查找定義,而是在「aa」namesapce中查找它們,但是如何使它正常工作?

感謝您的幫助

+0

你有一個按比例縮小的XSD例如XML&你可以發佈,演示您的問題? – 2010-08-31 19:54:43

回答

0

我沒有足夠的信息來診斷爲什麼你解組沒有正確發生。以下內容將起作用,您可以將其與您正在做的查找錯誤進行比較。

最有可能的候選人是:

  • 在創建JAXBContext而你沒有告訴JAXB約夠班。
  • 您的XML文檔沒有正確的命名空間限定。

使用以下模式:

common.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.ns.com/common" 
    xmlns="http://www.ns.com/common" 
    elementFormDefault="qualified"> 

    <xs:complexType name="commonElement"> 
     <xs:sequence> 
      <xs:element name="commonChild" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

aa.xsd

<xs:schema xmlns="http://www.ns.com/aa" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:DD="http://www.ns.com/common" targetNamespace="http://www.ns.com/aa" 
    elementFormDefault="qualified"> 

    <xs:import namespace="http://www.ns.com/common" 
     schemaLocation="common.xsd" /> 

    <xs:element name="Response"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="element" type="DD:commonElement" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

產生以下類:

com.ns.aa.package-信息

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ns.com/aa", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.ns.aa; 

com.ns.aa.響應

package com.ns.aa; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 
import com.ns.common.CommonElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "element" 
}) 
@XmlRootElement(name = "Response") 
public class Response { 

    @XmlElement(required = true) 
    protected CommonElement element; 

    public CommonElement getElement() { 
     return element; 
    } 

    public void setElement(CommonElement value) { 
     this.element = value; 
    } 

} 

com.ns.common.package-信息

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ns.com/common", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.ns.common; 

com.ns.common.CommonElement

package com.ns.common; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "commonElement", propOrder = { 
    "commonChild" 
}) 
public class CommonElement { 

    @XmlElement(required = true) 
    protected String commonChild; 

    public String getCommonChild() { 
     return commonChild; 
    } 

    public void setCommonChild(String value) { 
     this.commonChild = value; 
    } 

} 

有了這些類,我可以解編遵循XML文檔:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:Response xmlns="http://www.ns.com/common" xmlns:ns2="http://www.ns.com/aa"> 
    <ns2:element> 
     <commonChild>FOO</commonChild> 
    </ns2:element> 
</ns2:Response> 

使用下面的代碼:

演示

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

import com.ns.aa.Response; 

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("input.xml"); 
     Response response = (Response) unmarshaller.unmarshal(xml); 

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

你是對的。 問題是我沒有收到具有正確屬性的xml,例如,以反映我所做的模式更改。當我手動編輯xml時,對象被正確解組。 問題是,如果我無法控制xml結構,因爲我從其他方接收它。 所以問題是:我可以在我身邊做一些改變,所以無論如何unmarshling會成功找到元素? 謝謝 – anyab 2010-09-02 13:36:42

+0

你能否提供樣本文件?答案取決於「元素」是在默認名稱空間還是沒有名稱空間。 – 2010-09-08 15:07:59