Десериализация файла 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
При полной потере того, почему атрибуты не будут десериализоваться.
Ответы
Ответ 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).