XPath / HtmlAgilityPack:属性(href)の特定の値を持つ要素(a)を見つけて、隣接する表の列を見つける方法は?

c# html html-agility-pack visual-studio xpath

質問

私は質問に述べたことを達成する方法を理解することができないので、私はかなり切迫しています。私はすでに似たような例を何度も読んだことがありますが、正確な状況で動作するものは見つかりませんでした。だから、私は次のコードを持っているとしましょう:

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

今、私がすでに持っているものは、url-aの一部です。私は基本的にID Aとimg Aを得る方法を知りたがっています。私はXPathでその行を "見つけようとしていますが、それを動作させる方法はありません。また、情報がまったく存在しない可能性もあります。これは私の最新の試みです(真剣に、私は3時間以上これを数多くの方法で試しています)。

if (htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]") != null)
    string ida = htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]/following-sibling::a").InnerText;

まあ、それは明らかに地獄のように間違っているので、もし誰かが私をここで助けてくれるなら、私はとても喜んでいます。また、誰かが私にXPathと表記法/構文をこのような例を使って詳細に説明するいくつかのウェブサイトを指すことができれば、それを感謝します。本も大歓迎です。

PS:RegexやC#の単純なStreamReaderを使ってXPathなしでも目標を達成でき、各行に必要なものが含まれているかどうかを調べることができますが、a)コードが突然の改行b)私は本当にこのプロジェクトでやっていることについてXPathに完全に固執し続けることを望みます。

あなたの助けを前もってありがとう!

受け入れられた回答

次のXPath式を使用します

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

提供された(不正な形で修正された)XML文書に対して評価すると、

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

所望のテキストノードが選択される

id A

同様に、このXPath式は次のとおりです。

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[2]
                     /a/text()

同じXML文書(上記)に対して評価されるとき、他の必要なテキストノードを選択します

img A

XSLTベースの検証

この変換がXML文書 (上記)に適用されると、次のようになります

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

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()"/>

  <xsl:text>&#10;</xsl:text>
  <xsl:copy-of select=
   "/*/tr/td[a[@href='url-a']]
                /following-sibling::td[2]
                     /a/text()"/>
 </xsl:template>
</xsl:stylesheet>

必要な結果が生成されます。

id A
img A

人気のある回答

一致しないtdタグを閉じることで、真剣に壊れたHTMLがあります。それらを修正してください。これはちょうどこのマークアップの醜い絵です。

これはうまくいけばHtmlのAgility Packはあなたがそれに投げるどんな駄目も処理することができると言われているので、あなたが持っているジャンクを進んで解析し、 href与えられたidimg値を見つける方法はここにあります:

class Program
{
    static void Main()
    {
        var doc = new HtmlDocument();
        doc.Load("test.html");
        var anchor = doc.DocumentNode.SelectSingleNode("//a[contains(@href, 'url-a')]");
        if (anchor != null)
        {
            var id = anchor.ParentNode.SelectSingleNode("following-sibling::td/a");
            if (id != null)
            {
                Console.WriteLine(id.InnerHtml);
                var img = id.ParentNode.SelectSingleNode("following-sibling::td/a");
                if (img != null)
                {
                    Console.WriteLine(img.InnerHtml);
                }
            }
        }
    }
}



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