我有来自某些第三方的xsd文件,这些文件曾经是“包含”而不是“导入”。我使用这些xsd文件生成java文件,使用jaxb。 最初的xsd结构导致输出,其中相同的classe包含在不同的包中。 例如,如果生成了两个包,“aa”和“bb”,则都包含相同的公共文件:
AA / commonElement.java
AA / a.java
BB / commonElement.java
BB / b.java
这是我想要避免的,我希望commonElement.java在单个包中创建一次,而不是由其他包导入,因此我开始使用import。
<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的类,但是有空字段。
我的猜测是字段是空的,因为unmarshler不理解他需要在“common”命名空间中查找定义,而是在“aa”namesapce中查找它们但是如何使其正常工作? / p>
感谢您的帮助
答案 0 :(得分:0)
我没有足够的信息来诊断你的unmarshal没有正确发生的原因。以下方法可行,您可以将其与您正在查找的错误进行比较。
最有可能的候选人是:
使用以下架构:
<强> 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.Response 强>
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);
}
}
答案 1 :(得分:0)
我有一个问题,如果知道,请解释。我已经尝试了上面的答案,并给出了详细信息,其工作正常。
但是,假设我要在xml验证下进行验证,就像您给出的一样,但是我做了一些小的验证要验证
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Response xmlns="http://www.ns.com/aa">
<element xmlns="http://www.ns.com/common">
<commonChild>FOO</commonChild>
</element>
</Response>
但是它将给出以下错误
SAX Exception: cvc-complex-type.2.4.a: Invalid content was found starting with element 'element'. One of '{"http://www.ns.com/aa":element}' is expected.
is not valid against