web-dev-qa-db-ja.com

複数の要素属性を持つXMLファイルの逆シリアル化-属性は逆シリアル化されません

C#.Net 4の使用-XMLサンプル(実際のサンプルには6つの属性があります)

<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);}
   }
}

逆シリアル化するコード:

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);
}

今私たちが得る結果は(VSでオブジェクトを表示する)です:

myxml
  attr1         |  null
  attr2         |  null
  TestElement   |  25

なぜ属性が逆シリアル化されないのかについての完全な損失。

19
Amazing Grace

そのためには、2つのレベルが必要です。

[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;}
}

> 26 <も問題を引き起こす可能性があります(空白)。あなたはそれがintの代わりに文字列である必要があるかもしれません。

31
Marc Gravell

TestElementにあるはずの属性をTestXMLに定義しています。例:

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