7

私はc#を使用しています。私は次の文字列を持っています

<li> 
    <a href="abc">P1</a> 
    <ul>
        <li><a href = "bcd">P11</a></li>
        <li><a href = "bcd">P12</a></li>
        <li><a href = "bcd">P13</a></li>
        <li><a href = "bcd">P14</a></li>
    </ul>
</li>
<li> 
    <a href="abc">P2</a> 
    <ul>
        <li><a href = "bcd">P21</a></li>
        <li><a href = "bcd">P22</a></li>
        <li><a href = "bcd">P23</a></li>
    </ul>
</li>
<li> 
    <a href="abc">P3</a> 
    <ul>
        <li><a href = "bcd">P31</a></li>
        <li><a href = "bcd">P32</a></li>
        <li><a href = "bcd">P33</a></li>
        <li><a href = "bcd">P34</a></li>
    </ul>
</li>
<li> 
    <a href="abc">P4</a> 
    <ul>
        <li><a href = "bcd">P41</a></li>
        <li><a href = "bcd">P42</a></li>
    </ul>
</li>

私の目的は、上記の文字列から次のリストを埋めることです。

List<class1>

class1には2つのプロパティがあります。

string parent;
List<string> children;

親のP1と子のP11、P12、P13、P14を埋め、それらのリストを作成する必要があります。

どんな提案も役に立ちます。

編集

サンプル

public List<class1> getElements()
{
    List<class1> temp = new List<class1>();
    foreach(// <a> element in string)
    {
        //in the recursive loop
        List<string> str = new List<string>();
        str.add("P11");
        str.add("P12");
        str.add("P13");
        str.add("P14");

        class1 obj = new class1("P1",str);
        temp.add(obj);
    }
    return temp;
}

ここでは値がハードコーディングされていますが、動的になります。

4

3 に答える 3

4

必要なのは、再帰降下パーサーです。ライブラリを使用する他のすべての提案は、基本的に、他の人が作成した HTML または XML に対して再帰降下パーサーを使用することを提案しています。

再帰降下パーサーの基本的な構造は、トークンのリスト (この場合は文字列) の線形検索を実行し、サブエンティティを区切るトークンに遭遇すると、パーサーを再度呼び出してトークンのサブリスト (部分文字列) を処理することです。

「再帰降下パーサー」という用語をグーグルで検索すると、多くの有用な結果が見つかります。ウィキペディアの記事でさえ、この場合はかなり優れており、C での再帰降下パーサーの例が含まれています。

于 2012-11-30T14:05:03.000 に答える
3

私の推奨するようなサードパーティのツールを使用できない場合は、クラスとクラスをHtml Agility Pack使用し て HTML を解析できます。WebbrowserHtmlDocument

WebBrowser wbc = new WebBrowser();
wbc.DocumentText = "foo"; // necessary to create the document
HtmlDocument doc = wbc.Document.OpenNew(true);
doc.Write((string)html); // insert your html-string here
List<class1> elements = wbc.Document.GetElementsByTagName("li").Cast<HtmlElement>()
    .Where(li => li.Children.Count == 2)
    .Select(outerLi => new class1
    {
        parent = outerLi.FirstChild.InnerText,
        children = outerLi.Children.Cast<HtmlElement>()
            .Last().Children.Cast<HtmlElement>()
            .Select(innerLi => innerLi.FirstChild.InnerText).ToList()
    }).ToList();

デバッガー ウィンドウの結果は次のとおりです。

ここに画像の説明を入力

于 2012-11-30T14:07:08.477 に答える
1

XmlDocumentを使用することもできます。

XmlDocument doc = new XmlDocument();
doc.LoadXml(yourInputString);
XmlNodeList colNodes = xmlSource.SelectNodes("li");
foreach (XmlNode node in colNodes)
{
    // ... your logic here
    // for example
    // string parentName = node.SelectSingleNode("a").InnerText;
    // string parentHref = node.SelectSingleNode("a").Attribures["href"].Value;
    // XmlNodeList children = 
    //       node.SelectSingleNode("ul").SelectNodes("li");
    // foreach (XmlNode child in children)
    // {
    //         ......
    // }
}
于 2012-11-30T14:27:16.030 に答える