Изучал на досуге код Парсер математических выражений и увидел, что XML-файлы читаются, проверяются и разбираются «вручную», используя XmlDocument.
Теперь, на простом примере, расскажу, как это делаю я.
Допустим, что у нас должно получится приложение, хранящее список зверей. Хранить оно его будет в XML-файле, соответствующем следующей схеме:
И, как пример, файл, соответствующий этой схеме:
Требуется получить список животных, содержащихся в файле.
Для начала по 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. В результате работы этой утилиты получим:
Теперь для чтения файла со списком животных в программе достаточно сделать:
Всё, файл будет прочитан, проверен на соответствие схеме и на его основе будет создан объект, с которым впоследствии можно делать что угодно.
Теперь, на простом примере, расскажу, как это делаю я.
Допустим, что у нас должно получится приложение, хранящее список зверей. Хранить оно его будет в 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.
Всё, файл будет прочитан, проверен на соответствие схеме и на его основе будет создан объект, с которым впоследствии можно делать что угодно.