在C#XMlSerializer

时间:2015-12-28 08:25:33

标签: c# xml xmlserializer

我有一张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)。

1 个答案:

答案 0 :(得分:4)

我可以获得after looking around的最佳答案,除非您自己序列化数据,否则将反序列化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内部的某些东西)来使用Regex。这也是一个好方法。

编辑:

至于XML中的特殊字符以及如何处理它们,根据this,包括非罗马字符。

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

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

here开始,我们又得到了一个:

%   -> &#37;

希望他们能帮到你!

相关问题