Pull to refresh

Чтение XML-файлов в .NET с использованием сгенерированных по XSD-схеме классов

Lumber room
Изучал на досуге код Парсер математических выражений и увидел, что XML-файлы читаются, проверяются и разбираются «вручную», используя XmlDocument.

Теперь, на простом примере, расскажу, как это делаю я.

Допустим, что у нас должно получится приложение, хранящее список зверей. Хранить оно его будет в XML-файле, соответствующем следующей схеме:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema1.xsd" xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="animals" type="AnimalsConfiguration" />
 <xs:complexType name="AnimalsConfiguration">
  <xs:choice minOccurs="0" maxOccurs="unbounded">
   <xs:element name="animal" />
   <xs:element name="anotherAnimal" />
  </xs:choice>
 </xs:complexType>
</xs:schema>

* This source code was highlighted with Source Code Highlighter.

И, как пример, файл, соответствующий этой схеме:
<?xml version="1.0" encoding="utf-8" ?>
<animals xmlns="http://tempuri.org/XMLSchema1.xsd">
 <animal />
 <animal />
 <anotherAnimal />
 <animal />
</animals>


* This source code was highlighted with Source Code Highlighter.


Требуется получить список животных, содержащихся в файле.

Для начала по XSD-схеме нужно получить вспомогательный cs класс. Для этого воспользуемся утилитой xsd.exe.

«c:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe» /c /l:CS /n:TryXmlRead AnimalsXMLSchema.xsd

Это значит создание файла в формате cs, классы которого будут расположены в пространстве имён TryXmlRead на основе файла схемы AnimalsXMLSchema.xsd. В результате работы этой утилиты получим:
namespace TryXmlRead {
  using System.Xml.Serialization;
  
  /// <remarks/>
  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
  [System.SerializableAttribute()]
  [System.Diagnostics.DebuggerStepThroughAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/XMLSchema1.xsd")]
  [System.Xml.Serialization.XmlRootAttribute("animals", Namespace="http://tempuri.org/XMLSchema1.xsd", IsNullable=false)]
  public partial class AnimalsConfiguration {
    
    private object[] itemsField;
    
    private ItemsChoiceType[] itemsElementNameField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("animal", typeof(object))]
    [System.Xml.Serialization.XmlElementAttribute("anotherAnimal", typeof(object))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public object[] Items {
      get {
        return this.itemsField;
      }
      set {
        this.itemsField = value;
      }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType[] ItemsElementName {
      get {
        return this.itemsElementNameField;
      }
      set {
        this.itemsElementNameField = value;
      }
    }
  }
  
  /// <remarks/>
  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
  [System.SerializableAttribute()]
  [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/XMLSchema1.xsd", IncludeInSchema=false)]
  public enum ItemsChoiceType {
    
    /// <remarks/>
    animal,
    
    /// <remarks/>
    anotherAnimal,
  }
}


* This source code was highlighted with Source Code Highlighter.


Теперь для чтения файла со списком животных в программе достаточно сделать:
using (FileStream stream = new FileStream("XMLFile.xml", FileMode.Open))
{
  XmlSerializer formatter = new XmlSerializer(typeof(AnimalsConfiguration));
  return (AnimalsConfiguration)formatter.Deserialize(stream);
}


* This source code was highlighted with Source Code Highlighter.


Всё, файл будет прочитан, проверен на соответствие схеме и на его основе будет создан объект, с которым впоследствии можно делать что угодно.
Tags:
Hubs:
Total votes 15: ↑9 and ↓6 +3
Views 1.5K
Comments Comments 14