2017-12-18 14 views
1

としてデシリアライズされます。XML属性は、私はXML、以下のデシリアライズしようとしている、ヌル

[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はHttpRequestMessage内で、HTTPのPOSTリクエストのボディとして来るオブジェクト:

は、私は2つのクラスがあります。デシリアライズするための機能は次のとおりです。

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#属性のNamespaceパラメータを少し試してみました(たとえば、[XmlAttribute]に移動するか、[XmlType]と[XmlAttribute]の両方に配置します)、何も変更しませんでした。私はこの権利を作るように見えることはできません。私が名前空間を全く使わない(要求とモデル定義の両方で)場合、値はちゃんと読み込まれます。

私には何が欠けていますか?

答えて

1

あなたは、ないそのvalue属性にネームスペース"http://sub.com"要素Childを適用しています。 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

ありがとうございました。どういうわけか、私はこの仕組みについて誤った考えを持っていました。つまり、クラス全体に名前空間を配置すると、すべてのメンバーにとってデフォルトになります。このように、私はParent NamespaceがChildのデフォルトであり、Child Namespaceは実際にはValueのデフォルトとして機能すると考えました... しかし、それは明らかにそうではありません。主な混乱は...どのような場合に、ネームスペースをメンバーに置くべきか? – Sushi271

+1

あなたはあなたのXMLにそれらがある名前空間を配置します。 – Sefe

+0

これは、 'http:// main.com'名前空間をChildクラスまたはParentのChildプロパティに置くことができることを意味しますか?それは問題ではありませんか?彼らはちょっと同じものを表します。 – Sushi271

関連する問題