HTMLAgility Pack可以留下未关闭的标签吗?

时间:2013-02-24 14:48:37

标签: c# html-agility-pack

我需要像这样解析一个HTML字符串:

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

我正在使用Html Agility Pack,我可以找到所有“小部件”:

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

我的问题是当我尝试获取Widget节点的所有子节点时.HTMLAgility会自动关闭所有标签,因此我无法正确检索Header,Item和Footer节点。 Agility生成的输出是:

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

它会关闭标题中的Table标记,并在页脚中隐藏Table标记。有一种方法可以让这些标签不被封闭吗?我试图搜索有关LoadHtml方法逻辑的文档,但我没有找到任何东西。我想我需要玩选项。

你能帮助我吗?

3 个答案:

答案 0 :(得分:1)

Html Agility Pack通常不支持设计重叠标签。但是,您可以像这样调整它:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

在这种情况下,您指示库将TABLE视为重叠标记。作为旁注,FORM是默认情况下唯一定义为重叠标记的TAG(请参阅此处的原因:HtmlAgilityPack -- Does <form> close itself for some reason?)。

但是,这不是免费午餐......

这意味着,库现在将查看表中的内容并将表标记关闭为纯文本元素。所以解析后的表中的所有标签都不会以编程方式访问,你不会在DOM中看到它,你不会使用XPATH等看到它......但这可能足以满足你的需求。

答案 1 :(得分:0)

HtmlAgilityPack解析HTML。这是完全破坏的HTML,所以它需要最好的猜测。浏览器不会更好。例如,Firefox将其翻译为:

<header>
<item> </item>
<footer> </footer>
<table>
<tbody>
<tr>
<td>content</td>
</tr>
</tbody>
</table>
</header>

通过使用损坏的HTML,您可以了解特定于实现的未定义行为。修复您的HTML并恢复世界的感觉。

答案 2 :(得分:0)

您需要从您的值中删除这些<>符号,然后您可以XDocument.Parse()

<widget attribute="1">
    <header>[table]</header>
    <item>[tr][td]content[/td][/tr]</item>
    <footer>[/table]</footer>
</widget>

只要.Replace('[','<').Replace(']', '>')你读到的内容就应该很好。

Italian MSDN page about System.Xml.Linq.XDocument class here

相关问题