2014-10-17 64 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")] 
相关问题