【问题标题】:ElementFormDefault="unqualified" ignored using XJC使用 XJC 忽略 ElementFormDefault="unqualified"
【发布时间】:2016-06-30 10:44:03
【问题描述】:

我正在使用 XJC 从模式生成 java 模型类,我不希望 elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED 出现在我的 package-info.java 中。我尝试了两种不同的 XML-

    <?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.google.com/Protocol" elementFormDefault="unqualified" 
targetNamespace="http://www.google.com/Protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <xs:element name="A">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="User" type="xs:string"/>
        <xs:element name="Attr" type="xs:string"/>
        <xs:element ref="A1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
<xs:element name="A1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Attr" type="xs:string"/>
        <xs:element minOccurs="0" maxOccurs="1" name="Attr2" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Root">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="A" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Xml 以上生成包信息如下-

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.google.com/Protocol")
package com.google;

而另一方面在 Xml-

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.google.com/Protocol" elementFormDefault="unqualified" 
targetNamespace="http://www.google.com/Protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <xs:element name="A">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="User" type="xs:string"/>
        <xs:element ref="A1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
<xs:element name="A1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Attr" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Root">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="A" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

在 package-info.java 下生成

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

我不希望 elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED 出现在我的 java 文件中。目前,一旦生成模型,我必须手动将其编辑为 elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED。

任何人都可以请帮助为什么 elementFormDefault="unqualified" 在第二个 xml 中被忽略。

【问题讨论】:

    标签: java xml xjc


    【解决方案1】:

    这里没有什么问题(如果您已经意识到这一点,我们深表歉意)。

    JAXB 提供者只是猜测您将使用此包做什么,但这不会影响任何生成的类,只会影响您可能添加到该包中的新类。

    所有生成的类都可以很好地编组,本地元素不会像 elementFormDefault=unqualified 那样使用 NS 编写,因为它们是使用完整的 JAXB 集生成的注释。

    也许你已经知道了,我没有回答你的问题,但我在想象你认为这是一个你需要处理的错误,只是指出如果你要领先,它就不会——下来,只使用生成的类。

    但要真正回答为什么这里有区别,您可能必须深入研究实现细节和 JAXB 提供者文档才能更好地理解。我也没有看到标准绑定自定义here,因此它也可能是特定于提供商的。

    【讨论】:

    • 我检查了 JAXB,遗憾的是它没有达到目的。感谢您的帮助:)
    • 我在网上又找到了一个link。这是一个 XML 问题,而不是 XJC。不过,我仍在寻找解决方案。
    • 我不确定评论是否能抓住问题。不知道 JAXB 是否适合您。但我的观点是,我认为模式定义的元素和类型没有任何问题,生成的类也没有任何问题。如果您尝试一个简单的示例程序序列化生成的 JAXB 类的一些对象实例,您将看到 NS 限定符根据模式是有效的。但是 JAXB 也允许您出于任何原因将其他类添加到此包中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多