当前位置:  开发笔记 > 编程语言 > 正文

C#XMlSerializer中具有特殊字符的XML反序列化

如何解决《C#XMlSerializer中具有特殊字符的XML反序列化》经验,为你挑选了1个好方法。

我有一个包含一些特殊字符“&是引起问题的特殊字符的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的structre是这样的

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

我也提到了Encoding尝试过此代码,但没有成功

            // 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)中有错误。



1> Ian..:

我环顾四周后 最好的答案是,除非您自己序列化数据,否则将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);

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

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

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

最简单,大多数时候最不安全的方法是使用string.Replace("&", "&")

另一种更困难但更安全的方法是使用Regex。既然您的案子在里面CData,那也可能是个好方法。

通过逐行创建您的解析,另一种更难却更安全的方式。

我尚未找到进行此转换的常见,安全的方法。

但是以您的示例为例,该方法string.Replace将起作用。此外,您可能会利用模式(在里面的东西CData)来使用Regex。这也可能是一个好方法。

编辑:

至于什么被认为是在XML和如何前手处理这些特殊字符,根据这个,非罗马字符都包括在内。

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

<   ->  <
>   ->  >
"   ->  "
'   ->  '
&   ->  &

从这里,我们又得到了:

%   -> %

希望他们能为您服务!

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有