如何根据Java中的模式定义获取xml节点类型?

时间:2009-12-10 09:36:22

标签: java xml schema

假设我有一个doc.xml和相应的doc.xsd。我使用xpath来检索一些节点,所以我得到了一个org.w3c.dom.Node列表。如何从模式中获取每个节点的类型,例如。 xs:integer,xs:string等?

一些解决方案是使用node.getNodeName()作为NodeName解析带有xpath查询“// NodeName [@type]”的模式,但这并不完美。我无法确定架构是否优雅 - 如果NodeName存在于架构中的许多位置并且尚未作为单独的类型提取,该怎么办?

所以一般来说,我正在寻找一个可靠的解决方案来获取任何有效的xml和&的节点类型。 XSD。

4 个答案:

答案 0 :(得分:1)

您应该考虑使用JAXB。它将根据模式类型为您创建Java类。然后将XML文档读入这些类,这些类根据您定义XSD的方式键入。因此xsd:int映射到java int(或整数包装类,我不记得了)等。

答案 1 :(得分:1)

将您的DOM元素投射到TypeInfo:从那里,您可以访问您正在寻找的类型信息。

答案 2 :(得分:0)

不幸的是,XML Schema(XSD)或Document Type Definition(DTD)中定义的类型并不直接与它们验证的XML文档相关联。 XML文档中的元素和属性本身并不具有只是文本的类型。将XSD视为验证XML文档的脚本,而不是元素和属性的一组类型注释。

XML规范没有定义类型,因为您在这里考虑它们。甚至可以嵌入XML文档中的文档类型定义(DTD)更多地是关于文档的结构而不是元素和属性中包含的数据的类型。

XML Schema中描述的类型系统是可以应用于XML文档的可选验证层。由于此验证是可选的,因此标准XML API不提供将XSD中的验证规则绑定到实际属性和元素的方法。

我认为XML API可以提供将XSD绑定到特定XML文档的机制,但我不知道这样做的XML解析器。这不是那么容易的一个原因是XML Schema中定义的类型系统比大多数主流编程语言支持的类型系统要丰富得多。在您的示例中,您可能只对xs:integer,xs:string等感兴趣,但在XML Schema中,您可以创建指定范围,模式以及大多数编程语言中数据类型无法实现的其他内容的类型。要用Java或任何编程语言来表示这种复杂类型系统,必须通过相当复杂的API来完成。问题变得真的值得吗?我想说可能不会。

答案 3 :(得分:0)

根据David Ds的回答,稍微清楚,在元素或属性上调用getSchemaTypeInfo()