c# - 不指定 XmlRootAttribute 的 XML 反序列化

标签 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

最佳答案

我认为您的问题出在这一行:

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

相反。

关于c# - 不指定 XmlRootAttribute 的 XML 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9194331/

相关文章:

java - 为什么我的列表没有在 JAXB 中序列化?

c# - C# 的流媒体视频库

c# - 本地主机和实时站点的 Request.URL

带有 curl 的 php 解析器 xml

c# - 如何将 XElement 的值包装在 ![CDATA[***]] 中?

c# - 如何在c#中序列化DBParameters

c# - 我应该使这个 XmlSerializer 静态吗?

c# - 在参数中使用带有 Unicode 字符的 Windows 中的 GhostScript 9.10

c# - 如何在 .Take() 之前获得总结果计数 - 但在使用 .Take() 时

php - DomDocument 解析换行符适用于 span 但不适用于 img