从非嵌套反序列化为对象 xml
Deserialize into object from not nested xml
像这样对 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; }
}
我试过用 [XmlElement("treffer")]
注释 Medium
属性 因为标签是 <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>
这不是 XmlSerializer
的工作方式。 class 结构 必须 对应 XML 结构才能自动工作。
这个:
[XmlElement("treffer")]
public DeMedienXmlDto Medium { get; set; }
不起作用,因为没有 nested <treffer>
元素。 XmlElementAttribute
不能表示父(周围)元素。
有两个选项可以解决您的问题:
- 使用一组单独的 classes 进行反序列化,并使用另一组表示您的 DTO 对象。然后您需要创建一个映射。
- 在
DeAnalyseArtikelXmlDto
上实现 IXmlSerializable
并自己解析内部 XML。
像这样对 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; }
}
我试过用 [XmlElement("treffer")]
注释 Medium
属性 因为标签是 <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>
这不是 XmlSerializer
的工作方式。 class 结构 必须 对应 XML 结构才能自动工作。
这个:
[XmlElement("treffer")]
public DeMedienXmlDto Medium { get; set; }
不起作用,因为没有 nested <treffer>
元素。 XmlElementAttribute
不能表示父(周围)元素。
有两个选项可以解决您的问题:
- 使用一组单独的 classes 进行反序列化,并使用另一组表示您的 DTO 对象。然后您需要创建一个映射。
- 在
DeAnalyseArtikelXmlDto
上实现IXmlSerializable
并自己解析内部 XML。