代码之家  ›  专栏  ›  技术社区  ›  Jacob Zwiers

JAXB无法处理名称中冒号(:)的属性?

  •  6
  • Jacob Zwiers  · 技术社区  · 15 年前

    我正试图使用JAXB来取消XML文件的标记,该XML文件的模式是由DTD定义的(ugh!).

    DTD的外部提供程序已将元素属性之一指定为 xml:lang :

    <!ATTLIST langSet
    id ID #IMPLIED
    xml:lang CDATA #REQUIRED
    >
    

    这进入xjc生成的类(标准生成;没有*.xjb magic),如下所示:

    @XmlAttribute(name = "xml:lang", required = true)
    @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
    protected String xmlLang;
    

    但是,当用JAXB解组有效的XML文件时, xmlLang 属性总是 null .

    当我编辑XML文件时,替换 XML:朗 具有 lang 并改变了 @XmlAttribute 为了匹配,解组成功(即属性为非- 无效的 )

    我确实找到了这个 http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html . 但是,转换为XML模式等的解决方案。我的强烈偏好是直接使用未更改的DTD(因为它是由ISO标准外部提供和定义的)。

    这是JAXB错误吗?我是否在属性名中缺少关于“名称空间”的内容?

    FWW java -version =“构建1.6.0_20-b02”和 xjc -version =“JDK 6中的“XJC版本”JAXB 2.1.10”

    2 回复  |  直到 7 年前
        1
  •  4
  •   Jacob Zwiers    15 年前

    通过更换解决问题 xml: 用一个 namespace JAXB生成的类中的声明:

    @XmlAttribute(name = "lang", namespace="http://www.w3.org/XML/1998/namespace", required = true)
    

    从某种意义上说,这是有道理的。

    没有这种指导,JAXB如何知道如何解释未定义的名称空间 XML: ?当然,除非它对 XML: 正如在 http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getNamespaceURI%28java.lang.String%29 (见第一 注: )

    是否是一个错误 xjc 在解封器中生成带注释的对象或bug,或者只需要在解封器中的某个位置映射 XJC 在我看来,过程仍然是一个悬而未决的问题。

    目前,它在工作,只需要一点 XJC 魔法,所以我很高兴。

        2
  •  1
  •   Joshua Cole    7 年前

    免责声明:虽然8年后,我添加了这个答案,为迷失灵魂,如我自己试图了解自动生成的Java文件从DTD。

    您可以通过@xmlschema选项在project-info.java文件中设置解组器直接使用的项目范围的名称空间。

    当从模式生成类时,XJC应该自动生成这个文件,但是它似乎 从DTD生成时,XJC不会自动生成package-info.java文件!

    但是,您可以手动生成此文件,并将其添加到与XJC生成的文件相同的包中。

    文件如下所示:

    包-info.java:

    @XmlSchema(
        elementFormDefault=XmlNsForm.QUALIFIED, 
        xmlns = {
                @XmlNs(prefix="xlink", namespaceURI="http://www.w3c.org/1999/xlink"),
                @XmlNs(prefix="namespace2", namespaceURI="http://www.w3c.org/1999/namespace2")
        }) 
    
    package your.generated.package.hierarchy;
    import javax.xml.bind.annotation.*;
    

    您可以根据需要添加任意多的名称空间,只需在表单中添加一行新行:

    @XmlNs(prefix="namespace", namespaceURI="http://www.uri.to.namespace.com")
    

    这样做的好处,而不是与编辑生成的 @XmlAttribute 您不需要更改每个生成的xmltattribute,也不需要手动从xmltattribute name变量中删除命名空间。