【问题标题】:XML Deserialization with special characters in C# XMlSerializer在 C# XMlSerializer 中使用特殊字符进行 XML 反序列化
【发布时间】:2015-12-28 08:25:33
【问题描述】:

我有一个 xml 表,其中包含一些特殊字符 “& 是导致问题的特殊字符”,我使用下面的代码来反序列化 XML

           XMLDATAMODEL imported_data;

            // Create an instance of the XmlSerializer specifying type and namespace.
            XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL));

            // A FileStream is needed to read the XML document.
            FileStream fs = new FileStream(path, FileMode.Open);
            XmlReader reader = XmlReader.Create(fs);


            // Use the Deserialize method to restore the object's state.
            imported_data = (XMLDATAMODEL)serializer.Deserialize(reader);
            fs.Close();

我的 XML MOdel 的结构是这样的

    [XmlRoot(ElementName = "XMLDATAMODEL")]
    public class XMLDATAMODEL
    {
        [XmlElement(ElementName = "EventName")]
        public string EventName { get; set; }
        [XmlElement(ElementName = "Location")]
        public string Location { get; set; }
    }

我也尝试了这段代码并提到了编码,但没有成功

            // Declare an object variable of the type to be deserialized.

            StreamReader streamReader = new StreamReader(path, System.Text.Encoding.UTF8, true);
            XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL));
            imported_data = (XMLDATAMODEL)serializer.Deserialize(streamReader);
            streamReader.Close();

这两种方法都失败了,如果我在 Cdata 中放入特殊字符,它看起来可以正常工作。 我怎样才能让它在没有 CData 的情况下也适用于 xml 数据?

这是我的 XML 文件内容

http://pastebin.com/Cy7icrgS

我得到的错误是 XML 文档中存在错误 (2, 17)。

【问题讨论】:

  • 什么样的特殊字符导致它失败?比如“内文”中的<
  • NO & 导致问题
  • 您应该对源数据中的 & 符号进行实体编码。
  • 我明白了,我得到了更好的图片。但最好能把 XML 文件数据本身放入,因为这样更容易重现错误。
  • 在这种情况下,序列化是如何完成的?

标签: c# xml xmlserializer


【解决方案1】:

我能得到afterlookingaround 的最佳答案是,除非你自己序列化数据,否则反序列化 XML 和特殊字符会很麻烦。

对于您的情况,由于特殊字符是 & 在您可以反序列化它之前,您应该将其转换为 & 除非字符 & 转换为 & 我们无法真正使用 XmlSerializer 反序列化它。是的,我们仍然可以使用

XmlReaderSettings settings = new XmlReaderSettings();
settings.CheckCharacters = false; //not to check false character, this setting can be set.
FileStream fs = new FileStream(xmlfolder + "\\xmltest.xml", FileMode.Open);
XmlReader reader = XmlReader.Create(fs, settings);

但是我们不能反序列化它。

至于如何将& 转换为&,加减有多种方式。但所有转换的底线是,不要直接使用流。只需从文件中获取数据并将其转换为string,例如使用File.ReadAllText,然后开始进行字符串处理。之后,convert itMemoryStream 并开始反序列化;

现在对于反序列化之前的字符串处理,有几种方法可以做到。

使用string.Replace("&", "&") 是最简单的,而且大多数时候可能是最不安全的。

另一种更难但更安全的方法是使用Regex。由于您的案例在CData 内部,这也可能是一个好方法。

另一种更难但更安全的方法是逐行创建解析。

我还没有找到这种转换的常见、安全​​的方法。

但就您的示例而言,string.Replace 会起作用。此外,您可能会利用该模式(CData 内部的东西)来使用正则表达式。这也可能是个好方法。

编辑:

至于什么是XML中的特殊字符以及如何预先处理它们,根据this,非罗马字符包括在内。

here中除非罗马字符外,还列出了5个特殊字符:

<   ->  &lt;
>   ->  &gt;
"   ->  &quot;
'   ->  &apos;
&   ->  &amp;

here,我们又得到了一个:

%   -> &#37;

希望他们能帮助你!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2013-04-26
  • 2011-12-11
相关资源
最近更新 更多