【发布时间】:2017-10-09 19:38:28
【问题描述】:
这会将 xml 样本反序列化为“XmlModel”类。
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
namespace XmlTest
{
public class DeserializeXml
{
public XmlModel GetXmlModel()
{
string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<root>
<foo>
<bar>1</bar>
<bar>2</bar>
</foo>
</root>";
var dS = new XmlSerializer(typeof(XmlModel));
var m = new XmlModel();
using (var reader = new StringReader(xml))
{
return (XmlModel) dS.Deserialize(reader);
}
}
}
[XmlRoot("root")]
public class XmlModel
{
[XmlArray("foo")]
[XmlArrayItem("bar")]
public List<string> Foo { get; set; }
}
}
这将得到模型:
var d = new DeserializeXml();
result = d.GetXmlModel();
我正在使用遗留代码,除了更改 XmlAttributes 之外,我无法更改 XmlModel 类。这是问题所在:实际的 Xml 没有“foo”节点:
string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<root>
<bar>1</bar>
<bar>2</bar>
</root>";
所以现在我的任务是让反序列化器吞下这个 xml 并输出类型 XmlModel。如果没有 Xslt 预处理或其他更复杂的方法,这可能吗?
【问题讨论】:
-
您可以反序列化为与 XML 匹配的格式,然后使用 AutoMapper 之类的内容“升级”它。不是超级性能,但我不知道您在该领域的要求是什么,它可能是可以接受的。
-
您还受到哪些其他限制?你可以使用不同的反序列化方法吗?
-
@Bradley Uffner 使用代理类 + 自动映射器是一种选择 - 但我认为会涉及一些努力 + 性能损失(比 XSLT prrprocessor 更多)。如果单纯的 XmlAttribute 技巧行不通(我希望他们能行),另一种序列化程序是我没有考虑过的一个选项,并且可能是一个解决方案。
-
XmlSerializer和Attributes可能有一些内置方法可以做到这一点。这是 .NET 的一个领域,我还没有真正探索过,所以我不确定。我只是想找出适合您的选项。 -
遗留代码可能一成不变,但 Xml 肯定不是。您是否考虑过在尝试反序列化之前临时修改 Xml(添加 Foo 根节点)?否则,在我看来,您将需要一个自定义反序列化器。
标签: c# xml xmlserializer