C# 反序列化xml时路径中存在非法字符?
我有一个xml,需要反序列化为列表。实际上,我只是使用XSD2Code工具来生成序列化和反序列化方法 所有这些都工作正常,但当我传递文件名时,我得到了xmlstring,但没有反序列化,因为路径中有非法字符 我的代码:C# 反序列化xml时路径中存在非法字符?,c#,xml,C#,Xml,我有一个xml,需要反序列化为列表。实际上,我只是使用XSD2Code工具来生成序列化和反序列化方法 所有这些都工作正常,但当我传递文件名时,我得到了xmlstring,但没有反序列化,因为路径中有非法字符 我的代码: public T LoadFromFile(string fileName) { System.IO.FileStream file = null; System.IO.StreamReader sr = null;
public T LoadFromFile(string fileName)
{
System.IO.FileStream file = null;
System.IO.StreamReader sr = null;
try
{
file = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read);
sr = new System.IO.StreamReader(file);
string xmlString = sr.ReadToEnd();
sr.Close();
file.Close();
return Deserialize(xmlString);
}
finally
{
if ((file != null))
{
file.Dispose();
}
if ((sr != null))
{
sr.Dispose();
}
}
}
这里我得到了xmlString,我得到的字符串是
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ZTIMES_SQL_TO_SAP_CELL.Response xmlns=\"urn:sap-com:document:sap:rfc:functions\">\r\n <IT_RETURN xmlns=\"\">\r\n <item>\r\n <INAME>CELLCOMPLETION</INAME>\r\n <UNQ_ID>1234</UNQ_ID>\r\n <STATUS>F</STATUS>\r\n </item>\r\n <item>\r\n <INAME>CELLCOMPLETION</INAME>\r\n <UNQ_ID>1235</UNQ_ID>\r\n <STATUS>S</STATUS>\r\n </item>\r\n <item>\r\n <INAME>CELLCOMPLETION</INAME>\r\n <UNQ_ID>1236</UNQ_ID>\r\n <STATUS>F</STATUS>\r\n </item>\r\n </IT_RETURN>\r\n <IT_CELL_COMP xmlns=\"\">\r\n <item>\r\n <UNQ_ID>1234</UNQ_ID>\r\n <LOC_CODE>LOC1</LOC_CODE>\r\n <TRSLNO>TRSLNO1</TRSLNO>\r\n <MODEL>MODEL1</MODEL>\r\n <CELL>CELL1</CELL>\r\n <CDATE>1900-01-01</CDATE>\r\n <COMP_STATUS>COMP_STAT1</COMP_STATUS>\r\n <NEQUNR>NEQUNR1</NEQUNR>\r\n <SHIFT>1</SHIFT>\r\n <ITERATION>1</ITERATION>\r\n <CREATED_BY>CREATED_BY1</CREATED_BY>\r\n <CREATED_DT>1900-01-01</CREATED_DT>\r\n <CREATED_TM>01:01:01</CREATED_TM>\r\n </item>\r\n <item>\r\n <UNQ_ID>1235</UNQ_ID>\r\n <LOC_CODE>LOC2</LOC_CODE>\r\n <TRSLNO>TRSLNO2</TRSLNO>\r\n <MODEL>MODEL2</MODEL>\r\n <CELL>CELL2</CELL>\r\n <CDATE>1900-01-01</CDATE>\r\n <COMP_STATUS>COMP_STAT2</COMP_STATUS>\r\n <NEQUNR>NEQUNR2</NEQUNR>\r\n <SHIFT>-79228162514264337593543950335</SHIFT>\r\n <ITERATION>-79228162514264337593543950335</ITERATION>\r\n <CREATED_BY>CREATED_BY2</CREATED_BY>\r\n <CREATED_DT>1900-01-01</CREATED_DT>\r\n <CREATED_TM>01:01:01</CREATED_TM>\r\n </item>\r\n <item>\r\n <UNQ_ID>1236</UNQ_ID>\r\n <LOC_CODE>LOC3</LOC_CODE>\r\n <TRSLNO>TRSLNO3</TRSLNO>\r\n <MODEL>MODEL3</MODEL>\r\n <CELL>CELL3</CELL>\r\n <CDATE>0001-01-01</CDATE>\r\n <COMP_STATUS>COMP_STAT3</COMP_STATUS>\r\n <NEQUNR>NEQUNR3</NEQUNR>\r\n <SHIFT>79228162514264337593543950335</SHIFT>\r\n <ITERATION>79228162514264337593543950335</ITERATION>\r\n <CREATED_BY>CREATED_BY3</CREATED_BY>\r\n <CREATED_DT>1900-01-01</CREATED_DT>\r\n <CREATED_TM>01:01:01</CREATED_TM>\r\n </item>\r\n </IT_CELL_COMP>\r\n</ZTIMES_SQL_TO_SAP_CELL.Response>"
好的,现在我们有了你的
反序列化方法,问题很明显:
stream = new StreamReader(xml);
这是将xml
视为文件名,而不是xml。要么你只需要:
public T Deserialize(string filename)
{
// There's no need to make the serializer a property or instance variable...
var serializer = new XmlSerializer(typeof(T));
using (var stream = File.OpenRead(filename))
{
return (T) serializer.Deserialize(stream);
}
}
。。。或者使用XML,并使用StringReader
:
public T Deserialize(string xml)
{
var serializer = new XmlSerializer(typeof(T));
return (T) serializer.Deserialize(new StringReader(xml));
}
就我个人而言,我更喜欢前一个版本——它允许XML解析代码自动检测编码,而当前您在将文件作为字符串读取时采用UTF-8。对,现在我们有了您的反序列化方法,问题很明显:
stream = new StreamReader(xml);
这是将xml
视为文件名,而不是xml。要么你只需要:
public T Deserialize(string filename)
{
// There's no need to make the serializer a property or instance variable...
var serializer = new XmlSerializer(typeof(T));
using (var stream = File.OpenRead(filename))
{
return (T) serializer.Deserialize(stream);
}
}
。。。或者使用XML,并使用StringReader
:
public T Deserialize(string xml)
{
var serializer = new XmlSerializer(typeof(T));
return (T) serializer.Deserialize(new StringReader(xml));
}
就我个人而言,我更喜欢前一个版本——它允许XML解析代码自动检测编码,而当前,当您将文件作为字符串读取时,您假设使用UTF-8。那么,您的反序列化方法是什么样的呢?请注意,您的代码是以冗长的方式编写File.ReadAllText(fileName)
——您应该使用和语句来避免所有手动处理。在if
条件中也不需要那么多括号。我删除了所有代码,只添加了字符串xmlString=File.ReadAllText(文件名);但我还是犯了同样的错误。是的,你会的。这就是我的观点——这是做同样事情的一种更简单的方法。但是问题大概出在你的反序列化
方法中,你没有向我们展示。我添加了反序列化方法。你的反序列化方法是什么样子的?请注意,您的代码是以冗长的方式编写File.ReadAllText(fileName)
——您应该使用和语句来避免所有手动处理。在if
条件中也不需要那么多括号。我删除了所有代码,只添加了字符串xmlString=File.ReadAllText(文件名);但我还是犯了同样的错误。是的,你会的。这就是我的观点——这是做同样事情的一种更简单的方法。但问题可能出在您的反序列化
方法中,您还没有向我们展示。我添加了反序列化方法StringReader
实现了IDisposable
,所以您应该释放该实例。@Gene:否,在这种情况下没有必要-它只实现了IDisposable
,因为TextReader
实现了。没有要释放的非托管资源。使用
语句添加一个不会对执行时间造成任何伤害,但是代码会更冗长,没有任何好处。谢谢朋友。我被其他逻辑弄糊涂了。StringReader
实现了IDisposable
,因此您应该释放该实例。@Gene:不,在这种情况下没有必要-它只实现了IDisposable
,因为TextReader
实现了。没有要释放的非托管资源。使用
语句添加一个不会对执行时间造成任何伤害,但是代码会更冗长,没有任何好处。谢谢朋友。我被其他逻辑弄糊涂了。