2015-04-20 82 views
1

我想序列化的XML文件看起來像這樣:xml序列化 - 如何在子節點中添加命名空間?

<?xml version="1.0" encoding="utf-8" ?> 
<MainNode xmlns="http://test"> 
    <SubNode xmlns:xsi="http://test2" xmlns="test3"> 
    <setting name = "1" value = "2"/> 
    </SubNode> 
</MainNode> 

我創建了一個類此這樣的:XSI和XLMS在我的子節點:因爲我的xmlns

[XmlRootAttribute(Namespace = "test")]  
public class MainNode 
{ 
    [XmlElement("SubNode")] 
    public SubNode SubNode { get; set; }  
} 

public class SubNode 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlElement("value")] 
    public string Value { get; set; } 
} 

反序列化失敗。我應該如何在我的子節點中包含名稱空間?

回答

2

你的方法有很多錯誤。希望這可以完全解決您的問題,但是這至少可以幫助您確定結構。

你有一個SubNode類與NameValue。如果你看看你的XML,你的<SubNode>不包含這些屬性/元素。這是您的<setting>節點。要解決此問題,您需要創建一個SubNodesetting類。

[XmlRoot(Namespace="http://test")] 
public class MainNode 
{ 
    [XmlElement(Namespace="test3")] 
    public SubNode SubNode { get; set; } 
} 

public class SubNode 
{ 
    [XmlElement("setting")] 
    public SettingsNode Settings { get; set; } 
} 

public class SettingsNode 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlAttribute("value")] 
    public string Value { get; set; } 
} 

通知的Namespace集上XmlElementAttribute財產SubNode。這應該強制所有孩子(除非特別覆蓋)它是該名稱空間的。

我不一定認爲你需要擔心xsi屬性,但如果你這樣做,我相信你將需要看看XmlNamespaceDeclarationsAttribute。這應該至少讓你的結構正確。

編輯:剛剛測試並做了一個小的更正。這似乎反序列化您的示例XML就好了。這是我的小測試:

void Main() 
{ 
    string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<MainNode xmlns=""http://test""> 
    <SubNode xmlns:xsi=""http://test2"" xmlns=""test3""> 
    <setting name = ""1"" value = ""2""/> 
    </SubNode> 
</MainNode>"; 

    var serializer = new XmlSerializer(typeof(MainNode)); 
    using (TextReader reader = new StringReader(xml)) 
    { 
     var result = (MainNode)serializer.Deserialize(reader); 
     Console.WriteLine(result.SubNode.Settings.Value); 
    } 
} 
+0

非常感謝你 – tom

相關問題