Розбирання XML даних за допомогою .NET та Visual Studio

Сьогодні в даній статті, я напишу про легкий спосіб аналізу XMLданих в .NET Framework.

В .NET є кілька засобів для аналізу XML, наприклад:

В цій статті я продемонструю створення XSD схеми та використання класу XmlSerializer. Для тих, хто не знайомий з XML, я рекомендую почитати про нього ось тут.

Часто дані передаються у вигляді XML з якогось інтернет сервісу, або як результат якоїсь програми, наприклад mstest.exe, за допомогою якого можна запустити існуючі юніт тести. Ось як виглядає звичайний XML:

<?xml version="1.0" encoding="utf-8" ?>
<ShopRepository>
    <Customers>
       <Customer Id="cust1" FirstName="John" LastName="Brench" Age="26"/>
       <Customer Id="cust2" FirstName="Brench" LastName="John" Age="62"/>
    </Customers>
    <Orders>
       <Order ProductName="Monitor" CustomerId="cust1"/>
       <Order ProductName="Monitor2" CustomerId="cust2"/>
    </Orders>
</ShopRepository>

В цьому XMLє два описаних об’єкти: Customer та Order, які зберігаються в відповідних колекціях: Customers та Orders.

Для того, щоб згенерувати XSD схему, нам потрібно лише відкрити ось цей файл за допомогою Visual Studio 2010 (в 2005 та 2008 також підтримується ця можливість) та вибрати в меню XML->Create Schema або натиснути на панелі інструментів кнопку Create XML Schema:

Після виконання цих дій, в вікні Visual Studio відкриється редактор XSD схеми:

З правого боку знаходиться панель XML Schema Explorer, на якій можна побачити структуру XML(в нашому випадку це ShopRepository, в якому знаходяться дві колекції: Customers та Orders.

Наступним кроком потрібно згенерувати клас, який буде відображати цю структуру. Для цього потрібно використати утиліту xsd.exe. Запустіть Visual Studio Command Promptта для зручності введіть D: або іншу назву існуючого локального диску, після чого ви зможете перейти в будь-яку папку на цьому диску, де ви зможете зберігати всі вхідні (.xsd) та вихідні (.cs) дані цієї програми.

Напишіть в командному рядку наступне:

xsd ShopRepository.xsd /classes /namespace:ShopData

Перший параметр вказує назву файлу зі схемою, другий дає команду згенерувати класи з цієї схеми, і третій встановлює простір імен, в якому ці класи будуть розміщені. Ось так виглядає шматок згенерованого класу:

namespace ShopData {
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class ShopRepository {
    private ShopRepositoryCustomer[] customersField;
    private ShopRepositoryOrder[] ordersField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Customer", IsNullable=false)]
    public ShopRepositoryCustomer[] Customers {
    get {
     return this.customersField;
        }
    set {
     this.customersField = value;
        }
    }

Тепер, для того щоб розпарсити XMLпросто виконайте наступний шматок коду:

static void Main(string[] args)
{
    XmlSerializer serializer = new XmlSerializer(typeof(ShopRepository));
    ShopRepository repository = (ShopRepository)serializer.Deserialize(new FileStream("..\\..\\ShopRepository.xml", FileMode.Open));
}

В цьому коді спочатку створюється екземпляр класу XmlSerializer, в який передається екземпляр класу Type для ShopRepository, після чого викликавши метод Deserialize. В цей метод передається сам XML файл у вигляді файлового потоку. Після десереалізації, використовуючи змінну repository класу ShopRepository, можна доступатись до отриманих даних, використовуючи об’єктну модель і звичайно IntelliSense. Такий підхід позбавляє розробників додаткових затрат на розбирання XMLдокументу та зменшує кількість помилок на етапі виконання, що є дуже важливим при роботі програми:

static void Main(string[] args)
{
    XmlSerializer serializer = new XmlSerializer(typeof(ShopRepository));
    ShopRepository repository = (ShopRepository)serializer.Deserialize(new FileStream("..\\..\\ShopRepository.xml", FileMode.Open));
    ShopRepositoryCustomer customer = repository.Customers[0];
    Console.WriteLine(customer.FirstName);
    Console.WriteLine(customer.LastName);
}

clip_image006

Тепер, коли ви вже знаєте легкий спосіб для парсінгу XML даних, можна сміливо приступати до реалізації ваших програм.

Advertisements

, , , ,

  1. #1 by Andriy on June 12, 2012 - 22:39

    Thanks! very useful article!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: