2009-08-05 35 views
6

Tôi đang cố gắng deserialize một xml Atom được tạo ra bởi một trong các hệ thống nội bộ. Tuy nhiên, khi tôi cố gắng:Làm thế nào tôi có thể deserialize xml với một không gian tên mặc định?

public static MyType FromXml(string xml) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType)); 
     return (MyType) serializer.Deserialize(new StringReader(xml)); 
    } 

nó ném một ngoại lệ vào định nghĩa của không gian tên:

System.InvalidOperationException: <feed xmlns='http://www.w3.org/2005/Atom'> was not expected. 

Khi tôi thêm không gian tên cho các nhà xây dựng của XmlSerializer, đối tượng của tôi là hoàn toàn trống rỗng:

public static MyType FromXml(string xml) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType), "http://www.w3.org/2005/Atom"); 
     return (MyType) serializer.Deserialize(new StringReader(xml)); //this will return an empty object 
    } 

Bất kỳ ý tưởng nào tôi có thể làm cho nó hoạt động?

Trả lời

10

Thật khó để điều tra điều này mà không thể xem mô hình đối tượng của bạn liên kết với xml như thế nào (ví dụ: các mẫu của mỗi mẫu); Tuy nhiên, bạn sẽ có thể làm điều gì đó như:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class MyType {...} 

Như một ví dụ nguyên tử hạn chế (trong đó hoạt động tốt với một số nguyên tử mẫu Tôi có "bàn"):

class Program 
{ 
    static void Main() 
    { 
     string xml = File.ReadAllText("feed.xml"); 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType)); 
     var obj = (MyType)serializer.Deserialize(new StringReader(xml)); 
    } 
} 
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class MyType 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
    [XmlElement("updated")] 
    public DateTime Updated { get; set; } 
    [XmlElement("title")] 
    public string Title { get; set; } 
} 
+0

Chúc mừng, đã thực hiện công việc. – Grzenio

5

Bạn có thể gỡ lỗi XML serialization bằng cách thêm vào app.config

<system.diagnostics> 
    <switches> 
    <add name="XmlSerialization.Compilation" value="1" /> 
    </switches> 
</system.diagnostics> 

Trong thư mục temp của bạn, các tệp C# cho bộ nối tiếp được tạo và bạn có thể mở chúng trong khi gỡ lỗi.

Ngoài ra, hãy xem XmlNamespaceManager (ngay cả đối với không gian tên mặc định).

Các vấn đề liên quan