8

我正在尝试使用 JAXB 来解组其架构由 DTD 定义的 XML 文件(啊!)。

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

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

这进入了 xjc 生成的类(标准生成;没有 *.xjb 魔法):

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

但是,当使用 JAXB 解组有效 XML 文件时,该xmlLang属性始终为null.

当我编辑 XML 文件,替换xml:langlang更改@XmlAttribute为匹配时,解组成功(即属性为非null)。

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

这是一个 JAXB 错误吗?我是否在属性名称中遗漏了一些关于“命名空间”的内容?

FWIW, java -version= "build 1.6.0_20-b02" and xjc -version= "xjc version "JAXB 2.1.10 in JDK 6""

4

2 回答 2

7

通过更改替换为 JAXB 生成的类中xml:的声明解决了该问题:namespace

@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是注释对象的生成中的错误还是 unmarhaller 中的错误,或者只是需要在xjc过程中的某个位置进行映射,这在我看来仍然是一个悬而未决的问题。

现在,它正在工作,它所需要的只是一点xjc魔法,所以我相当高兴。

于 2010-06-10T18:34:07.387 回答
1

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

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

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

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

该文件如下所示:

包信息.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是不需要更改每个生成的 XmlAttribute,也不需要手动从 XmlAttribute 名称变量中删除命名空间。

于 2018-06-21T20:46:37.033 回答