JAXB将命名空间添加到父级,但不添加到包含的子元素

时间:2010-05-31 12:54:16

标签: java xml xsd jaxb marshalling

我整理了一个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}}

6 个答案:

答案 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文档时,我们总是会考虑区分大小写。

对不起,如果这个答案没有解决你的问题。