2016-07-06 4 views
2

Для этого конкретного примера я обрабатываю теги input, выполняя некоторые работы и заменяя их пользовательскими тегами. Выход <customTag>..</customTag>Как создать самозакрывающиеся теги с помощью AngleSharp

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" /> 

ответ

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" /> 

Глядя на источник, вы увидите, что там 2 места, где вы можете работать некоторые вещи, чтобы достичь такого вещь.

  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.

Смежные вопросы