2

我的问题如下:我有一堆 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 的类型?

4

3 回答 3

1

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

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

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

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

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

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

于 2012-08-14T14:39:06.277 回答
1

XSOM 支持类似于 XPath 的模式组件指示符(SCD),用于搜索模式类型。我发现它有点令人困惑并且记录不充分,但它似乎正是您正在寻找的。

于 2012-08-15T15:47:39.580 回答
0

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

对于给定模式的每个 xpath:

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

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

于 2012-08-16T15:08:18.800 回答