使用 HTML 标记反序列化 XML
本文关键字:反序列化 XML HTML 使用 | 更新日期: 2023-09-27 18:34:52
我正在尝试反序列化XML文件,除了包含HTML标记的节点外,它工作正常。下面是 XML 文件中的一个片段:
<article mdate="2011-12-29" key="tr/trier/MI99-02" publtype="informal publication">
<author>Friedemann Leibfritz</author>
<title>A LMI-Based Algorithm for Designing Suboptimal Static H<sub>2</sub>/H<sub>infinity</sub> Output Feedback Controllers</title>
<journal>Universität Trier, Mathematik/Informatik, Forschungsbericht</journal>
<volume>99-02</volume>
<year>1999</year>
</article>
然后,我收到错误:
{"Unexpected node type Element. ReadElementString method can only be called on elements with simple or empty content. Line 1148, position 64."}
错误发生在:
一种基于LMI的算法,用于设计次优静态H2/H无穷大输出反馈控制器
其中 HTML 标记 sub 和/sub 存在。
有没有办法将标题节点作为一个整体反序列化,忽略 HTML 标记?下面是我代码的一部分:
XmlReaderSettings readerSettings = new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Parse,
XmlResolver = new LocalXhtmlXmlResolver()
};
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "dblp";
xRoot.IsNullable = true;
XmlSerializer deserializer;
XmlReader textReader;
deserializer = new XmlSerializer(typeof(List<Entity.Article>), xRoot);
textReader = XmlReader.Create(xmlPath, readerSettings);
List<Entity.Article> articleList;
articleList = (List<Entity.Article>)deserializer.Deserialize(textReader);
textReader.Close();
任何帮助将不胜感激 - 谢谢!
您的 XML 未正确转义。解析器无法知道这些标记不是 XML 文档的一部分,并且当它们被视为 XML 文档时,您的 XML 是无效的,因为一个元素嵌套在另一个元素的值中。
正确转义的 XML 代码段将是
<article mdate="2011-12-29" key="tr/trier/MI99-02" publtype="informal publication">
<author>Friedemann Leibfritz</author>
<title>A LMI-Based Algorithm for Designing Suboptimal Static H<sub>2</sub>/H<sub>infinity</sub> Output Feedback Controllers</title>
<journal>Universität Trier, Mathematik/Informatik, Forschungsbericht</journal>
<volume>99-02</volume>
<year>1999</year>
</article>
正如对上一个答案的评论所指出的那样 - 作为开发人员,我们并不总是能够在反序列化之前格式化 XML。在我看来,有一个更优雅的解决方案可以满足原始问题。
序列化程序
public static T ParseXml<T>(this string @this) where T : class
{
var serializer = new XmlSerializer(typeof(T));
serializer.UnknownElement += Serializer_UnknownElement;
return serializer.Deserialize(new StringReader(@this)) as T;
}
处理有问题的字段
private static void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
if (e.ObjectBeingDeserialized is Article article)
{
if (e.Element.Name == "title")
{
article.Title_Custom = e.Element.InnerXml;
return;
}
}
}
对文章类别的修改
public class Article{
// include your other fields that are not problematic
public string Title_Custom { get; set; }
}
用法
var myArticles = articlesXmlString.Parse<List<Article>>();
Console.Out(myArticles[0].Title_Custom); // "A LMI-Based Algorithm for Designing Suboptimal Static H<sub>2</sub>/H<sub>infinity</sub> Output Feedback Controllers"
由于属性的名称现在已Title_Custom
因此在反序列化过程中自然会跳过该属性。然后,Serializer_UnknownElement
方法将在<title>
字段中读取为未知字段。然后,您只需拉取内部 XML 的全部内容。
包含<sup>
也会使Serializer_UnknownElement
绊倒,但由于您没有条件,它将跳过它。
最终结果是Title_Custom
现在将按预期包含完整的 HTML 代码段。