gpt4 book ai didi

c# - 使用不同的根元素名称反序列化

转载 作者:数据小太阳 更新时间:2023-10-29 02:08:38 26 4
gpt4 key购买 nike

下面的例子给了我“[One xmlns=''] was not expected.”异常

public abstract class BaseClass{ }

[XmlRoot("One")]
public class ChildOne : BaseClass {}

[XmlRoot("Two")]
public class ChildTwo : BaseClass { }

class Program
{
private static void Main(string[] args)
{
var ser = new XmlSerializer(typeof (BaseClass), new Type[] {typeof (ChildOne), typeof (ChildTwo)});
var obj1 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><One></One>"));
var obj2 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><Two></Two>"));
}
}

我需要反序列化 XML(不是我生成的)。根标签可能有不同的名称,我必须将其映射到不同的类。

附言。我知道周围有很多这样的问题。我已经研究过了,但我的问题仍然没有解决。

最佳答案

没有围绕我的问题大肆宣传。社区可能认为这只是白痴问的另一个愚蠢问题。他们可能是对的。我必须自己回答,但要注意:答案也可能很愚蠢。

我最终探测了 XML 的根元素,然后将其映射到一种已知类型并使用该类型进行反序列化。像这样:

public abstract class BaseClass{ }

[XmlRoot("One")]
public class ChildOne : BaseClass {}

[XmlRoot("Two")]
public class ChildTwo : BaseClass { }

class Program
{
private static void Main(string[] args)
{
var known = new Type[] {typeof (ChildOne), typeof (ChildTwo)};
var obj1 = Deserialize<BaseClass>(@"<?xml version=""1.0""?><One></One>", known);
var obj2 = Deserialize<BaseClass>(@"<?xml version=""1.0""?><Two></Two>", known);
}

private static T Deserialize<T>(string xml, Type[] knownTypes)
{
Type rootType = typeof (T);

if (knownTypes.Any())
{
using (var reader = XmlReader.Create(new StringReader(xml)))
{
reader.MoveToContent();

rootType = (from kt in knownTypes
let xmlRoot = kt.GetCustomAttributes<XmlRootAttribute>().FirstOrDefault()
where kt.Name == reader.Name || (xmlRoot != null && xmlRoot.ElementName == reader.Name)
select kt).FirstOrDefault() ?? typeof(T);
}
}

return (T) new XmlSerializer(rootType, knownTypes).Deserialize(new StringReader(xml));
}
}

关于c# - 使用不同的根元素名称反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18116066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com