2017-01-06 8 views
0

の後ろにテーブルを取得します。右私は右の要素の後ろに配置されたテーブルを取得したい要素

<body> 
    <h3>test</h3> 
    <table> 
     <tr><td>abc</td></tr> 
    </table> 

    <h3>test2</h3> 
    <table> 
     <tr><td>def</td></tr> 
    </table> 
    [...] 
</body> 

だから私は、H3要素「テスト」(またはコンテンツの後にテーブルを取得したいです私はこの種のものをする方法を知っています)。 テーブル "test"は必ずしも最初ではなく、秒テーブルの後のどこかにある可能性があります。


[編集]

このコードなぜあなたは知っていますか:私は "/ H3" と "テーブル" の後に復帰を削除する場合

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); //your test html 
var s = doc.DocumentNode.Descendants("table").Where(_ => _.PreviousSibling.PreviousSibling.Name.Equals("h3") && _.PreviousSibling.PreviousSibling.InnerText.Equals("test")); 
foreach (var st in s) 
{ 
    Debug.WriteLine(st.InnerHtml); 
} 

が動作しませんか?

それは次のようになります。これは、XPathのために何かのように聞こえる

string html = @"<body><h3>test</h3><table><tr><td>abc</td></tr></table><h3>test2</h3><table><tr><td>def</td></tr></table></body>" 

代わりに上記のHTMLコードが、結果がnullである...

答えて

0

これを試すことができます。私はLinqがもっと便利だと思う。それをさらに展開したり、ここに問題を投稿することができれば、それを解決することができます。 申し訳ありません私はIDEを持っていませんでした。

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); //your test html 
doc.DocumentNode.Descendants("table").Where(_ => _.PreviousSibling.PreviousSibling.Name.Equals("h3")); 

Btw、私はpreviousSiblingを2回呼び出す必要がある理由は、各ノード間に常に1 #text要素があることです。

+0

しかし、h3(テスト)のテキストを検索するにはどうすればよいですか?私は2つのh3を持っているので –

+0

これは何か? 'doc.DocumentNode。( "test")); –

+0

ありがとうございました:D(あなたはありがとう:D) –

0

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); //your test html 
var table = doc.DocumentNode.SelectSingleNode("//h3[text()='test']/following::table"); 
return table.InnerHtml; //returns: "\r\n  <tr><td>abc</td></tr>\r\n " 

のXPathから:XPath - Select first element after some other element

EDIT:正確なコードの画像: enter image description here

EDIT 2: 問題は、必ずしもテキスト要素が関与しているとは限りません。したがって、あなたはそれをチェックすることでこれを解決することができます:

var table3 = doc.DocumentNode.Descendants().FirstOrDefault(x => 
      { 
       if (x.NodeType == HtmlAgilityPack.HtmlNodeType.Element) 
       { 
        if (x.PreviousSibling?.NodeType == HtmlAgilityPack.HtmlNodeType.Text) 
        { 
         return x.PreviousSibling.PreviousSibling?.Name == "h3" && x.PreviousSibling.PreviousSibling?.InnerText == "test"; 
        } else 
        { 
         return x.PreviousSibling?.Name == "h3" && x.PreviousSibling?.InnerText == "test"; 
        } 
       } 
       return false; 
      }); 
+0

Ok、thx。私はそれを試してみます –

+0

私のために残念なことに動作しません。私はforeachループを開いてtable.InnerHtmlにアクセスできるようにする必要があります(テーブルはarreyですが、これについてはわかりませんが)。 –

+0

しかし、それでもnullを返す –

関連する問題