Преобразование XElement в строку HTML

Я выполняю операции XML с документом XHTML, используя Xml и Linq.

При преобразовании его обратно в строку для вывода в браузер он отображает теги скрипта в исходной предоставленной форме при создании XElement как <script />.

Это препятствует его корректной обработке большинством браузеров на рынке.

Я хотел бы выполнить преобразование XElement в String таким образом, чтобы он выводил тег скрипта, подобный этому <script></script>

Может ли кто-нибудь помочь мне в этом? Заранее спасибо. :)

Первое редактирование Предоставляя дополнительную информацию, данные поступают из поля xml в базе данных MSSQL 2008R2. Он загружается из поля xml как <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js" />

Второе редактирование Рабочий пример

using System;
using System.Linq;
using System.Xml.Linq;

namespace Test1
{
    class Test1
    {
        static void Main(string[] args)
        {
            XElement element = XElement.Parse("<div><script /><script>Test</script></div>");
            var EmptySet = (from e in element.DescendantsAndSelf()
                           where e.IsEmpty
                           select e);
            foreach(XElement e in EmptySet)
            {
                e.Value = String.Empty;
            }
            Console.WriteLine(element.ToString(SaveOptions.None));
        }
    }
}

И его результаты

<div>
  <script></script>
  <script>Test</script>
</div>

person Michael    schedule 29.06.2010    source источник


Ответы (2)


Вы пробовали использовать SaveOptions.DisableFormatting?

На самом деле я не могу воспроизвести проблему, заметьте... какие операции XML вы выполняете? Вы сами создаете элемент script? Это отлично работает:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = XElement.Parse("<script></script>");
        // Both of these write <script></script>
        Console.WriteLine(element.ToString(SaveOptions.None));
        Console.WriteLine(element.ToString(SaveOptions.DisableFormatting));
    }
}

(XDocument.Save и XElement.Save имеют одинаковые параметры.)

РЕДАКТИРОВАТЬ: Чтобы изменить элемент без дочерних узлов на элемент с одним пустым текстовым узлом, вы можете просто установить element.Value в "". Например:

XElement element = XElement.Parse("<script />");
Console.WriteLine(element.ToString()); // Prints <script />
element.Value = "";
Console.WriteLine(element.ToString()); // Prints <script></script>
person Jon Skeet    schedule 29.06.2010
comment
К сожалению, xml поступает из базы данных, поэтому он поступает из базы данных как ‹script /› Когда я помещаю это в ваш пример Parse, он выводит ‹script /›. - person Michael; 29.06.2010
comment
@Michael: Так что дело не в том, что он преобразует тег скрипта в <script />, а в том, что он точно форматирует XML из базы данных. - person Jon Skeet; 29.06.2010
comment
Спасибо за это, я отметил вас как ответ. В качестве быстрого вопроса: если тег script был глубоким потомком XElement, а не родительским, каков самый простой способ поиска XElements, чтобы изменить все пустые элементы на пустую строку в соответствии с вашим примером. - person Michael; 29.06.2010
comment
@Michael: Что-то вроде doc.Descendants().Where(x => x.Value == "") должно работать. Вы можете захотеть материализовать запрос (преобразовать его в список) перед изменением элементов. Обратите внимание, что выбор свойства Value возвращает вместо null, даже если дочерних элементов нет, насколько я видел. - person Jon Skeet; 29.06.2010
comment
Спасибо за вашу помощь, Джон. :) Я обнаружил, что тестирование IsEmpty возвращает значение независимо от того, пусто оно или нет, поэтому я внес в него поправку и заставил его работать так, как я хотел. - person Michael; 29.06.2010
comment
@Michael: Упс, я не заметил IsEmpty. Лично я бы не стал использовать здесь выражение запроса: var emptySet = element.DescendantsAndSelf().Where(e => e.IsEmpty).ToList(); - person Jon Skeet; 29.06.2010

С использованием

XElement.Save(XmlWriter writer)

где в качестве вывода XmlWriter вы используете StringWriter, это быстрый и надежный способ получить то, что вы хотите.

person Dewfy    schedule 29.06.2010