23

Using 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

属性が逆シリアル化されない理由について完全に途方に暮れています。

4

4 に答える 4

41

そのためには、次の 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 ではなく文字列にする必要がある場合があります。

于 2013-01-09T20:35:32.063 に答える
1

TestElementonであるべき属性を on に定義していますTestXML。例:

@"<TestXML attr1=""MyAttr"" attr2=""1"">
      <TestElement>26</TestElement>
  </TestXML>"
于 2013-01-09T20:32:29.333 に答える
-1

オブジェクトをシリアル化/逆シリアル化するテストを実行したところ、問題なく動作するようです

テスト:

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

すべての属性が正常にデシリアライズされました。

結果:

ここに画像の説明を入力

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>
于 2013-01-09T20:49:45.297 に答える