2014-10-17 63 views
0

嗨,我只想獲取值爲「123abc」的元素A。我已經嘗試過但都失敗了。如何選擇具有特定值的grand-grandchild節點的節點

// Package/A [A/B/C /。 = 123ABC]

//封裝/ A [含有(A/B/C,123ABC)]

我希望它返回此:

<A> 
    <System mtm="8742" os="Windows XP" oslang="en" /> 
    <System mtm="2055" os="Windows XP" oslang="jp" /> 
    <A> 
     <B> 
      <C>123abc</C> 
      <C>789</C> 
      <C>567</C> 
     </B> 
    </A> 
    </A> 

示例XML到查詢上運行:

<?xml version="1.0" encoding="UTF-8"?> 
<Database version="300"> 
<Package> 
<A> 
    <System mtm="8742" os="Windows XP" oslang="en" /> 
    <System mtm="2055" os="Windows XP" oslang="jp" /> 
    <A> 
     <B> 
      <C>123abc</C> 
      <C>789</C> 
      <C>567</C> 
     </B> 
    </A> 
</A> 
</Package> 
<Package> 
<A> 
    <System mtm="8742" os="Windows XP" oslang="en" /> 
    <System mtm="2055" os="Windows XP" oslang="jp" /> 
    <A> 
     <B> 
      <C>efg123</C> 
      <C>789</C> 
      <C>567</C> 
     </B> 
    </A> 
</A> 
</Package> 
</Database> 

你可以在這裏測試答案:http://www.freeformatter.com/xpath-tester.html#ad-output

添加了我正在嘗試處理的實際xml,但無法工作,它可能是特殊字符轉義?

我試圖處理實際XML如下,我試圖

// TableSection/SectionItem [SectionItem /小區/。 = 「00-18-E7-17-48-64」]

// TableSection/SectionItem [含有(SectionItem /細胞, 「00-18-E7-17-48-64」)]

 <TableSection name="SNMP Devices" IsTreeFormat="true"> 
     <SectionProperties> 
     <Column id="1" Name="IP Address" /> 
     <Column id="2" Name="Description" /> 
     </SectionProperties> 
     <SectionItem> 
     <Cell columnid="1"> 
     192.168.99.54 
     </Cell> 
     <Cell columnid="2"> 
     WMI XScan 
     </Cell> 
     <SectionItem> 
     <Cell columnid="1"> 
      ScanType 
     </Cell> 
     <Cell columnid="2"> 
      WMIScan 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      Device description 
     </Cell> 
     <Cell columnid="2"> 
      WMI dscription 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      MACAddress 
     </Cell> 
     <Cell columnid="2"> 
      00-18-E7-17-48-64 
     </Cell> 
     </SectionItem> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
     192.168.99.55 
     </Cell> 
     <Cell columnid="2"> 
     WMI XScan 
     </Cell> 
     <SectionItem> 
     <Cell columnid="1"> 
      ScanType 
     </Cell> 
     <Cell columnid="2"> 
      WMIScan 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      Device description 
     </Cell> 
     <Cell columnid="2"> 
      WMI dscription 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      MACAddress 
     </Cell> 
     <Cell columnid="2"> 
      90-2B-34-64-16-9D 
     </Cell> 
     </SectionItem> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
     192.168.99.107 
     </Cell> 
     <Cell columnid="2"> 
     VMWare : &quot;navvms08.Crest.local&quot; 
     </Cell> 
     <SectionItem> 
     <Cell columnid="1"> 
      MACAddress 
     </Cell> 
     <Cell columnid="2"> 
      00-07-E9-0D-05-C5 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      Device identifier 
     </Cell> 
     <Cell columnid="2"> 
      1.3.6.1.4.1.6876.4.1 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      Device name 
     </Cell> 
     <Cell columnid="2"> 
      &quot;navvms08.Crest.local&quot; 
     </Cell> 
     </SectionItem> 
     <SectionItem> 
     <Cell columnid="1"> 
      Device description 
     </Cell> 
     <Cell columnid="2"> 
      &quot;VMware ESXi 5.5.0 build-1623387 VMware, Inc. x86_64&quot; 
     </Cell> 
     </SectionItem> 
     </SectionItem> 
     </TableSection> 

回答

1

在原始示例中,您需要引用您的比較字符串。這兩項工作:

//Package/A[A/B/C/. = "123abc"] 

//Package/A[contains(A/B/C,"123abc")] 

爲你對運行的實際XML查詢應該是:

//TableSection/SectionItem[SectionItem/Cell[contains(.,"00-18-E7-17-48-64")]] 

的問題:

//TableSection/SectionItem[SectionItem/Cell/. = "00-18-E7-17-48-64"] 

是,文本內容必須完全匹配,而XML具有前導空白和尾隨空白。

的問題:

//TableSection/SectionItem[contains(SectionItem/Cell,"00-18-E7-17-48-64")] 

是隻查找第一SectionItem/Cell任何SectionItem/Cell//TableSection/SectionItem,而不是在其中找到文本。

+0

謝謝保羅。我已經添加了我正在嘗試處理的原始問題的實際XML,因爲我仍然無法使查詢生效。非常感謝任何人都可以爲我解決這個問題,因爲我在這方面花了很多時間。 – Terry 2014-10-17 03:36:44

0

對於第一個示例,您沒有引用要比較的字符串。你也不需要額外的/.表達式,因爲無論如何節點atomizaton規則將被應用於字符串比較。

XPath //Package/A[A/B/C = "123abc"]就足夠了。

如果您想對C的文本內容進行部分匹配,則可以使用//Package/A[A/B/C/contains(., "123abc")]。您需要在此處輸入.,因爲您想要查找包含文本123abcC大女兒元素的A元素。 .指的是當前的上下文,這裏是一個單獨的元素。 否則,如果您執行了A/B/contains(C, "123abc"),則會出現類型錯誤,因爲您有多個C元素,並且fn:contains無法對序列進行操作。


對於第二個例子中,沒有包含示例是一個空白的問題,您可以通過使用contains解決這個問題,但是你嘗試包含上一個操作序列。相反,你應該把它重寫成這樣的東西:

//TableSection/SectionItem[SectionItem/Cell/contains(., "00-18-E7-17-48-64")] 
相關問題