我正在尝试反序列化由其中一个内部系统生成的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
}
任何想法我怎样才能让它发挥作用?
答案 0 :(得分:10)
如果不能看到你的对象模型与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; }
}
答案 1 :(得分:5)
您可以通过将此序列化添加到app.config
来调试XML序列化<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
在你的临时文件夹中,会生成序列化程序的C#文件,你可以在VS中打开它们进行调试。
另请查看XmlNamespaceManager(即使是默认名称空间)。