1

我有一个 HTML 文档,我想使用 C# 和 XPath 进行查询。我正在寻找的是一个 XPath 表达式——而不是 XSLT、C#、PHP 或任何其他特定于语言的代码示例。任何帮助将不胜感激,但我只需要 XPath 表达式:)。

<tr>
  <td>
    <p>
      <span>text</span>
    </p>
  </td>
  <td>
    <p>
      <span>text</span>
    </p>
  </td>
</tr>
<tr>
  <td>
    <p>
      <span>This text is static and will never change</span>
    </p>
  </td>
  <td>
    <p>
      <span>Bla bla bla .... more bla bla bla</span>
    </p>
  </td>
</tr>
<tr>
  <td>
    <p>
      <span>text</span>
    </p>
  </td>
  <td>
    <p>
      <span>text</span>
    </p>
  </td>
</tr>

我正在寻找的 XPath 表达式将提取当前由字符串实例“Bla bla bla .... more bla bla bla”表示的文本。这个文本会因 HTML 文档而异,但一个字符串总是相同的。在这种情况下,该字符串表示为“此文本是静态的,永远不会改变”。

“这个文本是静态的,永远不会改变”和“Bla bla bla .... more bla bla bla”当然不是真正的字符串 - 我替换了它们,因为它们是特定于域的,与问题无关并且它们显示敏感不能显示的数据!

同样,任何帮助都将受到高度赞赏。谢谢。

4

1 回答 1

2

使用

/*/tr[2]/td[2]/p/span/text()

当针对以下 XML 文档(通过将提供的格式错误的 HTML 转换为格式正确的 XML 文档获得)评估此 XPath 表达式时:

<table>
    <tr>
        <td>
            <p>
                <span>text</span>
            </p>
        </td>
        <td>
            <p>
                <span>text</span>
            </p>
        </td>
    </tr>
    <tr>
        <td>
            <p>
                <span>Some text</span>
            </p>
        </td>
        <td>
            <p>
                <span>text to extract</span>
            </p>
        </td>
    </tr>
    <tr>
        <td>
            <p>
                <span>text</span>
            </p>
        </td>
        <td>
            <p>
                <span>text</span>
            </p>
        </td>
    </tr>
</table>

"text to extract"根据需要选择具有值的文本节点

基于 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="node()|@*">
     "<xsl:copy-of select="/*/tr[2]/td[2]/p/span/text()"/>"
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(如上)时,将评估 XPath 表达式并将此评估的结果复制到输出

"text to extract"

或者,如果您知道文本但想选择包含它的元素(例如td),则使用

//text()[. = 'text to extract']/ancestor::td[1]

再次使用基于 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="node()|@*">
     <xsl:copy-of select=
      "//text()[. = 'text to extract']/ancestor::td[1]"/>
 </xsl:template>
</xsl:stylesheet>

现在的结果是

<td>
   <p>
      <span>text to extract</span>
   </p>
</td>

还有一个猜测

如果要查找最近的前面文本节点,请使用:

//text()[. = 'text to extract']/preceding::text()[1]

基于 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="node()|@*">
     "<xsl:copy-of select=
      "//text()[. = 'text to extract']/preceding::text()[1]"/>"
 </xsl:template>
</xsl:stylesheet>

结果

"Some text"

更新

在 OP 的最新更新和他的新解释之后,他正在寻找的 XPath 表达式是:

//text()[. = 'This text is static and will never change']/following::text()[1]

这将选择具有字符串值的文本节点:

"Bla bla bla .... more bla bla bla"
于 2012-08-05T22:08:56.177 回答