使用C#中的XMLSerializer将xml字符串反序列化为对象时出错

时间:2013-02-20 23:32:44

标签: c# xml xmlserializer

这是我的DTO

[XmlTypeAttribute(TypeName="XAttributes")]
public class XAttributes
{
    [XmlArray(ElementName="Attributes")]
    [XmlArrayItem(ElementName="Attribute")]
    public List<Attribute> Attributes { get; set; }    
    public XAttributes()
    {
        Attributes = new List<Attribute>();
    }
}
public class Attribute
{      
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "Value")]
    public string Value { get; set; }      

    [XmlElement(ElementName = "ValueType")]
    public ValueType ValueType {get; set; }

    [XmlArray(ElementName="Children" )]
    public List<Attribute> Children { get; set; }
}

这是我的反序列化代码

  public static T ToObject<T>(this string XMLData)
    {
        var s = new XmlSerializer(typeof(T));
        object obj=null;
        using (var sr = new StringReader(XMLData))
        {
            obj = s.Deserialize(sr);
        }
        return (T)obj;
    }

这是我调用反序列化的代码

string attr = @"<XAttributes><Attributes>                          
                        <Attribute>
                        <Name>Test</Name>
                        <Value>TestVlau</Value>
                        <ValueType>STRING</ValueType>
                        <Children/>
                        </Attribute>
                        <Attribute>
                        <Name>Test1</Name>
                        <Value>TestVlau1</Value>
                        <ValueType>STRING</ValueType>
                        <Children/>
                        </Attribute>
                        </Attributes><XAttributes>";

        var attribute = attr.ToObject<XAttributes>();

我收到错误

There is an error in XML document (14, 55).

 obj = s.Deserialize(sr);

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

这里很难说是问题,但请尝试以下方法....替换

[XmlTypeAttribute(TypeName="XAttributes")]
public class XAttributes 
{
    ....
}

用这个:

[XmlRoot("XAttributes")]
public class XAttributes 
{
    ....
}

另外,不要忘记在XML字符串中包含XML声明:

string attr = @"<?xml version="1.0" encoding="utf-8"?>
    <XAttributes><Attributes>                          
        <Attribute>
        <Name>Test</Name>
        <Value>TestVlau</Value>
        <ValueType>STRING</ValueType>
        <Children/>
        </Attribute>
        <Attribute>
        <Name>Test1</Name>
        <Value>TestVlau1</Value>
        <ValueType>STRING</ValueType>
        <Children/>
        </Attribute>
        </Attributes><XAttributes>";

PS:我创建了一个可能有用的通用XmlSerializer,请查看我在CodeProject中的文章:

XML serialization using Generics