Ant*_*ean 2 .net xml xml-serialization xml-namespaces
我有一个来自外部源的XML文档.
<?xml version="1.0" encoding="utf-8"?>
<ns0:Info xmlns:ns0="http://www.ZomboCorp.com/">
<Name>Anthony</Name>
<Job>Developer</Job>
</ns0:Info>
Run Code Online (Sandbox Code Playgroud)
我需要将它反序列化为这样的对象.
public class Info
{
public String Name { get; set; }
public String Job { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
按原样使用,Serializer抛出一个InvalidOperationException
<Info xmlns='http://www.ZomboCorp.com/'>没想到.
如果我添加[XmlElement(Namespace = "http://www.ZomboCorp.com/")]到类定义,则Serializer返回Info具有null属性的新对象.
您还必须将XmlElement属性添加到每个属性,将Namespace属性设置为空字符串(因为在您的情况下不会继承命名空间).
您对Info的定义应如下所示:
XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
[XmlElement(Namespace = "")]
public String Name { get; set; }
[XmlElement(Namespace = "")]
public String Job { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后它将正确反序列化.
我使用xsd.exe(一个VS工具)并从XML文件生成一个模式,然后从模式生成一个类文件.它建议
[XmlType(AnonymousType = true, Namespace = "http://www.ZomboCorp.com/")]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/", IsNullable = false)]
public class Info
{
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public String Name { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public String Job { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,我能够逃脱
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public String Name { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public String Job { get; set; }
}
Run Code Online (Sandbox Code Playgroud)