2010-10-14 81 views
0

我有一个XML DOX这样的:C#XML序列化错误

<?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数据库=(数据库)xmlSerializer.Deserialize(新的StreamReader(xmlFilePath));

其中Database是包含设备集合的类。

当我注释掉XML文件中的服务器标签,但我不想。我收到一条错误消息:“XMl文档行(1,4)有错误”

如何告诉serialize忽略服务器标签,并且是否需要将名称空间放入XML文件?

我试图把[XmlRootAttribute(“数据库”)数据库对象,但我仍然得到同样的错误

+0

你尝试删除编码属性? (这不是一个解决方案,只是要测试的东西)。在这里,我认为你必须反序列化一个服务器,然后获取你的DataBase对象。 – 2010-10-14 08:44:32

+0

你可以添加相应的类吗.. – RameshVel 2010-10-14 08:46:38

回答

1

如果你真的不希望创建Server类刚加载的XML文件中删除“包装”。

例如,而不是这样的:

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

做到这一点:

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

你应该反序列化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; 
+0

这是我唯一的选择吗?我的代码中无需使用服务器对象。没有办法告诉序列化程序忽略该标签吗? – Bob 2010-10-14 08:50:09

+0

恐怕不是...... – 2010-10-14 08:56:44

+1

@Bob:您可以通过阅读文档并获取其子节点来跨越服务器标签: XmlDocument doc = new XmlDocument(); doc.Load(xmlFilePath); Console.WriteLine(doc.ChildNodes [1] .InnerXml); //孩子0是<? xml ... – jmservera 2010-10-14 09:05:50

0

我相信你XmlRootAttribute的问题,添加服务器作为XmlRootAttribute ..下面的代码示例

[Serializable] 
[XmlRootAttribute("Server", Namespace = "", IsNullable = false)]  
public class YourClass 
{ 
    public YourClass() 
    { 

    } 
    [XmlAttribute] 
    public string Manufacturer { get; set; } 
    .... 

} 

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

+0

谢谢。那这是我唯一的选择?我必须反序列化Server对象...有没有办法告诉序列化程序忽略这个元素? – Bob 2010-10-14 08:59:05