2015-07-02 57 views
1

我正在嘗試編寫一個集成引擎,其中我得到的SOAP XML基本上包含必須從XML中提取的數據庫查詢值並制定快速SQL查詢。用於在任意任意XML模式中提取屬性值的Xpath

問題是輸入XML來自各種來源,並有任意的模式。唯一的常見模式是我有兩種類型的節點來從中提取值。這些包含簡單類型和複雜類型。例如

<?xml version="1.0" encoding="UTF-8"?> 
<for1:submittedData xmlns:for1="http://www.example.com/abc/1.1/"> 
    <td conceptName="PostalAddress_StreetNumber" name="postal.streetNumber"/> 
    <td conceptName="PostalAddress_StreetName" name="postal.streetAddress"/> 
    <Reports conceptName="LaboratoryReport" minDateTime="2012-09-16T00:00:00.000" maxDateTime="2015-09-02T23:59:59.999" searchString="Loinc Test" order="dateDescend" name="clinical.diagnosticReport"> 
     <SendingFacility conceptName="Report_SendingFacility" name="sendingFacility"/> 
     <Report_Subject conceptName="Report_Subject" name="name"/> 
    </Reports> 
</for1:submittedData> 

我要提取的簡單的類型,如PostalAddress_StreetNumber,postal.streetNumber,PostalAddress_StreetName,postal.streetAddress在一個Xpath查詢的所有的屬性值,然後所有的複雜類型LaboratoryReport,2012-09- 16T00:00:00.000。對於複雜類型,要識別的規則是元素是否具有conceptName並且hasChildNodes ='true',則將其視爲複雜類型。 在其上相同的Xpath具有工作輸入例的另一個例子是:

<?xml version="1.0" encoding="UTF-8"?> 
<form:submittedData xmlns:form="http://www.example.com/abc1/1.1/"> 
    <html> 
     <body> 
      <table> 
       <tr> 
        <th>PostalAddress_StreetNumber</th> 
        <th>PostalAddress_StreetName</th> 
       </tr> 
       <td conceptName="PostalAddress_StreetNumber" name="postal.streetNumber"/> 
       <td conceptName="PostalAddress_StreetName" name="postal.streetAddress"/> 
       <tr conceptName="LaboratoryReport" minDateTime="2012-09-16T00:00:00.000" maxDateTime="2015-09-02T23:59:59.999" searchString="Loinc Test Results Ful" order="dateDescend" name="clinical.diagnosticReport"> 
        <td conceptName="Report_SendingFacility" name="sendingFacility"/> 
        <td conceptName="Report_Subject" name="name"/> 
       </tr> 
      </table> 
     </body> 
    </html> 
</form:submittedData> 

我試圖提取所有conceptNames作爲//@conceptName。但我不知道如何在Xpath查詢中制定這些規則。有人可以幫忙嗎?

+0

所以你想獲得*所有*從簡單類型的屬性,我覺得這部分是清楚的。那麼你想從複雜類型中獲得什麼,所有屬性呢?我不這麼認爲。那麼你想提取什麼樣的複雜類型? – har07

+1

是的,在兩個單獨的xpath查詢中,來自簡單和複雜類型的所有屬性。從複雜類型中我也想提取屬性值。例如maxDateTime和maxDateTime值 – iceman

回答

0

要想從複雜的類型,你可以使用下面的XPath的所有屬性:

//*[@* and *]//@* 

簡要說明:

  • //*[@* and *]:發現有子元素(S)和屬性的所有元素( s)...
  • //@*:...然後從每個這樣的元素和它的後代元素,返回所有的屬性

,並使用以下從簡單類型獲得所有屬性:

//*[not(*)][not(parent::*[@* and *])]/@* 

簡要說明:

  • //*[not(*)]:發現沒有子元素中的所有元素...
  • [not(parent::*[@* and *])]:...並且沒有匹配複雜類型標準的父元素...
  • /@*:...然後從每個這樣的元素,則返回所有屬性
+0

// @ * [parent :: * [not(*)]]也會返回複雜類型 – iceman

+0

不確定,那不會發生在我身上。我在這裏使用了兩個XML示例進行了測試:http://www.freeformatter.com/xpath-tester.html – har07

+0

只應得到Attribute ='conceptName =「PostalAddress_StreetNumber」' Attribute ='name =「postal。我的郵箱地址是'',但是我的郵箱地址是'',但是我的郵箱地址是'''',但是我的郵箱地址是'''',但是我的郵箱地址是'屬性= 'conceptName = 「PostalAddress_StreetName」' 屬性= 'NAME = 「postal.streetAddress」' 屬性= 'conceptName = 「Report_SendingFacility」' 屬性= 'NAME = 「sendingFacility」' 屬性='conceptName = 「Report_Subject」 「 屬性=」名稱=「名稱」」 – iceman