XML 命名空间不是其父命名空间的属性被反序列化为 null

XML attribute with namespace other than its parent's is deserialized as null

我正在尝试反序列化以下 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] 中),但它没有改变任何东西。我似乎无法做到这一点。如果我根本不使用命名空间(无论是在请求中还是在模型定义中),那么该值就可以正常读取。

我错过了什么?

您正在应用命名空间 "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; }
}