2

我需要解析这样的 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>

它关闭 Header 中的 Table 标签,并隐藏 Footer 中的 Table 标签。有没有办法让这些标签保持打开状态?我试图搜索有关 LoadHtml 方法逻辑的文档,但没有找到任何东西。我想我需要玩Options。

你能帮助我吗?

4

3 回答 3

2

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

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

在这种情况下,您指示库将 TABLE 视为重叠标记。作为旁注,FORM 是唯一默认定义为重叠标签的标签(请参阅此处的原因:HtmlAgilityPack -- <form> 是否出于某种原因关闭自身?)。

然而,这并不是免费的午餐……

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

于 2013-02-25T06:57:43.027 回答
0

HtmlAgilityPack 解析 HTML。这是完全损坏的 HTML,因此需要最好的猜测。浏览器也不会好过。例如,Firefox 将其翻译为:

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

通过使用损坏的 HTML,您将自己开放给特定于实现的未定义行为。修复您的 HTML 并恢复对世界的感知。

于 2013-02-24T14:57:01.723 回答
0

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

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

正是.Replace('[','<').Replace(']', '>')您阅读的内容,您应该一切顺利。

关于 System.Xml.Linq.XDocument 类的意大利语 MSDN 页面在这里

于 2013-02-25T07:58:09.037 回答