2009-01-21 125 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

相關問題