我的问题如下: 我有一堆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的类型?
答案 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,用于搜索模式类型。我发现它有点令人困惑并且记录不清,但它似乎正是你正在寻找的。 p>
答案 2 :(得分:0)
上述答案都是有效的解决方案,但我决定采用的方法是同事建议的方法。
对于给定模式的每个xpath,:
瞧!您已经在模式实例中提取了此Xpath可以绑定到的每个节点的类型,但是从模式本身提取:)