Mil*_*ara 2 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>
Run Code Online (Sandbox Code Playgroud)
从代码背后:
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));
}
Run Code Online (Sandbox Code Playgroud)
这是我的班级定义:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试反序列化时.它显示我的错误:{"有多个根元素."}
是否有任何解决方案或替代指定XmlRootAttribute?
感谢提前,米兰门德帕拉
我认为你的问题在于这一行:
StringReader re = new StringReader(ele.InnerXml);
Run Code Online (Sandbox Code Playgroud)
将其更改为:
StringReader re = new StringReader(ele.OuterXml);
Run Code Online (Sandbox Code Playgroud)
原因是InnerXml属性将返回所有子节点,但不返回父节点.OuterXml也将包含您的父人节点.
即InnerXml没有根元素(好吧,它有很多!):
<id>ohKiUAZWz2</id>
<first-name>?????al</first-name>
<last-name>§|-|ä|-|»?«</last-name>
<headline>--</headline>
Run Code Online (Sandbox Code Playgroud)
OuterXml如预期:
<person>
<id>ohKiUAZWz2</id>
<first-name>?????al</first-name>
<last-name>§|-|ä|-|»?«</last-name>
<headline>--</headline>
</person>
Run Code Online (Sandbox Code Playgroud)
也没有必要使用您正在使用的XmlSerializer构造函数.尝试:
XmlSerializer mySerializer = new XmlSerializer(typeof(LinkWall));
Run Code Online (Sandbox Code Playgroud)
代替.