2012-08-14 60 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大致類似。我發現它有點混亂,記錄不完整,但它看起來正是你想要的。