需要帮助...使用XPath从条件注释中选择HTML标记

时间:2012-01-28 17:53:36

标签: c# xpath

我对XPath有些新意,所以请事先原谅我。我希望能够搜索HTML评论,特别是条件评论,并仅返回某些标记,例如<link><script>

到目前为止,我已经能够返回包含这些标记的注释集合://comment()[contains(.,'link') or contains(.,'script')],但此时,我不确定如何将实际标记本身提取为具有属性的节点

有人能帮帮我吗?

以下是我试图从中检索各种元素的示例: 我需要能够获取链接和脚本元素。可能也应该提到我正在使用C#和HTML Agility Pack。

<head>
    <!--[if IE 7]>
        <link rel="stylesheet" href="/layout/css/IE7.css" />
    <![endif]-->
    <!--[if IE 9]>
        <link rel="stylesheet" href="/layout/css/IE9.css" />
    <![endif]-->
</head>

2 个答案:

答案 0 :(得分:1)

  

到目前为止,我已经能够返回一系列评论   包含这些标签://comment()[contains(.,'link') or contains(.,'script')],但此时,我不知道如何提取   实际的标签本身就是具有属性的节点。

这是不可能的,因为在XPath表达式评估时,注释中没有节点 - 只是字符串。

可以做的是获得想要的字符串

例如,当上下文节点是两个注释之一时评估此XPath表达式的结果

   "substring-before(substring-after(., '>'),
                     '&lt;![endif]'
                     )

分别是:

  &lt;link rel="stylesheet" href="/layout/css/IE7.css" /&gt;

  &lt;link rel="stylesheet" href="/layout/css/IE9.css" /&gt;

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="comment()">
  <xsl:value-of select=
   "substring-before(substring-after(., '>'),
                     '&lt;![endif]'
                     )"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<head>
    <!--[if IE 7]>
      <link rel="stylesheet" href="/layout/css/IE7.css" />
    <![endif]-->
    <!--[if IE 9]>
      <link rel="stylesheet" href="/layout/css/IE9.css" />
    <![endif]-->
</head>

在每个评论节点上评估XPath表达式,并输出此评估的结果:

  &lt;link rel="stylesheet" href="/layout/css/IE7.css" /&gt;

  &lt;link rel="stylesheet" href="/layout/css/IE9.css" /&gt;

答案 1 :(得分:0)

使用元素名称(你称之为“tag”,称为XML / XPath术语中的元素),这将选择它和所有附加节点 - 包括元素的所有属性。

所以,如果您的文档看起来像:

<html>
<head>
  <link rel="stylesheet" type="text/css" href="theme.css" />
</head>
<body>
...
</body>
</html>

您可以使用以下XPath:

/html/head/link

返回的节点集将包含所有link元素,然后您可以查询它们的属性值。


更新

看到示例标记,事情有点复杂......您正在使用IE条件注释。

这使得 中的项注释显示为所有浏览器/解析器除了之外的IE。这是一个问题,因为您要检索注释中嵌入的<link>“元素”。

您需要自己删除条件注释 - 专门的手写解析器可能是最佳选择,因为HAP只会在此处看到注释。