我整理了一个XSD并使用JAXB从中生成类。
以下是我的XSD -
myDoc.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.mydoc.org"
targetNamespace="http://www.mydoc.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mtp="http://www.mytypes.com" elementFormDefault="qualified">
<xs:import namespace="http://www.mytypes.com" schemaLocation="mytypes.xsd" />
<xs:element name="myDoc">
<xs:complexType>
<xs:sequence>
<xs:element name="crap" type="xs:string"/>
<xs:element ref="mtp:foo"/>
<xs:element ref="mtp:bar"/>
</xs:sequence>
</xs:complexType>
</xs:element>
mytypes.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.mytypes.com"
xmlns="http://www.mytypes.com"
xmlns:tns="http://www.mytypes.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="foo" type="tns:Foo"/>
<xs:element name="bar" type="tns:Bar"/>
<xs:element name="spam" type="tns:Spam"/>
<xs:simpleType name="Foo">
<xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
<xs:complexType name="Bar">
<xs:sequence>
<xs:element ref="spam"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="Spam">
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:schema>
编组的文件是 -
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
<crap>real crap</crap>
<ns2:foo>bleh</ns2:foo>
<ns2:bar>
<spam>blah</spam>
</ns2:bar>
</myDoc>
请注意,<spam>
元素使用默认命名空间。我希望它使用ns2
命名空间。模式(mytypes.xsd)表示<spam>
包含在<bar>
中,XML实例中的ns2
绑定到ns2
名称空间。
我已经超过一个星期了,我希望<spam>
前缀出现在<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myDoc xmlns:ns2="http://www.mytypes.com">
<crap>real crap</crap>
<ns2:foo>bleh</ns2:foo>
<ns2:bar>
<ns2:spam>blah</ns2:spam><!--NS NS NS-->
</ns2:bar>
</myDoc>
中。我该怎么办?
必填:
{{1}}
答案 0 :(得分:2)
检查生成的类中的字段是否缺少@XmlElement注释,如果存在则缺少命名空间属性。为了获得封送xml
中每个元素的名称空间前缀,必须使用这两个答案 1 :(得分:0)
我试图重现您的问题,但这里工作正常:当编组垃圾邮件元素时确实获得了ns2名称空间。
我的编组代码:
Bar bar = new Bar();
bar.setSpam("s");
MyDoc myDoc = new MyDoc();
myDoc.setBar(bar);
JAXBContext context = JAXBContext.newInstance("org.mydoc");
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(myDoc, System.out);
输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myDoc xmlns="http://www.mydoc.org" xmlns:ns2="http://www.mytypes.com"><ns2:bar><ns2:spam>s</ns2:spam></ns2:bar></myDoc>
我的JAXB版本:
xjc version "JAXB 2.1.3 in JDK 1.6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build IBM JAXB 2.1.3 in JDK 1.6)
修改强>
Bar.java类具有以下注释:
@XmlElement(required = true)
protected String spam;
XmlElement还具有namespace属性。 Javadoc:http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()
默认情况下,它会查看com.mytypes包中的@XmlSchema注释。您是否删除了@XmlSchema注释和/或package-info.java文件?
答案 2 :(得分:0)
package-info.java没有被我的构建系统编译,因此elementFormDefault =“qualified”,并且目标命名空间没有进入Jaxb带注释的类。
如果您看到此行为,请确保将package-info.java编译为.class文件并位于类路径中。
干杯。
答案 3 :(得分:0)
如果使用Maven 2和以下jaxws-maven-plugin构建,也会发生此错误。
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
由于某种原因,为java 1.5配置了maven-compiler-plugin。将目标/来源设置为1.6可以解决问题。
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
如果您知道原因,请随时发表评论。
答案 4 :(得分:0)
您可以在package-info.java中指定它 在@XmlSchema注释中。
elementFormDefault=XmlNsForm.QUALIFIED
示例package-info.java
@XmlSchema(
namespace="desiredNamespace",
// If qualified namespace will be added to all elements
elementFormDefault = XmlNsForm.QUALIFIED,
// If qualifies namespace will be added to all attributes
attributeFormDefault = XmlNsForm.UNQUALIFIED,
xmlns = {
@XmlNs(prefix = "xsd", namespaceURI = "desiredNamespace"),
@XmlNs(prefix = "xsi", namespaceURI = "anotherLink"),
}
)
答案 5 :(得分:-1)
您是否检查过您已将ElementType指定为“垃圾邮件”的代码,但在条形下称为“垃圾邮件”。在你的代码中,这个大写“ S ”和小“ s ”,如果不打扰,我很抱歉,但如果真的很麻烦,你可能必须正确使用它。尝试在任何地方使用“垃圾邮件”,然后检查出来。
- 抱歉,我是xslt,xml,xsd和stuffs的初学者,对JAXB一无所知。但一般来说,当我们读到使用Xsd编写xml文档时,我们总是会考虑区分大小写。
对不起,如果这个答案没有解决你的问题。