XML反序列化而不指定XmlRootAttribute

时间:2012-02-08 13:34:02

标签: c# xml xml-serialization xml-deserialization

这是我的xml:

<connections total="2" >
       <person>
              <id>ohKiUAZWz2</id>
              <first-name>ミ★нιяαℓ</first-name>
              <last-name>§|-|ä|-|»♥«</last-name>
              <headline>--</headline>
            </person>
       <person>
              <id>LmgYe-Nl2a</id>
              <first-name>kunal</first-name>
              <last-name>b</last-name>
              <headline>Student at MscIT,Surat</headline>               
          </person>
</connection>

来自背后的代码:

List<LinkWall> LinkWallList = new List<LinkWall>();
            XmlNodeList xmlnode = doc.GetElementsByTagName("person");

            foreach (XmlElement ele in xmlnode)
            {

                XmlRootAttribute xr = new XmlRootAttribute("person");

                XmlSerializer mySerializer = new XmlSerializer(typeof(LinkWall),xr);

                StringReader re = new StringReader(ele.InnerXml);

                LinkWallList.Add((LinkWall)mySerializer.Deserialize(re));
            }

这是我的班级定义:

[XmlRoot("person")]
    public class LinkWall
    {
        public LinkWall()
        { }

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

        [XmlElement(ElementName = "first-name")]
        public string firstName { get; set; }

        [XmlElement(ElementName = "last-name")]
        public string lastName { get; set; }

        [XmlElement(ElementName = "headline", IsNullable=true)]
        public string headline { get; set; }  
    }

但是当我尝试反序列化时。它向我显示错误:{“有多个根元素。”}

是否有任何解决方案或替代方法来指定XmlRootAttribute?

提前感谢Milan Mendpara

3 个答案:

答案 0 :(得分:5)

我认为你的问题在于这一行:

StringReader re = new StringReader(ele.InnerXml);

将其更改为:

StringReader re = new StringReader(ele.OuterXml);

原因是InnerXml属性将返回所有子节点,但不返回父节点。 OuterXml也将包括您的父人节点。

即。 InnerXml没有根元素(好吧,它有很多!):

<id>ohKiUAZWz2</id>
<first-name>?????al</first-name>
<last-name>§|-|ä|-|»?«</last-name>
<headline>--</headline>

OuterXml如预期:

<person>
    <id>ohKiUAZWz2</id>
    <first-name>?????al</first-name>
    <last-name>§|-|ä|-|»?«</last-name>
    <headline>--</headline>
</person> 

也没有必要使用您正在使用的XmlSerializer构造函数。尝试:

XmlSerializer mySerializer = new XmlSerializer(typeof(LinkWall));

相反。

答案 1 :(得分:2)

尝试 OuterXml 而不是 InnerXML

StringReader re = new StringReader(ele.OuterXml);

答案 2 :(得分:1)

我相信您应该创建一个类似于xml文件的类,并将xml文件反序列化为此类的实例。

MyClass myObject = new MyClass;
XmlSerializer ser = new XmlSerializer(myObject.GetType());
using (FileStream fs = new FileStream(FilePath, FileMode.Open))
{
    XmlTextReader reader = new XmlTextReader(fs);
    myObject = (MyClass)ser.Deserialize(reader);
}

此代码运行速度更快,然后您就可以根据对象内的数据执行所需的观察。