Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Извлечение значения элемента из XML-документа

Поиск

В данном примере, решая задачу, мы получили строку XML-данных, например от удаленной Web-службы, обеспечивающей прогнозом погоды. В этой текстовой XML-строке содержатся метеорологические показатели на заданный нами район для текущей даты. В данной задаче мы извлекаем из этих XML-данных только зна­чение температуры.

Несколько слов о структуре XML-документа (рис. 19.7).

Рисунок 19.7 - Содержимое XML-файла с метеорологическими показателями

Как видно, XML-документ начинается с XML-объявления (XML declaration), в котором содержится информация о версии (version information parameter). А далее весь XML-документ состоит из вложенных друг в друга элементов. Элемент — это блок разметки между начальным тегом, например <Город>, и конечным тегом </Город>. Самый внешний элемент, в данном случае — это тег <МетеорологическиеПоказатели>, его называют корневым элементом (root element). Как видите, этот корневой элемент содержит в себе все показатели, и, таким образом, глубина вложенности этой иерархии равна двум. Вообще говоря, глубина вложенности та­кого XML-дерева может быть практически любой.

Итак, задача поставлена, сущность XML-данных понятна, приступаем к реше­нию задачи. Для этой цели после запуска Visual Studio 2010 выберем проект шаб­лона Windows Forms Application, укажем имя Name — Linq3. Далее, попав в кон­структор формы, из панели элементов Toolbox (Панель элементов) перетащим текстовое поле TextBox для вывода в него строки с данными XML и значения температуры из соответст­вующего элемента XML-дерева. Поскольку мы предполагаем вывод в текстовое поле не одной, а нескольких строчек, в свойствах объекта textBox1 укажем true напротив свойства Multiline. Затем на вкладке программного кода введем текст, представленный в листинге 19.6.

Листинг 19.6. Извлечение значения элемента из XML-данных

// Дана строка XML, содержащая прогнозные метеорологические показатели для

// г. Москвы на заданную дату. Программа извлекает из корневого элемента

// XML-документа значение температуры элемента "Температура":

using System.Windows.Forms;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace Linq3

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

this.Text = "LINQ-запрос к XML-данным"; textBox1.Multiline = true;

string СтрокаXML =

@"<?xml version=""1.0""?>

<МетеорологическиеПоказатели>

<Город>Москва</Город>

<Дата>2010.05.15 06:30 UTC</Дата>

<Температура> 64 F (18 C)</Температура>

<Ветер>Сев-Вост 8 м/сек</Ветер>

<Видимость>12 км</Видимость>

<Влажность> 72%</Влажность>

<Давление>760 мм рт ст</Давление>

</МетеорологическиеПоказатели>";

// Загрузка корневого элемента из строки, содержащей XML:

var КорневойЭлемент = System.Xml.Linq.XElement.Parse(СтрокаXML);

// Или корневой элемент XML-документа получаем через файл:

// Записываем строку, содержащую XML в файл:

// System.IO.File.WriteAllText("ПоказателиПогоды.xml", СтрокаXML);

// Загружаем корневой элемент XML:

// var КорневойЭлемент = System.Xml.Linq.

// XElement.Load("ПоказателиПогоды.xml");

// Из корневого элемента извлекаем вложенный в него элемент

// "Температура" и получаем соответствующее значение (Value) этого

// элемента:

string Температура = КорневойЭлемент.Element("Температура").Value;

textBox1.Text = "Строка XML:\r\n\r\n" + СтрокаXML + "\r\n\r\n";

textBox1.Text += "Значение температуры = " + Температура;

}

}

}

В начале текста программы задаем текстовую строку, содержащую XML- данные. Далее, используя метод Parse класса XElement пространства имен Linq, получаем корневой элемент XML-документа. В комментарии показано, как можно получить корневой элемент через запись/чтение XML-файла. Затем с помощью ме­тода Element извлекаем значение (Value) элемента температура, которое выводим в текстовое поле.

