HtmlAgilityPack - 完全按输入保留标记

时间:2013-08-14 19:55:23

标签: asp.net string html-agility-pack

有没有办法设置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的子字符串,索引,删除等)。

2 个答案:

答案 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