将html解析为某种wiki表示法

时间:2015-12-14 10:14:18

标签: c# parsing xpath xml-parsing html-parsing

我有以下HTML:

<ul>
    <li>
        Compacte energiebesparende COB LED-projector!</li>
    <li>
        GEEN aparte LED's: voorzien van een 100 W 2<sup>e</sup> generatie COB LED die perfect mengen van de kleuren verzekert en eruit ziet als een traditionele lamp!</li>
    <li>
        Twee verschillende hoeken voor de bundel:
        <ul>
            <li>
                70° breedhoek: perfect voor washing op korte afstand</li>
            <li>
                15° (geleverde lens): voor scherpe en goed gerichte bundelprojectie!</li>
        </ul>
    </li>
    <li>
        IR-afstandsbediening inbegrepen: geen moeilijke sturingen nodig. Perfect voor DJ's!</li>
    <li>
        Verschillende bedrijfsstanden:
        <ul>
            <li>
                Stand-alone met IR-afstandsbediening: automatisch/op de maat gesynchroniseerde kleurpatronen.</li>
            <li>
                Master/slave stand: er kunnen verschillende projectoren tegelijk worden gebruikt voor fantastische geprogrammeerde, met de muziek gesynchroniseerde lichtshows.</li>
            <li>
                DMX-gestuurd: verschillende kanaalstanden met programmakeuze en individuele RGB-regeling.</li>
        </ul>
    </li>
    <li>
        Kan worden gebruikt met de populaire &nbsp;JB Systems LEDCON-02 Mk2 easy controller!</li>
    <li>
        Perfect voor mobiele toepassingen: zeer klein en een zeer laag stroomverbruik</li>
    <li>
        Neutrik<sup>®</sup> PowerCON<sup>®</sup> in-/uitgang met 16 A capaciteit voor het doorkoppelen van de stroom, voor gebruik met onze POWERCON/XLR COMBINATIEKABELS!</li>
    <li>
        Er zijn vele toepassingen mogelijk: Discotheken, DJ's, verhuurbedrijven, ...</li>
    <li>
        0-100% dimmen en ultrasnelle stroboscoopfunctie (geen extra stroboscopen nodig!)</li>
    <li>
        2x8-cijferig LED-scherm voor gemakkelijke navigatie van het menu</li>
    <li>
        Dubbele beugel: gemakkelijk om als vloerspot te gebruiken!</li>
</ul>

必须将其解析为以下内容:

- Compacte energiebesparende COB LED-projector!
-GEEN aparte LED's: voorzien van een 100 W 2e generatie COB LED die perfect mengen van de kleuren verzekert en eruit ziet als een traditionele lamp!
- Twee verschillende hoeken voor de bundel:
-- 70° breedhoek: perfect voor washing op korte afstand
-- 15° (geleverde lens): voor scherpe en goed gerichte bundelprojectie!

所以我用C#编写了这个:

            var unorderedLists = rootnode.SelectNodes("//ul//ul");
            if (unorderedLists != null)
            {
                foreach (HtmlNode unorderedList in unorderedLists)
                {
                    string html = "";
                    unorderedList.InnerHtml = unorderedList.InnerHtml.Trim();
                    unorderedList.InnerHtml = unorderedList.InnerHtml.Replace("\n", "");
                    var listItems = unorderedList.SelectNodes("//li");
                    if (listItems != null)
                    {
                        foreach (HtmlNode listItem in listItems)
                        {
                            listItem.InnerHtml = listItem.InnerHtml.Trim();
                            listItem.InnerHtml = "-- " + listItem.InnerHtml + "\n";
                            html += listItem.InnerHtml;
                        }
                    }
                    unorderedList.InnerHtml = html;
                }
            }
            unorderedLists = rootnode.SelectNodes("//ul");
            if (unorderedLists != null)
            {
                foreach (HtmlNode unorderedList in unorderedLists)
                {
                    string html = "";
                    unorderedList.InnerHtml = unorderedList.InnerHtml.Trim();
                    unorderedList.InnerHtml = unorderedList.InnerHtml.Replace("\n", "");
                    var listItems = unorderedList.SelectNodes("//li");
                    if (listItems != null)
                    {
                        foreach (HtmlNode listItem in listItems)
                        {
                            listItem.InnerHtml = listItem.InnerHtml.Trim();
                            listItem.InnerHtml = "-- " + listItem.InnerHtml + "\n";
                            html += listItem.InnerHtml;
                        }
                    }
                    unorderedList.InnerHtml = html;
                }
            }

基本上首先找到ul中的所有ul,删除标记并为其添加正确的符号。但我得到这样的输出:

-- -- -- Compacte energiebesparende COB LED-projector!
-- -- -- GEEN aparte LED's: voorzien van een 100 W 2e generatie COB LED die perfect mengen van de kleuren verzekert en eruit ziet als een traditionele lamp!
-- -- -- Twee verschillende hoeken voor de bundel:                      70° breedhoek: perfect voor washing op korte afstand                            15° (geleverde lens): voor scherpe en goed gerichte bundelprojectie!
-- 70° breedhoek: perfect voor washing op korte afstand
-- 15° (geleverde lens): voor scherpe en goed gerichte bun

调试后我注意到第一部分正常工作,选择嵌套的ul后我得到了2次。哪个是对的。在调试中打开它我看到正确的li。但是当它到达选择无序列表(var listItems = unorderedList.SelectNodes("//li");)内的节点的部分时,它包含17个(!)li,即所有&#34; parent&#34;和&#34;阿姨/叔叔&#34;李也是..

是的,我知道,我可以手动为这段html做,但文档长度为400k行。所以手动不是一个选择。这只是一个有缺陷的提取物。

1 个答案:

答案 0 :(得分:0)

想出来。问题在于我的XPath,

显然//li会返回所有<li>个节点,即使您在子节点上调用它们也是如此。解决方案是使用.//li。点指的是当前节点,您在其上搜索所有li节点。

相关问题