【问题标题】:HtmlAgilityPack - Leave markup exactly as inputtedHtmlAgilityPack - 完全按照输入的方式保留标记
【发布时间】:2014-03-29 07:27:14
【问题描述】:

有没有办法将 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 并从 AltItemTemplate 中删除实际关闭 tr 标记。在处理的后期,&lt;ItemTemplate&gt;&lt;/ItemTemplate&gt; 和备用标签被删除,这将产生有效的 html。当 HtmlAgilityPack 加载它时,它不会生成有效的 html。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我需要访问子元素。我决定坚持使用 .NET 的内置字符串方法进行手动解析。感谢您的信息!
    【解决方案2】:

    要告诉 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      相关资源
      最近更新 更多