【问题标题】:How to get the type of a nested xsd schema element in java如何在java中获取嵌套xsd模式元素的类型
【发布时间】:2012-08-10 14:48:57
【问题描述】:

我的问题如下: 我有一堆 Xpath 查询,我希望能够获得这些查询解析到的元素的 type,但形成底层的 xsd 模式。 因此,例如给定架构:

...
 <xs:complexType name="ResultType">
    <xs:sequence>
      <xs:element name="BUS" type="m:VectorType" />
      <xs:element name="VM" type="m:VectorType" />
      <xs:element name="VA" type="m:VectorType" />
      <xs:element name="QG" type="m:VectorType" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="VectorType">
    <xs:sequence>
      <xs:element name="Value" type="xs:double" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
...

和查询//BUS/Value 我希望能够以编程方式检查//BUS/Value 的类型(来自Java 代码)。我已经使用 ApacheXMLSCHEMA、XSOM 等解析了架构,但是一旦我有了解析的架构,这些库似乎都没有为我提供一种直接获取嵌套元素类型的方法,例如上面的那个。 有没有办法做到这一点,还是我必须将 xpath 查询分解为 BUS 和 Value,获取 BUS 的类型,然后在该复杂类型中查找 Value 的类型?

【问题讨论】:

    标签: java xml xml-parsing xsd


    【解决方案1】:

    以上两个答案都是有效的解决方案,但是我决定采用的方法是一位同事建议的。

    对于给定架构的每个 xpath:

    1. 生成该模式的完整实例(使用 trang 等工具很容易做到)。完整是指所有可选元素/属性都存在。
    2. 将实例解析为 dom4j 文档,并使用该实例上的 xpath 获取节点列表。
    3. 为每个节点获取其绝对路径(从架构实例文档的根目录开始)。
    4. 使用一些架构解析库解析架构(我正在使用 XSOM)
    5. 递归遍历解析的模式,从 3 中获取每个节点的类型。(这很容易,因为您有每个节点的绝对路径)。

    瞧!您已经提取了此 Xpath 可以在模式实例中绑定到的每个节点的类型,但来自模式本身:)

    【讨论】:

      【解决方案2】:

      XSOM 支持schema component designators (SCD),它大致类似于用于搜索模式类型的 XPath。我发现它有点令人困惑且记录不充分,但它似乎正是您正在寻找的。​​p>

      【讨论】:

        【解决方案3】:

        我认为 Java 库中没有任何东西可以直接做你想做的事。

        解释 XPath 表达式将是一项艰巨的工作:您必须解析它们,然后在架构导航中解释/执行它们 - 非常复杂,除非您将自己限制为非常简单的 XPath。

        一个可能更简单的解决方案是编写一些代码,从架构开始构建一个“带注释”的 XML,例如:

        <BUS myns:type="ResultType">
            <Value myns:type="VectorType">
              . . . 
            </Value>
         <BUS>
        

        其中myns 是单独命名空间的前缀。然后针对这个 XML 执行 XPath,并从结果节点的 myns:type 属性中获取类型。

        从模式生成这个示例 XML 应该比直接处理 XPath 更容易 - 特别是如果您已经有类来解析模式。

        【讨论】:

        • 是的,这将是一个快速修复,但问题是每次架构更改时,我都必须使用类型信息手动更新实例文件。似乎不是很可扩展...
        • 我的意思是从架构自动生成实例 XML 文件 - 我澄清了我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        相关资源
        最近更新 更多