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

8

我正在尝试反序列化内部系统生成的Atom 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
    }

有什么想法可以让它正常工作吗?
2个回答

13

如果无法查看对象模型与 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; }
}

5
您可以通过将以下内容添加到app.config文件来调试XML序列化:
<system.diagnostics>
  <switches>
    <add name="XmlSerialization.Compilation" value="1" />
  </switches>
</system.diagnostics>

在您的临时文件夹中,会生成用于序列化程序的C#文件,您可以在VS中打开这些文件进行调试。
此外,请查看XmlNamespaceManager(即使是默认名称空间也要查看)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接