XML Сериализация HTML - PullRequest
       14

XML Сериализация HTML

5 голосов
/ 02 октября 2009

Хорошо, это сделал! Спасибо всем вам!

public class Result
{
    public String htmlEscaped
    {
        set;
        get;
    }

    [XmlIgnore]
    public String htmlValue
    { set; get; }

    [XmlElement("htmlValue")]
    public XmlCDataSection htmlValueCData
    {
        get
        {
            XmlDocument _dummyDoc = new XmlDocument();
            return _dummyDoc.CreateCDataSection(htmlValue);
        }
        set { htmlValue = (value != null) ? value.Data : null; }
    }
}

    Result r = new Result();
    r.htmlValue = ("<b>Hello</b>");
    r.htmlEscaped = ("<b>Hello</b>");
    XmlSerializer xml = new XmlSerializer(r.GetType());
    TextWriter file = new StreamWriter(Environment.CurrentDirectory + "\\results\\result.xml", false, System.Text.Encoding.Default);
    xml.Serialize(file, r);
    file.Close();

РЕЗУЛЬТАТ:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlEscaped>&lt;b&gt;Hello&lt;/b&gt;</htmlEscaped>
  <htmlValue><![CDATA[<b>Hello</b>]]></htmlValue>
</Result>

Как видите, после того, как CDATA имеет возвращаемый тип, больше нет экранированного html в XML-файле в файловой системе. Сериализация JSON больше не работает, но это можно исправить с помощью небольшого расширения типа.


ВОПРОС БЫЛ:

Может быть, кто-то знает, как заставить это сделать ...

У меня есть этот класс:

public class Result
{
    public String htmlValue
    {
        get;
        set;
    }
}

Я использую это для сериализации в XML

Result res = new Result();
res.htmlValue = "<p>Hello World</p>";
XmlSerializer s = new XmlSerializer(res.GetType());
TextWriter w = new StreamWriter(Environment.CurrentDirectory + "\\result.xml", false, System.Text.Encoding.Default);
s.Serialize(w, res);
w.Close();

Работает нормально, я получаю это:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>
</Result>

Что я могу изменить, чтобы получить это:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>
</Result>

Я уже искал, но ничего не могу найти. Тип htmlValue должен остаться String из-за других сериализаций JSON и т. д.

Хитрый ... Заранее спасибо за предложения

  • HTML верен в строке в C #. Зачем декодировать или кодировать?
  • XmlSerializer сохранил экранированный HTML-файл в файл XML.
  • Не используйте C # для потребления.

Это внешний инструмент, который принимает это:

<htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>

но не

<htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>

Я делаю то же самое с JSON Serializer, в файле на жестком диске HTML-код сохраняется правильно. Почему и где использовать HTTP Utility, чтобы предотвратить это? И как обойти <![CDATA[ ]]>.

Можете ли вы привести пример кода? Есть ли другой сериализатор, кроме собственного C #?

Я нашел эту ссылку .NET XML-сериализация CDATA ATTRIBUTE от Marco André Silva, что мне нужно сделать, но по-другому, как включить это без изменения типов?

Ответы [ 3 ]

7 голосов
/ 02 октября 2009

Вот простой трюк для достижения желаемого. Вам просто нужно сериализовать свойство XmlCDataSection вместо свойства string:

(это почти совпадает с предложением Джона, но немного проще ...)

public class Result
{
    [XmlIgnore]
    public String htmlValue
    {
        get;
        set;
    }

    private static XmlDocument _dummyDoc;

    [XmlElement("htmlValue")]
    public XmlCDataSection htmlValueCData
    {
        get { return _dummyDoc.CreateCDataSection(htmlValue); }
        set { htmlValue = (value != null) ? value.Data : null; }
    }
}
0 голосов
/ 02 октября 2009

Насколько я понимаю, вам нужен XML, чтобы передать его какой-то утилите. Планируете ли вы использовать его для десериализации объекта?

Если нет, то почему бы не сделать это самостоятельно - сериализовать свой объект, который есть? Roundtrip object -> XML -> object несколько сложнее, но первая часть - нет.

0 голосов
/ 02 октября 2009

См. « Сериализация CDATA с XMLSerializer » для той же проблемы и для решения.

Кстати, мне кажется, что если поставщика больше не существует, пришло время использовать другой продукт. Возможно, тот, который понимает спецификации XML, существовавшие более десяти лет.

...