有没有办法设置HtmlAgilityPack以完全按照输入的方式保留标记?我的问题是我允许用户在他们的网站上设置数据输出的html布局。他们使用的格式类似于ASP.NET的转发器控件。
采用以下示例:
<table>
<ItemTemplate>
<tr>
<td>
<div>Item Markup</div>
</td>
</ItemTemplate>
<AltItemTemplate>
<td>
<div>Alternate Item Markup</div>
</td>
</tr>
</AltItemTemplate>
</table>
当我将其加载到HtmlAgilityPack时,它会将结束tr
标记添加到ItemTemplate
,并从tr
中删除实际的结束AltItemTemplate
标记。稍后在处理过程中,<ItemTemplate></ItemTemplate>
和备用标记将被删除,这将导致有效的html。当HtmlAgilityPack加载它时,它不会产生有效的html。
我可以并且已经通过字符串操作成功解析了这个,但是,我想如果我可以使用HtmlAgilityPack那么它将更有效,更容易使用。
任何人都知道我是否可以使用HtmlAgilityPack来执行此操作?或者我应该坚持使用字符串操作(.NET的子字符串,索引,删除等)。
答案 0 :(得分:1)
简短的回答是否定的。如果您需要将内容操作为DOM,则必须正确嵌套HTML。
但是,如果您可以将所有TR内容作为纯文本(而不是DOM)使用,那么您可以在处理开始时添加它:
ElementsFlags.Add("tr", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
但是,如果这样做,TR标记之间的所有内容都将被视为文本数据,而不是DOM树,因此,例如,您将无法在子DIV节点上执行XPATH查询。
答案 1 :(得分:0)
告诉HTMLAgilityPack不要尝试修复标签关闭器,你需要从元素标志中删除标签:
dim hp as HtmlDocument
hp.LoadHTML(htmlcode)
hp.DocumentNode.ElementsFlags.Remove("tr")
现在检查hp.DocumentNode,你会看到HTMLAgilityPack没有尝试修复标签关闭器
Dim dnode As HtmlAgilityPack.HtmlNode = hp.DocumentNode
dim tosee as strin = dnode.OuterHTML