7

很奇怪!当我加载和更换使用空字符串

 var document = new HtmlDocument();
    document.LoadHtml(data); 
    document.DocumentNode.OuterHtml.Replace("<tbody>", "");

这工作正常,<tbody>将被删除。

当我尝试<br><br/>using 替换时,同样的方式,

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

4 回答 4

11
document.OptionWriteEmptyNodes = true;

将为您解决问题!

于 2013-09-02T11:49:52.230 回答
7

您不必手动替换<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 />
于 2013-09-02T10:36:28.397 回答
2
StringWriter writer = new StringWriter();
var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings() { OmitXmlDeclaration = true });
document.OptionOutputAsXml = true;

document.Save(xmlWriter);
var newHtml = writer.ToString();
于 2013-09-02T10:21:27.263 回答
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;
于 2013-09-02T09:57:35.810 回答