我有以下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次。哪个是对的。在调试中打开它我看到正确的li。但是当它到达选择无序列表(var listItems = unorderedList.SelectNodes("//li");
)内的节点的部分时,它包含17个(!)li,即所有&#34; parent&#34;和&#34;阿姨/叔叔&#34;李也是..
是的,我知道,我可以手动为这段html做,但文档长度为400k行。所以手动不是一个选择。这只是一个有缺陷的提取物。
答案 0 :(得分:0)
想出来。问题在于我的XPath,
显然//li
会返回所有<li>
个节点,即使您在子节点上调用它们也是如此。解决方案是使用.//li
。点指的是当前节点,您在其上搜索所有li节点。