将 html 解析为某种维基符号

Parsing html to some kind of wiki notation

我有以下 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 个 ul。哪个是正确的。在调试中打开它们,我看到了正确的 li。但是当它到达它选择无序列表 (var listItems = unorderedList.SelectNodes("//li");) 内的节点的部分时,它包含 17(!) 个 li,即所有 "parent" 和 "aunt/uncle" li。

是的,我知道,我可以为这篇 html 手动完成,但文档有 40 万行。所以手动不是一种选择。这只是一个有问题的摘录。

想通了。问题出在我的 XPath 上,

显然 //li returns 所有 <li> 节点,即使您在子节点上调用它。解决方案是使用.//li。点指的是当前节点,在上面搜索所有li节点。