XML文档中存在错误(1,41)

时间:2012-03-22 11:50:20

标签: c# xml-serialization

当我正在对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>

6 个答案:

答案 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);

MSDN, XmlRoot.ElementName

  

在其中生成和识别的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数据类型