0

この XPath 式を linq に書き直しましたが、何か問題があります (要素が見つかりません)。私のHTML:

string xml = @"
<root>
   <div id=""main"">
      <div class=""content"">
         <ul>
            something
         </ul>
      </div>
      <div class=""content"">
         <ul>
            something
         </ul>
      </div>
      <div class=""content"">
         <ul>
            <li>
               <div>My text</div>
            </li>
         </ul>
      </div>
   </div>
</root>
";

Xpath:

//div[@id="main"]//div[@class="content"]/ul/li/div

リンク:

string Content =
            doc.DocumentNode.Descendants("div").First(x => x.GetAttributeValue("id", null) == "main")
                .Descendants("div").First(x => x.GetAttributeValue("class", null) == "content")
                .Descendants("ul").First()
                .Descendants("li").First()
                .Descendants("div").First().InnerText

背景: ポータブル ライブラリを使用しているため、LINQ を使用する必要があります。

私はすでに少し異なる表現で私の問題を解決しました:

string Content =
            doc.DocumentNode.Descendants("div").First(x => x.GetAttributeValue("id", null) == "main")
                .Descendants("div").Where(x => x.GetAttributeValue("class", null) == "content").ElementAt(2)
                .Descendants("ul").First()
                .Descendants("li").First()
                .Descendants("div").First().InnerText;

動作しますが、Xpath と同じではありません。

だから私はあなたに尋ねています:正確な場所を指定せずに(Xpathのように)InnerTextでNodeを見つけるLINQ式は存在しますか?

4

2 に答える 2

0

これはあなたが望んでいることだと思います...ドキュメントの最初の一致を期待していて、すべての一致が正しいわけではありませんか?

string Content =
    doc.DocumentNode.Descendants("div").Where(x => x.GetAttributeValue("id", null) == "main")
        .Descendants("div").Where(x => x.GetAttributeValue("class", null) == "content")
        .Elements("ul")
        .Elements("li")
        .Elements("div").First().Value;

一般に...

XPath '//' -> LINQ .Descendants に変換されます

XPath '/' -> LINQ .Elements に変換

于 2013-10-30T00:11:52.260 に答える