1

C# と XPath を使用してクエリを実行したい HTML ドキュメントがあります。私が探しているのは 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 ドキュメントごとに異なりますが、1 つの文字列は常に同じです。この場合、その文字列は「このテキストは静的であり、変更されることはありません」と表されます。

「このテキストは静的であり、変更されることはありません」および「Bla bla bla .... more bla bla bla」はもちろん真の文字列ではありません。これらはドメイン固有のものであり、問​​題とは関係がなく、機密性が明らかになるため、置き換えました。見せてはいけないデータ!

繰り返しますが、どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

使用:

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

この XPath 式が次の XML ドキュメントに対して評価される場合 (提供された不正な HTML を整形式の XML ドキュメントに変換することによって取得されます):

<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 に答える