如何使用默认名称空间反序列化xml?

问题描述:

我想反序列化由其中一个内部系统生成的Atom xml。然而,当我尝试:如何使用默认名称空间反序列化xml?

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

它抛出一个异常的命名空间的定义:

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

当我的命名空间添加到XmlSerializer的的构造,我的目标是完全空:

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 
    } 

任何想法如何才能使它工作?

如果不能查看对象模型与xml的关系(即每个样本的样本),很难对此进行调查;但是,你应该能够做一些事情,如:

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

为有限原子的例子(其中一些样本原子我有“手”正常工作):

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

干杯,做了这份工作。 – Grzenio 2009-08-05 10:33:46

您可以调试通过增加这在app.config

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

在您的临时文件夹的XML序列化,生成了串行C#文件,你可以在VS打开这些调试。

也看看XmlNamespaceManager(即使对于默认名称空间)。