如何在java中获取嵌套的xsd架构元素的类型

时间:2012-08-14 10:14:24

标签: java xml xml-parsing xsd

我的问题如下: 我有一堆Xpath查询,我希望能够获得这些查询解析的元素的类型,但形成底层的 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的类型?

3 个答案:

答案 0 :(得分:1)

我认为Java库中没有任何东西可以直接执行您想要的操作。

解释XPath表达式将是一项重大工作:您必须解析它们然后解释/执行它们导航模式 - 除非您将自己局限于非常简单的XPath,否则非常复杂。

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

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

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

从架构生成此示例XML应该更容易直接处理XPath - 特别是如果您已经有类来解析架构。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

上述答案都是有效的解决方案,但我决定采用的方法是同事建议的方法。

对于给定模式的每个xpath,

  1. 生成该模式的完整实例(使用某些工具(如trang)很容易)。完成后我的意思是所有可选元素/属性都存在。
  2. 将实例解析为dom4j文档,并使用该实例上的xpath获取节点列表。
  3. 为每个节点获取其绝对路径(来自架构实例文档的根目录)。
  4. 使用一些架构解析库解析架构(我使用XSOM)
  5. 递归遍历解析的模式以从3获取每个节点的类型。(这将很容易,因为您拥有每个节点的绝对路径)。
  6. 瞧!您已经在模式实例中提取了此Xpath可以绑定到的每个节点的类型,但是从模式本身提取:)