首先,随着你的问题,你打开了一大罐蠕虫。事情比你想象的要复杂。要完全理解这个答案的其余部分,您肯定需要更多地了解 XML 中的命名空间概念,例如w3schools.com - XML Namespaces。话虽如此,以下内容应该可以快速进入该主题。
请注意,这fo:SomeElement
不是直接的 XML 元素名称。fo:
是所谓的命名空间前缀。命名空间前缀需要通过 映射到命名空间URI xmlns:fo="..."
,
按照惯例fo:
,是用于XSL 格式化对象的命名空间前缀。因此,您的 XML 文件很可能如下所示:
<fo:SomeElement xmlns:fo="http://www.w3.org/1999/XSL/Format" ...>
...
</fo:SomeElement>
请注意,这是XSL 格式化对象规范"http://www.w3.org/1999/XSL/Format"
中指定的命名空间 URI 。
另请注意,命名空间前缀(此处fo
)本身是无关紧要的,只是为了使 XML 内容更易于人类阅读而发明的。因此,fo
您不妨bla
在所有地方都使用命名空间前缀,而 XML 内容仍然具有完全相同的含义。唯一相关的是命名空间 URI(此处"http://www.w3.org/1999/XSL/Format"
)。
使用 JAXB,正确的 Java 根类将如下所示。注意注释中namespace
给出的@XmlRootElement
。
@XmlRootElement(name="SomeElement", namespace="http://www.w3.org/1999/XSL/Format")
public class SomeElement {
...
}
您不仅需要在 中指定此名称空间-URI ,而且还需要为与任何XML 内容@XmlRootElement
对应的嵌套 Java 属性指定此名称空间-URI。<fo:something>
为此,大多数 JAXB 注释(@XmlElement
, @XmlAttribute
, ...)也可以接受namespace
参数。
与上述 XML 示例和 Java 类一致的 XML 模式定义 (XSD) 如下所示。注意元素中targetNamespace
给出的。<xs:schema>
<xs:schema version="1.0" targetNamespace="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SomeElement">
...
</xs:element>
</xs:schema>