如何使用HtmlAgilityPack用<br/>标签替换<br/>标签?

时间:2013-09-02 09:53:01

标签: c# html-agility-pack

很奇怪! 当我加载&amp;使用

替换为空字符串
 var document = new HtmlDocument();
    document.LoadHtml(data); 
    document.DocumentNode.OuterHtml.Replace("<tbody>", "");

这很好用&amp; <tbody>将被删除。

当我尝试使用<br>替换<br/>

时,同样如此
document.DocumentNode.OuterHtml.Replace("<br>", "<br/>");

不起作用:(

也尝试了,

 var brTags = document.DocumentNode.SelectNodes("//br");
            if (brTags != null)
            {
                foreach (HtmlNode brTag in brTags)
                {
                    brTag.OuterHtml = "<br/>";
                    // brTag.Name= "br/"; - > Also this one :(
                }
            }

HTMLAgilityPack的replace()函数不适用于自闭标记吗?

4 个答案:

答案 0 :(得分:10)

document.OptionWriteEmptyNodes = true;

为你做诀窍!

答案 1 :(得分:5)

您不必手动将<br>替换为<br/>,如果您需要关闭节点,只需指示库执行此操作,例如:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("<br/>");
doc.Save(Console.Out);

将输出:

<br>

和这个

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("<br/>");
doc.OptionWriteEmptyNodes = true;
doc.Save(Console.Out);

将输出:

<br />

答案 2 :(得分:2)

StringWriter writer = new StringWriter();
var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings() { OmitXmlDeclaration = true });
document.OptionOutputAsXml = true;

document.Save(xmlWriter);
var newHtml = writer.ToString();

答案 3 :(得分:1)

实际上,如果您没有将替换结果分配回文档,那么您的第一个查询也不会起作用。字符串在C#中是不可变的。当您Replace创建并返回新字符串时。原始字符串保持不变。

OuterHtml也是只读的。你无法分配它。

要删除节点,您应该选择它们,删除每个节点,并将结果保存到原始字符串。

var document = new HtmlDocument();
document.LoadHtml(data);
foreach (var tbody in document.DocumentNode.SelectNodes("//tbody"))
    tbody.Remove();
data = document.DocumentNode.OuterHtml;

更新:

foreach (var br in document.DocumentNode.SelectNodes("//br"))
    br.RemoveAllChildren();

HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Closed | HtmlElementFlag.Empty;
document.OptionWriteEmptyNodes = true;
data = document.DocumentNode.OuterHtml;