如何使用AngleSharp生成自关闭标签

本文关键字:关闭标签 何使用 AngleSharp | 更新日期: 2023-09-27 17:55:06

对于这个特定的例子,我正在处理input标记做一些工作,并用自定义标记替换它们。输出为<customTag>..</customTag>

var parser = new HtmlParser();
var html = parser.parse(htmlSnippet);
var inputs= originalHtml.QuerySelectorAll("input");
foreach (var element in inputs)
{
  var newElement = html.CreateElement("customTag");
  // do some work.
  element.Replace(newElement);
}
return html.Body.InnerHtml();

是否可以用AngleSharp"产生"自闭标签?

<customTag attr="x" /> 

如何使用AngleSharp生成自关闭标签

用法:

var document = new HtmlParser().Parse("");
var tag = document.CreateElement("customTag");
tag.SetAttribute("attr", "x");
tag.AsSelfClosing();
Console.WriteLine(tag.OuterHtml);
tag.ToHtml(Console.Out, CustomHtmlMarkupFormatter.Instance);
输出:

<customtag attr="x">
<customtag attr="x" />

查看源代码,你会发现有两个地方你可以工作一些东西来实现这样的事情。

  1. readonly NodeFlags Node._flags:请记住,这个字段,它的属性和主机类都不公开。所以你需要一些肮脏的手段来得到这份工作。此外,默认格式化程序HtmlMarkupFormatter只使用>,而不使用/>
  2. 创建自己的IMarkupFormatter .

这是一个综合了上述两点的解决方案。

public static class ElementExtensions
{
    public static void AsSelfClosing(this IElement element)
    {
        const int SelfClosing = 0x1;
        var type = typeof(IElement).Assembly.GetType("AngleSharp.Dom.Node");
        var field = type.GetField("_flags", BindingFlags.Instance | BindingFlags.NonPublic);
        var flags = (uint)field.GetValue(element);
        flags |= SelfClosing;
        field.SetValue(element, Enum.ToObject(field.FieldType, flags));
    }
}
public class CustomHtmlMarkupFormatter : IMarkupFormatter
{
    public static readonly CustomHtmlMarkupFormatter Instance = new CustomHtmlMarkupFormatter();
    public string Text(String text) => HtmlMarkupFormatter.Instance.Text(text);
    public string Comment(IComment comment) => HtmlMarkupFormatter.Instance.Comment(comment);
    public string Processing(IProcessingInstruction processing) => HtmlMarkupFormatter.Instance.Processing(processing);
    public string Doctype(IDocumentType doctype) => HtmlMarkupFormatter.Instance.Doctype(doctype);
    //public string OpenTag(IElement element, Boolean selfClosing) => HtmlMarkupFormatter.Instance.OpenTag(element, selfClosing);
    public string CloseTag(IElement element, Boolean selfClosing) => HtmlMarkupFormatter.Instance.CloseTag(element, selfClosing);
    public string Attribute(IAttr attribute) => HtmlMarkupFormatter.Instance.Attribute(attribute);
    public string OpenTag(IElement element, Boolean selfClosing)
    {
        var temp = new StringBuilder();
        temp.Append('<');
        if (!String.IsNullOrEmpty(element.Prefix))
        {
            temp.Append(element.Prefix).Append(':');
        }
        temp.Append(element.LocalName);
        foreach (var attribute in element.Attributes)
        {
            temp.Append(" ").Append(Instance.Attribute(attribute));
        }
        temp.Append(selfClosing ? " />" : ">");
        return temp.ToString();
    }
}

您还可以删除ElementExtensions并添加您自己的逻辑,用于何时自关闭CustomHtmlMarkupFormatter.OpenTag中的元素