HTMLAgilityPack使用我自己的标签

时间:2014-06-26 13:33:45

标签: c# html-agility-pack

我需要解析几个html元素,使用html agility pack列出并从文档中删除它们。我写了以下代码:

HtmlDocument doc = new HtmlDocument();
doc.Load(tempFileHTML);
doc.OptionSupportOptionalEndTags = true;
doc.OptionWriteEmptyNodes = true;

List<HtmlNode> tagResolver = doc.DocumentNode.Descendants("link").ToList();
for (int i = 0; i < tagResolver.Count; i++)
{
    elements.Add(tagResolver[i].OuterHtml);
    tagResolver[i].Remove();
}

doc.Save(tempFileHTML, Encoding.GetEncoding(HTMLtoPDF.DefaultEncoding));

问题是我的启动html文件如下所示:

<table>
    <LOOP>
        <tr>
            <td>{CODE}</td>
        </tr>
    </LOOP>
</table>

在doc.Save()之后,这个文件看起来像这样:

<table>
    <loop>
    </loop>
        <tr>
            <td>{CODE}</td>
        </tr>
</table>

有没有办法正确保存这份文件?

1 个答案:

答案 0 :(得分:2)

敏捷包中有一些特定的逻辑来强制执行正确的结构。此代码专门针对liultabletr等,因此您可能会遇到此问题。请参阅HtmlDocument.GetResetters方法。使用OptionFixNestedTags关闭doc.OptionFixNestedTags = false,应该绕过这种行为。

您应该从我的头顶使用HtmlNode.ElementsFlags.Add注册您的代码,正确的语法是:

HtmlNode.ElementsFlags.Add("LOOP",  HtmlElementFlag.Empty | HtmlElementFlag.Closed);

通过这种方式,您可以定义您希望HtmlAgilityPack解析标记的方式。

另外:还有一个MixedCodeDocument类,您也可以使用它,这需要您为自己的标记指定一个标记,这样您就可以使用<%loop%>并且它可以为您。您可以在解析之前在文档上指定TokenStartTokenEnd