Как избежать System.Xml.Linq.XElement экранирования HTML-контента? - PullRequest
5 голосов
/ 10 апреля 2011

Я использую объект XElement для создания некоторого HTML-кода в коде на странице ASP.NET.

Я могу или не могу добавить некоторые XAttributes к этому XElement, как я иду, следующим образом:

var elmnt = new XElement("div",
     new XAttribute("id", "myDiv"),
     );

Теперь, если я хочу добавить некоторый контент в myDiv , который содержит HTML, XElement автоматически избегает этого, что в моей ситуации нежелательно.

Так что, если у меня есть:

var elmnt = new XElement("div",
     new XAttribute("id", "myDiv"),
     "<span id='content'>hello world</span>"
     );

А затем я рендерил это в объект Placeholder с помощью следующего кода:

myPlaceholder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = elmnt.CreateNavigator().OuterXml });

Когда страница загружается, источник обнаруживает, что внутреннее содержимое внутри elmnt было экранировано и имеет следующий формат в источнике страницы:

&lt;span id='content'&gt;hello world&lt;/span&gt;

Учитывая, что XML-код, который я здесь компилирую, является действительным HTML, а внутреннее содержимое - также допустимым HTML, как я могу сказать родительскому объекту XElement , а не экранировать внутреннее содержимое? Как я могу оставить его в своем родном формате?

Ответы [ 4 ]

8 голосов
/ 20 июля 2013
 var elmnt = new XElement("div",
   new XAttribute("id", "myDiv"),
   new XRaw("<span id='content'>hello world</span>")
 );


public class XRaw : XText
{
  public XRaw(string text):base(text){}
  public XRaw(XText text): base(text){}

  public override void WriteTo(System.Xml.XmlWriter writer)
  {
    writer.WriteRaw(this.Value);
  }
}
0 голосов
/ 10 апреля 2011

Если вы рассматриваете HTML как XML, то при добавлении к нему вы должны добавить XML

Таким образом, вы создадите новый xmlelement (span), добавите атрибут (для идентификатора атрибута, значения value) и затем установите его содержимое в «hello world». Возьмите этот элемент и добавьте его к дереву в нужном месте.

Все это, кажется, направляется в неправильном направлении для меня. Если вы хотите иметь возможность иметь «динамический» контент в коде, я бы предложил: добавить элемент управления asp:label или aps:placeholder на страницу, а затем установить содержимое этого элемента управления в HTML в коде позади. Это стандартный способ добавления динамического контента.

0 голосов
/ 21 апреля 2011

Я решил эту проблему с помощью пакета HtmlAgilitypack для преобразования строки HTML в иерархический объект.

Затем я перебрал каждый элемент HTML в этом объекте и создал для каждого вложенный элемент XElement.

Есть небольшая проверка, которую необходимо выполнить для каждого элемента, но он отлично работает и содержит меньше строк кода, чем я ожидал, когда начал его создавать.

0 голосов
/ 10 апреля 2011

Почему бы вам не использовать HtmlTextWriter?

StringWriter stringWriter = new StringWriter();

HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Span);
htmlWriter.AddAttribute(HtmlTextWriterAttribute.Id, "content");
htmlWriter.Write("hello world");
htmlWriter.RenderEndTag();

htmlWriter.Flush();

stringWriter.ToString(); //<span id='content'>hello world</span>
...