как заменить тег тегом с помощью HtmlAgilityPack?

довольно странно! Когда я загружаю и заменяю С пустой строкой, используя

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

это прекрасно работает & <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 () не работает для самозакрывающихся тегов?

4 ответов


document.OptionWriteEmptyNodes = true;

сделает трюк для вас!


вам не нужно заменять <br> by <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 />

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

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

на самом деле ваш первый запрос также не должен работать, если вы не назначаете результат замены обратно в документ. Строки неизменяемы в 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;