2010-08-31 145 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