对于这个具体示例,我正在处理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" />
答案 0 :(得分:1)
用法:
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" />
查看来源,您会发现有两个地方可以帮助您完成这些工作。
readonly NodeFlags Node._flags
:请记住,此字段,其属性和主机类都未公开。因此,你需要一些肮脏的黑客来获得这份工作。此外,默认格式化程序HtmlMarkupFormatter
仅使用>
,而不是/>
。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
中的元素。