Как стерилизовать текст xHtml с помощью XmlSerializer? - PullRequest
2 голосов
/ 12 февраля 2012

Ниже мой код.

[XmlRootAttribute("book")]
public class BookHtml
{
    [XmlElement("book-id")]
    public string BookId { get; set; }

    [XmlElement("book-xhtml")]
    public BookHtmlMetadata BookXhtml { get; set; }

    public String ToHtml()
    {
        return this.BookXhtml.Xhtml.ToString();
    }
}

public class BookHtmlMetadata
{
    [XmlElement("xhtml")]
    public XElement Xhtml { get; set; }
}

public class Program
{
    private static string GetXhtmlWithNoTags()
    {
        return "<content>" +
                 "<book>" +
                       "<book-id label=\"Book Id\">2</book-id>" +
                       "<book-xhtml label=\"Book Xhtml\">" +
                            "<xhtml>" +
                                   "Copyright © 2010 . All rights reserved.<a href=\"/Home/Book.asp\">Best book ever</a>. " +
                            "</xhtml>" +
                        "</book-xhtml>" +
                    "</book>" +
                "</content>";
    }

    static void Main(string[] args)
    {
        string xml = GetXhtmlWithNoTags();

        XElement contentXml = XElement.Parse(xml);

        var xmlSerializer = new XmlSerializer(typeof(BookHtml));
        var list = new List<BookHtml>();

        foreach (var child in contentXml.Elements())
        {
            list.Add((BookHtml)xmlSerializer.Deserialize(child.CreateReader()));
        }

        string contentToRender = list.Single().BookXhtml.Xhtml;
   }

Когда я запускаю этот код, я получаю сообщение об ошибке:

xmlSerializer.Deserialize(child.CreateReader());

XmlReader должен быть на узлевведите Element вместо узла типа Text.

Как я могу десериализовать содержимое в тегах <xhtml/>, не теряя ни одного html-тега, такого как &lt;a href="/Home/Book.asp"&gt;?Я должен быть в состоянии использовать xhtml и отображать теги / ссылки html в браузере.

Любые идеи, предложения приветствуются.

1 Ответ

1 голос
/ 12 февраля 2012

Поскольку внутренняя часть тегов xhtml может быть свободной формой, вам следует изменить тип с XElement на string. Затем, чтобы избежать обработки блока html / xhtml, вы можете использовать CDATA, чтобы сообщить подпрограмме десериализации, что это не совсем правильный xml, и у вас нет типизированной структуры для использования.

В коде:

public class BookHtmlMetadata
{
    [XmlElement("xhtml")]
    public string Xhtml { get; set; }
}

и

private static string GetXhtmlWithNoTags()
{
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><content>" +
                "<book>" +
                    "<book-id label=\"Book Id\">2</book-id>" +
                    "<book-xhtml label=\"Book Xhtml\">" +
                        "<xhtml><![CDATA[" +
                                "Copyright © 2010 . All rights reserved.<a href=\"/Home/Book.asp\">Best book ever</a>. " +
                        "!]]></xhtml>" +
                    "</book-xhtml>" +
                "</book>" +
            "</content>";
}

Теперь, если блок xhtml является действительным xml, вы можете использовать XMLDocument для загрузки xml и обхода дерева.

...