2017-12-18 271 views
1

我试图反序列化下面的XML:XML属性被反序列化空

<nsMain:Parent xmlns:nsMain="http://main.com"> 
    <nsMain:Child xmlns:nsSub="http://sub.com" nsSub:value="foobar" /> 
</nsMain:Parent> 

注意属性的命名空间比这两个元素的命名空间不同。

我有两个类:

[XmlRoot(ElementName = "Parent", Namespace = "http://main.com")] 
public class Parent 
{ 
    [XmlElement(ElementName = "Child")] 
    public Child Child{ get; set; } 
} 

[XmlType(Namespace = "http://sub.com")] 
public class Child 
{ 
    [XmlAttribute(AttributeName = "value")] 
    public string Value { get; set; } 
} 

的XML是作为一个HTTP POST请求的身体,里面HttpRequestMessage对象。对于反序列化功能是:

private Parent ExtractModel(HttpRequestMessage request) 
{ 
    var serializer = new XmlSerializer(typeof(Parent)); 
    var model = (Parent)serializer.Deserialize(request.Content.ReadAsStreamAsync().Result); 
    return model; 
} 

然而,在调用这个函数似乎model.Child.Value == null后。我试图用C#属性的名称空间参数对类和属性进行实验(例如,将它移动到[XmlAttribute],或者放在[XmlType]和[XmlAttribute]中),但它没有改变任何东西。我似乎无法做到这一点。如果我根本不使用命名空间(无论是在请求中还是在模型定义中),那么这个值就会很好。

我错过了什么?

回答

1

你申请你的命名空间"http://sub.com"元素Child,而不是它的value属性。在您的XML中,您特别将"http://main.com"应用于ParentChild。你可以像这样修复你的命名空间:

[XmlRoot(ElementName = "Parent", Namespace = "http://main.com")] 
public class Parent 
{ 
    [XmlElement(ElementName = "Child")] 
    public Child Child{ get; set; } 
} 

[XmlType(Namespace = "http://main.com")] 
public class Child 
{ 
    [XmlAttribute(AttributeName = "value", Namespace = "http://sub.com")] 
    public string Value { get; set; } 
} 
+0

谢谢,它的工作。不知怎的,我有一个关于这是如何工作的误导的想法。我的意思是......如果你把一个名字空间放在整个类上,它就会成为其所有成员的默认值。通过这种方式,我认为父命名空间是它的Child的默认名称,并且子命名空间实际上作为Value的默认值工作... 但是,情况并非如此。主要的困惑是...在哪些情况下,应该把名称空间放在成员上,并且放在类中? – Sushi271

+1

您将XML中的名称空间放在您拥有的名称空间中。 – Sefe

+0

这是否意味着我可以将'http:// main.com'命名空间放在Parent类中的Child类或Child属性中(它应该没有关系)?他们有点代表相同。 – Sushi271