这是我的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
答案 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);
}
此代码运行速度更快,然后您就可以根据对象内的数据执行所需的观察。