【问题标题】:How can I get the xml Node type based on schema definition in Java?如何根据 Java 中的模式定义获取 xml 节点类型?
【发布时间】:2010-12-25 04:33:12
【问题描述】:

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

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

所以通常我正在寻找一种可靠的解决方案来获取任何有效 xml 和 xsd 的节点类型。

【问题讨论】:

  • 我正在寻找的整个想法是成为类生成的替代方案。问题是架构经常更改,我无法让生成的代码保持最新。我想我希望利用标准模式验证,并在我自己的院子里使用它的一部分。毕竟我不需要为 java 类型映射 xsd 类型,我需要的只是有关 schema 中相应元素的“type”属性的信息。

标签: java xml schema


【解决方案1】:

根据 David Ds 的回答,稍微干净一点,在元素或属性上调用 getSchemaTypeInfo()

【讨论】:

    【解决方案2】:

    将您的 DOM 元素转换为 TypeInfo:从那里,您可以访问所需的类型信息。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        不幸的是,在 XML 模式 (XSD) 或文档类型定义 (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 来完成。问题变成它真的值得吗?我会说可能不会。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多