我想将我的数据存储在这样的XML中:
<MyType name="A">
<MyType name="B" />
<MyType name="E" />
<MyType name="C">
<MyType name="D">
<MyType name="G">
</MyType>
</MyType>
MyType应该是一个包含其他MyType实例数组的类。是否可以反序列化这样的类(使用System.Xml.Serialization.XmlSerializer)或者我是否必须使用自己的解析器加载它?
此外,是否可以使用自定义标头从xml反序列化,即。 “而不是?TY的答案。
答案 0 :(得分:3)
我认为xml不正确。 D和G没有关闭。 有了这个xml,
<MyType name="A">
<MyType name="B" />
<MyType name="E" />
<MyType name="C">
<MyType name="D" />
<MyType name="G" />
</MyType>
</MyType>
您可以使用此类对其进行反序列化:
[Serializable]
public class MyType
{
[XmlElement(ElementName="MyType")]
public List<MyType> Types { get; set; }
[XmlAttribute(AttributeName="name")]
public string Name { get; set; }
}
答案 1 :(得分:2)
作为一个非常基本的例子,您可以看一下:
注意(xml并不像你所描述的那样,但你需要摆弄xml属性才能让它完全符合你的要求,但结构上它代表了你要求的场景,即是的,这是可能的)< / p>
class Program
{
static void Main(string[] args)
{
var mytypeTest = new MyType
{
Name = "a",
MyTypes = new List<MyType>
{
new MyType
{
Name = "b"
}
}.ToArray()
};
var xml = mytypeTest.Serialize();
var result = xml.Deserialize<MyType>();
}
}
public class MyType
{
[XmlAttribute]
public string Name { get; set; }
[XmlElement(ElementName="MyType")]
public MyType[] MyTypes { get; set; }
}
public static class XmlSerializerExtensions
{
public static T Deserialize<T>(this string xml) where T : new()
{
var _serializer = new XmlSerializer(typeof(T));
using (var _stringReader = new StringReader(xml))
{
using (XmlReader _reader = new XmlTextReader(_stringReader))
{
return (T)_serializer.Deserialize(_reader);
}
}
}
public static string Serialize<T>(this T value) where T : new()
{
var _serializer = new XmlSerializer(typeof(T));
using (var _stream = new MemoryStream())
{
using (var _writer = new XmlTextWriter(_stream, new UTF8Encoding()))
{
_serializer.Serialize(_writer, value);
return Encoding.UTF8.GetString(_stream.ToArray());
}
}
}
}