0

有没有办法将 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标记添加到ItemTemplatetrAltItemTemplate. 稍后在处理过程中,<ItemTemplate></ItemTemplate>删除了 the 和alternate 标签,这将产生有效的 html。当 HtmlAgilityPack 加载它时,它不会产生有效的 html。

我可以并且已经通过字符串操作成功地解析了这个,但是,我认为如果我可以使用 HtmlAgilityPack,那么它会更高效,更容易使用。

任何人都知道我是否可以使用 HtmlAgilityPack 来做到这一点?或者我是否应该坚持使用字符串操作(.NET 的子字符串、indexof、remove 等)。

4

2 回答 2

1

简短的回答是否定的。如果您需要将内容作为 DOM 进行操作,则必须正确嵌套 HTML。

但是,如果您可以将所有 TR 内容作为纯文本(而不是 DOM)来处理,那么您可以在处理开始时添加以下内容:

ElementsFlags.Add("tr", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);

但是,如果您这样做,TR 标记之间的所有内容都将被视为文本数据,而不是 DOM 树,例如,您将无法对子 DIV 节点执行 XPATH 查询。

于 2013-08-15T05:35:49.937 回答
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
于 2014-03-28T23:27:14.073 回答