下面是我的代码。
[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 标签,例如 <a href="/Home/Book.asp">
?我应该能够使用 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/