编写此XPath表达式的更好方法

时间:2014-01-06 03:12:34

标签: xml xpath wireshark

是否有更简单的方法来编写此XPath表达式,特别是最后一行。我正在从tshark搜索XML转储,寻找具有某些属性的特定数据包。这是我有的XPath表达式

count(//packet[
  proto/@name="dhcpv6"
  and .//field/@showname="Message type: Solicit (1)"
  and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
  and .//field[@show="Interface-Id"]/field[@show="option type: 18"]/../field[@show="Interface-ID: AVC-0123456789"]])

这是获取

的数据包计数
1) Contain a child of <proto name="dhcpv6">
2) Contain a descendant of <field showname="Message type: Solicit (1)/">
3) Contain a descendant of <field show="Link-layer address: 30:00:01:dc:d9:82"/>
4) Contain a descendant of
   <field show="Interface-Id">
     <field show="option type: 18"/>
     <field show="Interface-ID: AVC-0123456789"/>
   </field>

我不喜欢的位是它找到“选项类型:18”,然后返回到父级并查找“Interface-ID:AVC-0123456789”。有没有办法用'和'语句写这个?它有效,但有点令人困惑和不可读的IMO。

这是XML的简化版本。请注意,字段标记可以在多个级别内,这就是我使用.//的原因。

<?xml version="1.0"?>
<packet>
  <proto name="dhcpv6">
    <field showname="Message type: Solicit (1)"/>
    <field show="Link-layer address: 30:00:01:dc:d9:82"/>
    <field show="Interface-Id">
      <field show="option type: 18"/>
      <field show="Interface-ID: AVC-0123456789"/>
    </field>
  </proto>
</packet>

BTW,我坚持使用XPath 1.0,因为我正在使用的工具目前支持。

2 个答案:

答案 0 :(得分:2)

以下似乎对我有用并且更有意义:

count(//packet[
    proto/@name="dhcpv6"
    and .//field/@showname="Message type: Solicit (1)"
    and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
    and .//field[@show="Interface-Id"
        and field[@show="option type: 18"]
        and field[@show="Interface-ID: AVC-0123456789"]
    ]
])

基本上第三个标准是:

  • 田间后裔
    • “Inferface-Id”的“show”属性
    • 具有“选项类型:18”的“show”属性的子字段
    • 具有“Interface”属性“Interface-ID:AVC-0123456789”
    • 的子字段

您也可以按如下方式编写:

count(//packet[
    proto/@name="dhcpv6"
    and .//field/@showname="Message type: Solicit (1)"
    and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
    and .//field
        [@show="Interface-Id"]
        [field[@show="option type: 18"]]
        [field[@show="Interface-ID: AVC-0123456789"]]
])

这意味着第三个.//field必须满足所有3个缩进标准。

答案 1 :(得分:0)

这对你有用吗?

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>  
<xsl:variable name="count" select="count(//packet/proto[@name='dhcpv6' and  /.//field[@showname='Message type: Solicit (1)'] and .//field[@show='Link-layer address: 30:00:01:dc:d9:82']
and .//field[@show='Interface-Id'] and ./field[@show='option type: 18'] and ./field[@show='Interface-ID: AVC-0123456789']])"/>

<xsl:template match="/">
<div>
    Count is: <xsl:value-of select="$count"/>
</div>


</xsl:template>
</xsl:stylesheet>