Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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#XMlSerializer中具有特殊字符的XML反序列化_C#_Xml_Xmlserializer - Fatal编程技术网

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

C#XMlSerializer中具有特殊字符的XML反序列化,c#,xml,xmlserializer,C#,Xml,Xmlserializer,我有一个xml表,其中包含一些特殊字符“&是导致问题的特殊字符”,我使用下面的代码来反序列化xml XMLDATAMODEL imported_data; // Create an instance of the XmlSerializer specifying type and namespace. XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMOD

我有一个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模型的结构如下

    [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文件内容


我得到的错误是XML文档(2,17)中有一个错误。

我能得到的最佳答案是,除非您自己序列化数据,否则对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);
但我们不能将其反序列化

如何将
&
转换为
&,有各种加号和减号的方法。但所有转换的底线是,不要直接使用流。只需从文件中获取数据,并使用例如
file.ReadAllText
将其转换为
string
,然后开始进行字符串处理。然后,进入
内存流
并开始反序列化

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

使用
string.Replace(“&”、“&;”
)是最简单的方法,大多数情况下可能是最不安全的方法

另一种更难但更安全的方法是使用。由于您的案例包含在CData中,因此这也是一个好方法

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

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

但是对于您的示例,
string.Replace
可以工作。此外,您还可能利用该模式(CData中的某些内容)来使用正则表达式。这可能也是一个好办法

编辑:

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

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

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

希望他们能帮助你

什么样的特殊性格导致它失败?例如,
NO&导致问题您应该对源数据中的符号进行实体编码。我明白了,我得到了更好的图片。但是如果您可以将XML文件数据本身放进去,那就最好了,因为复制错误会容易得多。在这种情况下,序列化是如何完成的?我非常感谢您为解释解决方案所做的努力。现在,我想我也会在其他一些特殊角色身上面临同样的问题。还有其他特殊角色需要我们注意吗?我不能保证我知道完整的特殊角色列表,因为我自己从来没有遇到过这样的问题。更重要的是,即使是非罗马字母也是特殊字符!但除此之外,你还可以看看这篇文章,其中至少有5个特殊字符:,,,,,,,,&。看看这篇文章,知道如何从每一个字符中逃脱。再看看这篇文章:还有一个:%
%   -> &#37;