将html解析为某种wiki表示法
本文关键字:wiki 表示 html | 更新日期: 2023-09-27 18:26:44
我有以下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 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。这是正确的。在调试中打开它们,我看到了正确的李。但是,当它到达在无序列表(var listItems = unorderedList.SelectNodes("//li");
)中选择节点的部分时,它包含17(!)个李,即所有的"父"answers"阿姨/叔叔"李。。
是的,我知道,我可以为这段html手动完成,但文档有400k行长。因此,手动不是一种选择。这只是一个有缺陷的摘录。
想明白了。问题出在我的XPath,上
显然,//li
返回所有<li>
节点,即使您在子节点上调用它也是如此。解决方案是使用.//li
。点指的是当前节点,在该节点上搜索所有li节点。