Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用HTML标记反序列化XML_C#_Xml_Serialization - Fatal编程技术网

C# 用HTML标记反序列化XML

C# 用HTML标记反序列化XML,c#,xml,serialization,C#,Xml,Serialization,我正在尝试反序列化一个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

我正在尝试反序列化一个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&auml;t Trier, Mathematik/Informatik, Forschungsbericht</journal>
    <volume>99-02</volume>
    <year>1999</year>
</article>
错误发生在:

A LMI-Based Algorithm for Designing Suboptimal Static H2/Hinfinity Output Feedback Controllers 其中存在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&lt;sub&gt;2&lt;/sub&gt;/H&lt;sub&gt;infinity&lt;/sub&gt; Output Feedback Controllers</title>
    <journal>Universit&auml;t Trier, Mathematik/Informatik, Forschungsbericht</journal>
    <volume>99-02</volume>
    <year>1999</year>
</article>

您的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&lt;sub&gt;2&lt;/sub&gt;/H&lt;sub&gt;infinity&lt;/sub&gt; Output Feedback Controllers</title>
    <journal>Universit&auml;t Trier, Mathematik/Informatik, Forschungsbericht</journal>
    <volume>99-02</volume>
    <year>1999</year>
</article>

正如前面答案的评论所指出的,作为开发人员,我们并不总是能够在反序列化之前格式化XML。在我看来,有一个更优雅的解决方案,可以满足最初的问题

序列化程序 对文章类的修改 用法 因为属性的名称现在是Title\u Custom,所以作为反序列化过程的一部分,它自然会被跳过。然后,序列化程序_unknowneElement方法将在字段中作为未知字段读取。然后,只需提取内部XML的全部内容

包含也将使序列化程序_unknowneElement跳闸,但由于您没有条件,它将跳过它


最终的结果是Title_Custom现在将像预期的那样包含完整的HTML片段。

正如前面答案的注释所指出的那样-作为开发人员,我们并不总是能够在反序列化之前格式化XML。在我看来,有一个更优雅的解决方案,可以满足最初的问题

序列化程序 对文章类的修改 用法 因为属性的名称现在是Title\u Custom,所以作为反序列化过程的一部分,它自然会被跳过。然后,序列化程序_unknowneElement方法将在字段中作为未知字段读取。然后,只需提取内部XML的全部内容

包含也将使序列化程序_unknowneElement跳闸,但由于您没有条件,它将跳过它


最终结果是Title\u Custom现在将如预期的那样包含完整的HTML代码段。

Hi,感谢您的回复!不修改XML文件是一项要求。此外,XML文件的大小大约为1.2GB,可能还有其他尚未发现的HTML标记,例如。有没有办法跳过这些元素呢?您当前没有有效的XML文件,您不能只跳过不喜欢的部分-您所要求的类似于使用随机变量编写C应用程序它散布在整个源代码中,并要求编译器跳过不应该存在的标记。您可以做的是处理文本文件,尝试用正确转义的标记替换已知的错误HTML标记,但这本身就是危险的-您确定文件中没有XML元素吗?那我这里真正的问题是什么这说明需要正确生成XML。您好,谢谢您的回复!这是不修改XML文件的要求。此外,XML文件大约有1.2GB大,可能还有其他HTML标记尚未发现,例如。有没有办法跳过这些元素呢?您目前没有有效的XML文件,您不能跳过其中的部分你不喜欢——你问的问题类似于用随机变量编写一个C应用程序它散布在整个源代码中,并要求编译器跳过不应该存在的标记。您可以做的是处理文本文件,尝试用正确转义的标记替换已知的错误HTML标记,但这本身就是危险的-您确定文件中没有XML元素吗?那我这里真正的问题是什么这意味着需要正确生成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"