像这样对XML文件进行映像:
<?xml version="1.0" encoding="UTF-16"?>
<treffer>
<prod_internid>123456789</prod_internid>
<md_nr>123123</md_nr>
<md_mart_id>4</md_mart_id>
<md_mtyp_nr>9876</md_mtyp_nr>
<mra_th>
<ie_th_pth>-1</ie_th_pth>
<ie_th_ea_bez>Fehler: Keine Angabe</ie_th_ea_bez>
</mra_th>
</treffer>
如您所见,<md_XY></md_XY>
有三个标签。
我想将它们反序列化为一个看起来像这样的对象:
public class DeMedienXmlDto
{
[XmlElement("md_nr")]
public int MedienNr { get; set; }
[XmlElement("md_mart_id")]
public int MedienArtId { get; set; }
[XmlElement("md_mtyp_nr")]
public string MedienTypId { get; set; }
}
但这应该是整个反序列化对象的属性:
[XmlRoot("treffer")]
public class DeAnalyseArtikelXmlDto
{
[XmlElement("prod_internid")]
public long ArtikelId { get; set; }
[XmlElement("treffer")]
public DeMedienXmlDto Medium { get; set; }
[XmlElement("mra_th")]
public List<DeThemenXmlDto> Themen { get; set; }
}
我尝试使用Medium
对[XmlElement("treffer")]
属性进行注释,因为这些代码是<treffer>
的子代,但是没有用...
反序列化<mra_th>...</mra_th>
,因为我可以使用分组标记对列表进行注释,但我没有<md...>
这样的标记。
我的xml反序列化器如下所示:
public class XmlDeserializer : IXmlDeserializer
{
public T Deserialize<T>(string xmlFilename)
{
var returnObject = default(T);
if (string.IsNullOrEmpty(xmlFilename)) return default(T);
try
{
var xmlStream = new StreamReader(xmlFilename);
var serializer = new XmlSerializer(typeof(T));
returnObject = (T)serializer.Deserialize(xmlStream);
}
catch (Exception exception) {
LogHelper.LogError($"Das XML-File {xmlFilename} konnte nicht deserialisiert werden: {exception.Message}");
throw;
}
return returnObject;
}
}
提前致谢
修改(澄清):
我希望将以下标记反序列化为DeMedienXmlDto
类型的对象:
<md_nr>
<md_mart_id>
<md_mtyp_nr>
答案 0 :(得分:1)
这不是XmlSerializer
的工作原理。类结构必须对应于XML的结构才能自动工作。
此:
[XmlElement("treffer")]
public DeMedienXmlDto Medium { get; set; }
不起作用,因为没有嵌套 <treffer>
元素。 XmlElementAttribute
不能表示父(周围)元素。
如何解决您的情况有两种选择:
DeAnalyseArtikelXmlDto
上实施IXmlSerializable
并自行解析内部XML。