【问题标题】:IXmlSerializable, reading xml tree with many nested elementsIXmlSerializable,读取带有许多嵌套元素的 xml 树
【发布时间】:2009-06-26 19:33:34
【问题描述】:

你们能给我举个例子,如何像这样读写 xml:

<Foolist>
   <Foo name="A">
     <Child name="Child 1"/>
     <Child name="Child 2"/>
   </Foo> 
   <Foo name = "B"/>
   <Foo name = "C">
     <Child name="Child 1">
       <Grandchild name ="Little 1"/>
     </Child>
   </Foo>
<Foolist>

【问题讨论】:

    标签: c# xml-serialization ixmlserializable


    【解决方案1】:

    元素名称真的每级都会改变吗?如果没有,你可以使用一个非常简单的类模型和XmlSerializer。实现IXmlSerializable 是……很棘手;并且容易出错。除非您绝对必须使用它,否则请避免使用它。

    如果名称不同但死板,我会通过 xsd 运行它:

    xsd example.xml
    xsd example.xsd /classes
    

    对于没有IXmlSerializableXmlSerializer 示例(每个级别的名称相同):

    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;
    
    [XmlRoot("Foolist")]
    public class Record
    {
        public Record(string name)
            : this()
        {
            Name = name;
        }
        public Record() { Children = new List<Record>(); }
        [XmlAttribute("name")]
        public string Name { get; set; }
    
        [XmlElement("Child")]
        public List<Record> Children { get; set; }
    }
    
    static class Program
    {
        static void Main()
        {
            Record root = new Record {
                Children = {
                    new Record("A") {
                        Children = {
                            new Record("Child 1"),
                            new Record("Child 2"),
                        }
                    }, new Record("B"),
                    new Record("C") {
                        Children = {
                            new Record("Child 1") {
                                Children = {
                                    new Record("Little 1")
                                }
                            }
                        }
                    }}
                };
            var ser = new XmlSerializer(typeof(Record));
            ser.Serialize(Console.Out, root);
        }
    }
    

    【讨论】:

    • 但是如果 Record 继承自其他类的哪些成员我不想序列化?
    • 然后将子成员标记为 [XmlIgnore];或切换到 DataContractSerializer 并挥手再见以控制布局;或者有一组单独的“DTO”类。我希望 DTO 路线是最好的选择。
    • 我还在考虑使用 IXmlSerializable。据我了解,xmlreader 的唯一问题是“仅转发”。而且我找不到任何(反)序列化的示例,不仅仅是平面 xml 文件,还有一些结构。
    • 您可以尝试在 Google 上搜索更多 IXmlSerializable 实现的示例,例如 paltman.com/2006/jul/03/ixmlserializable-a-persistable-example。但是为像你帖子中的那个类实现 IXmlSerializable 是矫枉过正的。另外,不要忘记您不需要为层次结构中的 all 类实现 IXmlSerializable - 您可以从一个普通的 XmlSerializer 开始,然后只为特定的子节点实现 IXmlSerializable(如果需要) .
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多