2009-01-21 84 views
2

我有一个来自外部源的XML文档。如何反序列化带有前缀名称空间但没有ns前缀元素的XML文档?

<?xml version="1.0" encoding="utf-8"?> 
<ns0:Info xmlns:ns0="http://www.ZomboCorp.com/"> 
    <Name>Anthony</Name> 
    <Job>Developer</Job> 
</ns0:Info> 

我需要将其反序列化为这样的对象。

public class Info 
{ 
    public String Name { get; set; } 
    public String Job { get; set; } 
} 

原样使用时,Serializer抛出是没有预料到的InvalidOperationException

<Info xmlns='http://www.ZomboCorp.com/'>

如果我添加[XmlElement(Namespace = "http://www.ZomboCorp.com/")]到类定义,Serializer将返回空值属性的新Info对象。

回答

5

我使用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; } 
} 

但是,我能够与

[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; } 
} 
5

您必须将XmlElement属性添加到每个属性,并将Namespace属性设置为空字符串(因为命名空间在您的情况下不会被继承)。

您的信息的定义应该是这样的:

XmlRoot(Namespace = "http://www.ZomboCorp.com/")] 
public class Info 
{ 
    [XmlElement(Namespace = "")] 
    public String Name { get; set; } 
    [XmlElement(Namespace = "")] 
    public String Job { get; set; } 
} 

然后,它会正确地反序列化。

+0

@ajmastrean闪避:寻找新的答案,我跑这跟您的XML,并将它与正确填充特性的工作。 – casperOne 2009-01-21 17:13:28

+0

感谢您走出实际执行代码的方式。我会+1你的答案:) – 2009-01-21 17:22:43

相关问题