3

<br/>ブレークラインで分割された一連の行を抽出できるように、特定の HTML 文字列を解析しようとしています。入力 HTML は次のようになります。

<div class="PlainText">
  DATE: 2013-10-28 20:00:43 -0500 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  <br/> //Notice this has two break lines, i would like to stop after seeing two consecutive break lines.
</div>

この div をより大きな html ドキュメントで使用すると、HTML ChildNodes

List<HtmlNode> nodes = htmlDoc.DocumentNode
                                    .Descendants("div")
                                    .Where(x => x.Attributes.Contains("class") &&
                                            x.Attributes["class"].Value.Contains("PlainText")).ToList();

ここからどこへ行けばよいか完全にはわかりません。2 つのブレークラインが表示されて停止するまで、すべてのテキストを読みたいと思います。

編集

nodesVisual Studio ランタイム インスペクターでchildNodes を調べたところ、実際には 2 つの連続する行では<br/>なく、1 つの改行と、#textその innerHTMl が\n改行文字であるタグがあることに気付きました。

ここに画像の説明を入力

4

2 に答える 2

0

このようなものが動作するはずです

[Test]
public void Test()
{
    var x = ReadTillTwoBr(GetDivClass()).ToList();
}

public HtmlNode GetDivClass()
{
    var html = @"<html><div class=""PlainText"">
            DATE: 2013-10-28 20:00:43 -0500 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            <br   /> //Notice this has two break lines, i would like to stop after seeing two consecutive break lines.
            Item 3
        </div></html>";
    var doc = new HtmlDocument();
    doc.LoadHtml(html);

    return doc.DocumentNode
                .Descendants("div").First(x => x.Attributes.Contains("class") &&
                                                x.Attributes["class"].Value.Contains("PlainText"));

}

public IEnumerable<string> ReadTillTwoBr(HtmlNode node)
{
    var nonEmptyNodes =
        node.ChildNodes.Except(node.ChildNodes.Where(f => f.Name == "#text" && String.IsNullOrWhiteSpace(f.InnerHtml)))
            .ToList();

    foreach (var n in nonEmptyNodes)
    {
        if (IsBr(n) && IsBr(n.NextSibling))
        {
            yield break;
        }

        if (n.Name == "#text")
        {
            yield return n.InnerText.Trim();
        }
    }
}

public bool IsBr(HtmlNode n)
{
    return n != null && n.NodeType == HtmlNodeType.Element && n.Name == "br";
}

どちらが返されますか

ここに画像の説明を入力

2 つの br の後にコメントが返されなかったことに注意してください。

編集:

#text最後の 2 つのbrタグの間に改行があると、実際には改行のあるタグが取得されるため、空の値を削除しまし#textた。これが改行の混乱の原因だと思います。

于 2013-10-31T15:39:45.390 に答える