当我正在对xml进行反序列化时,我得到“XML文档中存在错误(1,41)。” 。任何人都可以告诉我这是什么问题。
public static T DeserializeFromXml<T>(string xml)
{
T result;
XmlSerializer ser = new XmlSerializer(typeof(T));
using (TextReader tr = new StringReader(xml))
{
result = (T)ser.Deserialize(tr);
}
return result;
}
我用这个函数来做。
<?xml version='1.0' encoding='utf-16'?>
<Message>
<FirstName>Hunt</FirstName>
<LastName>DAvid</LastName>
</Message>
答案 0 :(得分:17)
确保您的Message类如下所示:
[Serializable, XmlRoot("Message")]
public class Message
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
这对我很有用:
string xml = File.ReadAllText("c:\\Message.xml");
var result = DeserializeFromXml<Message>(xml);
在其中生成和识别的XML根元素的名称 XML文档实例。 默认值是序列化的名称 类强>
因此,您的类名可能不是Message
,这就是反序列化器无法使用默认行为找到它的原因。
答案 1 :(得分:2)
同意来自sll的答案,但遇到另一个障碍,即在接收返回的xml时,在属性中指定了命名空间,但未包含该命名空间,从而找不到该类。
我必须找到一个解决方法来指定属性中的命名空间并且它有效。
即
[Serializable()]
[XmlRoot("Patient", Namespace = "http://www.xxxx.org/TargetNamespace")]
public class Patient
产生
<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxxx.org/TargetNamespace">
但我必须将其更改为
[Serializable()]
[XmlRoot("Patient")]
public class Patient
生成的
<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
这解决了我的问题,希望它可以帮助别人。
答案 2 :(得分:2)
我有同样的事情。所有都归结为模式中标签名称中的“d”而不是“D”。
答案 3 :(得分:2)
首先检查使用正确数据类型声明的变量。 我有一个相同的问题然后我检查,错误地我将SAPUser声明为int数据类型,以便发生错误。 XML文件还使用类似数组的概念存储其数据,但其第一个索引开始具有+1。 例如如果错误在(7,2)那么 总是检查第6行......
答案 4 :(得分:0)
在我正在研究的WEC7项目中,我遇到了类似的错误。我正在序列化的文件是从一个对象数组中序列化的,所以我认为XML很好。此外,我已经有一些以前的课程,所以这是一个很大的难题。
然后我在我之前的工作中注意到,我正在序列化/反序列化的每个类都有一个默认的构造函数。在我失败的情况下失踪了所以我添加了它并且瞧...它工作正常。
我似乎记得在某处读到这是必需的。我想是的。
答案 5 :(得分:0)
在我的情况下,我有一个浮点值,其中xml有一个空值,所以一定要在xsd map中搜索float和int数据类型