c# - 如何使用 XmlSerializer 对 xHtml 文本进行 sanitizer ?

标签 c# xml-serialization linq-to-xml xml-deserialization

下面是我的代码。

[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 类型的节点上而不是文本类型的节点。

如何反序列化 <xhtml/> 中的内容标签而不会丢失任何 html 标签,例如 &lt;a href="/Home/Book.asp"&gt; ?我应该能够使用 xhtml 并在浏览器中呈现 html 标签/链接。

非常感谢任何想法和建议。

最佳答案

由于xhtml 标记的内部可以是自由形式,您应该将类​​型从XElement 更改为string。然后,为了避免处理 html/xhtml block ,您可以使用 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 block 是有效的 xml,那么您可以使用 XMLDocument 加载 xml 并遍历树。

关于c# - 如何使用 XmlSerializer 对 xHtml 文本进行 sanitizer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248026/

相关文章:

linq - 如何删除 linq to xml 文档中的重复节点

.net-3.5 - MailAttachment 序列化和反序列化不起作用

c# - 在 .NET XML 反序列化中,如何允许数组类型的多态使用?

c# - 根据 ID 从 List<T> 中获取一个元素

c# - 使用 LINQ 转换投影列表返回空值列表?

c# - 如何使用 XDocument 读取 xml 文件?

c# - 如何在windows phone 8中实现横向滑动控制?

c# - Entity Framework 上的多态交叉关联

C# 图像识别性能——比较图像列表和图像字典

c# - 在程序中的类之间共享值的技术