2

我想将我的数据存储在这样的 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 的答案。

4

2 回答 2

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; }
}
于 2012-06-23T01:19:13.260 回答
2

作为一个非常基本的示例,您可以看一下:

注意(xml 与您所描述的不太一样,但您需要摆弄 xml 属性以使其完全按照您的意愿行事,但是在结构上它代表了您所要求的场景,即是的,这是可能的)

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());
                }
            }
        }
    }

于 2012-06-23T01:17:17.843 回答