2012-08-14 37 views
2

我的问题如下: 我有一堆Xpath查询,我希望能够获得这些查询解析元素的类型到,但形成基础xsd模式。 因此,例如给出的架构:如何在java中获取嵌套的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

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

为每个XPath给定模式:

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

瞧!你已经提取了这个Xpath可以在模式实例中绑定的每个节点的类型,但是从模式本身提取出来:)

1

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

解释XPath表达式将是一件很大的工作:您必须解析它们,然后解释/执行它们来导航模式 - 除非您将自己限制为非常简单的XPath,否则它们相当复杂。

一个可能更容易的解决办法是写一些代码来构建一个“注释” XML从架构开始,像这样:

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

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

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

+0

是的,这是一个快速修复,但问题是每当模式发生变化时,使用类型信息手动更新实例文件。似乎没有很大的可扩展性...... – 2012-08-15 10:10:08

+0

我的意思是从模式自动生成实例XML文件 - 我澄清了我的答案。 – MiMo 2012-08-15 14:11:13

1

XSOM支持schema component designators(SCD),这与用于搜索模式类型的XPath大致类似。我发现它有点混乱,记录不完整,但它看起来正是你想要的。