【问题标题】:C# XML serialization errorC# XML 序列化错误
【发布时间】:2010-10-14 08:37:07
【问题描述】:

我有一个这样的 XML dox:

<?xml version="1.0" encoding="utf-8"?>
<Server Manufacturer="SQL" Version="1">
  <Database Name="Test123" >
    <Devices>
      <Device Name="Testdata" ..../>
      <Device Name="Testlog" ..../>
    </Devices>
  </Database>
</Server>

我想像这样反序列化它: var database = (Database)xmlSerializer.Deserialize(new StreamReader(xmlFilePath));

其中 Database 是具有设备集合的类。

当我注释掉 XML 文件中的服务器标记但我不想这样做时,它工作正常。我收到一条错误消息,提示“XMl 文档行 (1, 4) 中存在错误”

我如何告诉序列化忽略服务器标签,我是否需要在 XML 文件中放置一个命名空间?

我尝试将 [XmlRootAttribute("Database")] 放在数据库对象上,但我仍然得到同样的错误

【问题讨论】:

  • 您是否尝试删除编码属性? (这不是解决方案,只是要测试的东西)。在这里,我认为您必须反序列化一个服务器,然后获取您的数据库对象。
  • 可以加你对应的类吗..

标签: c# .net


【解决方案1】:

如果您真的不想创建 Server 类,只需从加载的 xml 中删除 &lt;Server/&gt; "wrapper"。

例如,而不是这个:

(Database)xmlSerializer.Deserialize(
    new StreamReader(xmlFilePath));

这样做:

(Database)xmlSerializer.Deserialize(
    XElement.Load(xmlFilePath).Element("Database").CreateReader());

【讨论】:

    【解决方案2】:

    您应该反序列化 Server 类,如下所示:

    public class Server
    {
        public string Manufacturer{get;set;}
        public int Version {get;set;}
        public Database Database {get;set;}
    }
    

    然后反序列化:

    var server = (Server)xmlSerializer.Deserialize(new StreamReader(xmlFilePath));
    var database = server.Database;
    

    【讨论】:

    • 这是我唯一的选择吗?我的代码中不需要服务器对象。有没有办法告诉序列化程序忽略该标签?
    • @Bob:您可以通过读取文档并获取其子节点来跳过服务器标签:XmlDocument doc = new XmlDocument(); doc.Load(xmlFilePath); Console.WriteLine(doc.ChildNodes[1].InnerXml); // 孩子 0 是 xml...
    • 如果你不想在代码中创建Server类,你可以在运行时从xml中删除Server标签,同时打开/读取xml文件。
    【解决方案3】:

    我相信你的 XmlRootAttribute 是问题,在示例代码下面添加 Server as XmlRootAttribute ..

    [Serializable]
    [XmlRootAttribute("Server", Namespace = "", IsNullable = false)]    
    public class YourClass
    {
        public YourClass()
        {
    
        }
        [XmlAttribute]
        public string Manufacturer { get; set; }
       ....
    
    }
    

    反序列化服务器而不是数据库

    【讨论】:

    • 谢谢。所以这是我唯一的选择?我必须反序列化 Server 对象......没有办法告诉序列化程序忽略这个元素?
    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多