Подтвердить что ты не робот

Десериализация файла XML с несколькими атрибутами элемента - атрибуты не десериализуются

Использование С#.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

При полной потере того, почему атрибуты не будут десериализоваться.

4b9b3361

Ответ 1

Для этого вам нужны два уровня:

[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.

Ответ 2

Вы определяете атрибуты на TestElement, пока они должны быть на TestXML. Пример:

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

Ответ 3

Я просто проверил сериализацию/десериализацию вашего объекта, и, похоже, он отлично работает

Тест:

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>

Ответ 4

В качестве дополнительной заметки к принятому ответу. Убедитесь, что элемент xml не содержит атрибут nil = "true", например:

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

Из моего опыта десериализатор не будет десериализовать атрибуты элемента, помеченного как null (nil).