Фрагмент работы программы приведен на рис. 19.8.

Рисунок 19.8 - Извлечение значения элемента из XML-документа

Рисунок 19.9 - Представление XML-данных в виде таблицы в MS Excel

Убедиться в работоспособности программы можно, открыв решение Linq3.sln папки Linq3.

Теперь решим похожую задачу по извлечению значения элемента, но пусть XML-данные представлены в другой форме, а именно каждый метеорологический показатель вложим в один и тот же элемент <Показатель> </Показатель>, в этом случае глубина вложенности элементов будет уже равна трем (см. листинг 19.7). Естественно спросить: что мы будем с этого иметь? Дело в том, что если соответ­ствующий XML-файл открыть с помощью табличного редактора MS Excel, то мы сможем увидеть эти XML-данные в виде наглядной таблицы, даже не ссылаясь на таблицу стилей — файл XSLT (не путать с XLS-файлом), см. рис. 19.9.

Теперь для получения значения температуры удобно воспользоваться типовым LINQ-запросом (листинг 19.7).

Листинг 19.7. Извлечение значения элемента из XML-данных

// Дана строка XML, которая содержит прогнозные метеорологические показатели для

// г. Москвы на заданную дату. При этом каждый метеорологический показатель вложен

// в один и тот же элемент <Показатель> </Показатель>. Это обеспечивает удобный

// просмотр соответствующего XML-файла в MS Excel в виде таблицы. Программа находит

// в корневом элементе данного XML-документа элемент "Температура" и извлекает из

// него значение температуры.

using System.Windows.Forms;

using System.Linq;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Linq4

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

this.Text = "LINQ-запрос к XML-данным"; textBox1.Multiline = false;

// Инициализация XML-строки:

string СтрокаXML =

@"<?xml version=""1.0""?>

<МетеорологическиеПоказатели>

<Показатель>

<Город>Москва</Город>

</Показатель>

<Показатель>

<Дата>2010.05.15 06:30 UTC</Дата>

</Показатель>

<Показатель>

<Температура> 64 F (18 C)</Температура>

</Показатель>

<Показатель>

<Ветер>Сев-Вост 8 м/сек</Ветер>

</Показатель>

<Показатель>

<Видимость>12 км</Видимость>

</Показатель>

<Показатель>

<Влажность> 72%</Влажность>

</Показатель>

<Показатель>

<Давление>760 мм рт ст</Давление>

</Показатель>

</МетеорологическиеПоказатели>";

var КорневойЭлемент = System.Xml.Linq.XElement.Parse(СтрокаXML);

// Или корневой элемент получаем через файл:

// Записываем строку, содержащую XML в файл:

// System.IO.File.WriteAllText("ПоказателиПогоды2.xml", СтрокаXML);

// Загружаем корневой элемент:

// var КорневойЭлемент = System.Xml.Linq.XElement.Load(

// "ПоказателиПогоды2.xml");

// Запрос - это коллекция (список) строк, куда извлекаем значение

// (Value) элемента "Температура":

var Запрос = from x in КорневойЭлемент.Elements("Показатель")

from y in x.Elements("Температура")

select y.Value;

// Таких строк в коллекции Запрос - одна

textBox1.Text = "Значение температуры = ";

foreach (var x in Запрос)

textBox1.Text = textBox1.Text + x;

}

}

}

Как видно из программного кода, поиск организован в двух уровнях (два пред­ложения from), сначала выбор в коллекцию всех элементов Показатель, а затем из этой коллекции поиск элементов Температура. Результат запроса записывается в коллекцию строк, где имеем ровно одну строку. Фрагмент работы программы по­казан на рис. 19.10.

Рисунок 19.10 - LINQ-запрос к XML-документу

Убедиться в работоспособности программы можно, открыв решение Linq4.sln из папки Linq4.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 658; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.50.1 (0.007 с.)