2013-01-09 23 views
13

をデシリアライズされていない - 私のクラス定義のXMLサンプルを(実サンプルは6つの属性を持っている)複数の要素を持つXMLファイルをデシリアライズする属性 - 属性はC#。ネット4を使用して

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="">25</TestElement> 
</TestXML> 

私は、次のしている:

public class TestXML() { 
    public TestXML() {} 

    public int TestElement {get; set;} 
    [XmlAttribute] 
    public string attr1 {get; set;} 
    [XmlAttribute] 
    public string attr2 {get; set;} 
    [XmlIgnore] 
    public DateTime DateAdded {get; set;} 
    [XmlAttribute("DateAdded")] 
    public string dateadded { 
     get{ return (DateAdded == null ? "" : DateAdded.ToString();} 
     set{ if(!value.Equals("")) DateAdded = DateTime.Parse(value);} 
    } 
} 

デシリアライズするためのコード:

今、私たちが得る結果は(VSでオブジェクトを見ている
string xml = "<TestXML><TestElement attr1=\"MyAttr\" attr2=\"1\" DateAdded=\"\">26</TestElement></TestXML>" 
using (StringReader sr = new StringReader(xml)) { 
    XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
    TestXML myxml = (TestXML)serializer.Deserialize(sr); 
} 

):

myxml 
    attr1   | null 
    attr2   | null 
    TestElement | 25 

属性がデシリアライズされない理由を完全に失います。

+1

」は、** public int TestElement {get; set;}のみを指します。 –

+0

この質問の目的は、XMLを正しく動作させるコードを取得することです。 –

答えて

23

は、次の2つのレベル必要があることを行うには:> 26 <があまりにも(空白)問題を引き起こす可能性があること

[XmlRoot("TestXML")] 
public class TestXml { 
    [XmlElement("TestElement")] 
    public TestElement TestElement { get; set; } 
} 

public class TestElement { 
    [XmlText] 
    public int Value {get;set;} 

    [XmlAttribute] 
    public string attr1 {get;set;} 

    [XmlAttribute] 
    public string attr2 {get;set;} 
} 

注意を。あなたはintの代わりに文字列にする必要があります。

+0

値の周りのスペースを訂正し、2つのクラスに再フォーマットしましたが、最初のクラスの参照変数はnullに戻ります。 –

+0

@pyTeaParty「public TestElement {get; set;}」を次のように変更します:public TestElement TestElement {get; set;} '。 – Mir

+0

ああ、要素名のマッチングについて忘れてしまったので、2つのクラスが私の大きなテストの解決策です。@Eve –

2

属性はTestElementに定義されていますが、それらはTestXMLである必要があります。例:

@"<TestXML attr1=""MyAttr"" attr2=""1""> 
     <TestElement>26</TestElement> 
    </TestXML>" 
+0

XMLの書式は正しいです。クラス定義に問題があると思われます。他の例は同じ設定を1つの属性だけを除いて示しているので、何を行う必要があるか分かりません。 –

+0

@pyTeaParty XMLは構文的には正しいですが、コードに適合させたいのか、それともうまくいかなかったのかを理解したいのかどうかはわかりません。彼のコードがXMLのどのように機能するべきかを指摘することは有用であると思っていました。 – Mir

+0

XMLで作業するコードを取得しようとしていますが、私は何をしようとしています。 –

0

私はちょうどあなたのオブジェクトをデシリアライズ/シリアライズテストを実行し、正常に

テストに動作するようです:

TestXML obj = new TestXML{ attr1 = "Attrib1", attr2 = "Attrib2", DateAdded = DateTime.Now, TestElement = 44}; 

XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.OpenOrCreate)) 
{ 
    serializer.Serialize(stream, obj); 
} 

using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open)) 
{ 
    TestXML myxml = (TestXML)serializer.Deserialize(stream); 
} 

すべての属性がOK直列化復元。

結果:

enter image description here

のXml:受け入れ答えに追加の注意点としては

<?xml version="1.0"?> 
<TestXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attr1="Attrib1" attr2="Attrib2" DateAdded="10/01/2013 9:46:23 a.m."> 
    <TestElement>44</TestElement> 
</TestXML> 
+0

もっと見る私はあなたが最初にオブジェクトをシリアル化するのを見ます。私のクラス定義が間違っているので、明らかにxmlは一致しません。 –

0

。 XML要素は、このようなゼロ=「true」属性が含まれていないことを確認してください:私の経験から

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="" xsi:nil="true">25</TestElement> 
</TestXML> 

をデシリアライザはヌル(ゼロ)としてマークされた要素の属性をデシリアライズしません。

関連する問題