2010-10-14 154 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