2009-06-26 3 views
1

Не могли бы вы, ребята, дайте мне пример того, как читать и писать из/в XML, как это:IXmlSerializable, чтение 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> 
+0

(ответил комментировать) –

ответ

2

ли имя элемента действительно изменить на уровне? Если нет, вы можете использовать очень простую модель класса и XmlSerializer. Реализация IXmlSerializable - это ... сложно; и подвержены ошибкам. Избегайте его, если вы не должны его использовать.

Если имена разные, но жесткие, я бы просто запустить его через XSD:

xsd example.xml 
xsd example.xsd /classes 

Для получения XmlSerializer без IXmlSerializable примера (одинаковые имена на каждом уровне):

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); 
    } 
} 
+0

Но если запись унаследована от другого класса, члены которой я не хочу сериализовать? – Agzam

+0

Затем отметьте дочерние элементы как [XmlIgnore]; или переключитесь на DataContractSerializer и до свидания, чтобы управлять макетом; или иметь отдельный набор классов DTO. Я ожидаю, что маршрут DTO - лучший вариант. –

+0

Я все еще думаю об использовании IXmlSerializable. единственная проблема, что, как я понял, xmlreader - это «только вперед». И я не могу найти пример сериализации (de) не только плоского файла xml, но и некоторой структуры. – Agzam