Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 963

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
XML-документа представляющего телефонную книгу

//Программа создает типичный XML-документ. С ее помощью можно разобраться в

// структуре XML-документа. В комментариях приведена терминология содержимого

//XML-документа: корневой элемент, вложенные элементы, имя элемента и его

//значение, а также атрибуты элемента, их имена и значения. XML-документ

//представляет телефонную книгу, содержащую имя контакта, номер домашнего

//телефона, а также мобильного. Программа после создания XML-документа

// отображает его на консоли, а также записывает его в файл. Если этот файл

// открыть с помощью MS Excel, то мы получим таблицу из трех столбцов,

using System;

using System.Xml.Linq;

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

namespace LinqСоздатьXML_документ

{

class Program

{

static void Main(string[] args)

{

Console.Title = "Корневой элемент XML-документа";

// Создаем новый XML-документ:

XDocument XMLдокумент = new XDocument(

// Комментарий в XML-документе:

new XComment("Телефонная_книга - это корневой элемент XML-документа:"),

new XElement("Телефонная_книга", // - имя корневого элемента

new XComment("Элемент СТРОКА содержит атрибут Контакт и два вложенных элемента"),

new XElement("СТРОКА", // - имя (Name) элемента

new XAttribute("Контакт", "Олег"),

new XElement("Домашний_телефон", "236-23-67"), // _ имя элемента и его значение

new XElement("Мобильный_телефон", "+7(495)625-31-43")),

new XComment("Атрибут Контакт имеет значение 'Прогноз погоды':"),

new XElement("СТРОКА",

new XAttribute("Контакт", "Прогноз погоды"), // - атрибут элемента СТРОКА

new XElement("Домашний_телефон", "001"),

new XElement("Мобильный_телефон", "")), // - имя элемента и его зачение (Value)
new XComment("Поскольку каждый элемент Контакт имеет атрибут и два вложенных=>"),

new XElement("СТРОКА",

new XAttribute("Контакт", "Борис Григорьевич"), // - имя атрибута - Контакт

new XElement("Домашний_телефон", "402-12-45"),

new XElement("Мобильный_телефон", "+7(495)536-79-94")),

new XComment("=> элемента, в MS Excel отобразится таблица с тремя колонками"),

new XElement("СТРОКА", new XAttribute("Контакт", "Света"), // - значение атрибута - Света

new XElement("Домашний_телефон", ""),

new XElement("Мобильный_телефон", "+7(495)615-24-41")))

) ;

// Сохранить XML-документ: XMLflOKyMeHT.Save(@"С:\Зиборов.XML"); Console.WriteLine(XMLдокумент); Console.ReadKey();

}

}

}

Чтобы понять текст программы, рассмотрим структуру полученного ХМL-файла, а для этого откроем этот файл с помощью Internet Explorer
(рис. 11.5).

Здесь весь XML-документ вложен в так называемый корневой элемент между начальным тегом <Телефонная_книга> и конечным тегом Телефонная_книга>. Четыре элемента строка вложены в корневой элемент. В соответствующей таблице MS Excel элементы строка будут представлять строку в таблице. В свою очередь элемент строка содержит в себе атрибут Контакт и два вложенных в него элемента, имена (Name) которых — Домашний_телефон и Мобильный_телефон. Именно поэтому в MS Excel отобразится таблица с тремя колонками (один атрибут и два элемента): "Контакт"."Домашний_телефон" и "Мобильный_телефон".



Рис. 11.5. XML-файл, открытый в Internet Explorer

Элемент может иметь один или несколько атрибутов (а может и не иметь, как, скажем, элемент Домашний_телефон), например, первый элемент строка имеет ат­рибут с именем (Name) Контакт и со значением атрибута (value) — 001.

После запуска данной программы будет выведено на консоль содержимое XML-документа (без XML-объявления), а также будет создан XML-файл. Открыв этот файл с помощью MS Excel, получим таблицу телефонных контактов (рис. 11.6).



Рис. 11.6. XML-файп, открытый в MS Excel

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

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

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

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



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

Как видно, XML-документ начинается с XML-объявления (XML declaration), в котором содержится информация о версии (version information parameter). А далее весь XML-документ состоит из вложенных друг в друга элементов. Элемент — это блок разметки между начальным тегом, например

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

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

Листинг 11.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 =

@"

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

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

<Дата>2010.05.15 06:30 UТСДата>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// этого элемента:

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

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

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

}

}

}



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

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

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



Рис. 11.9. Представление XML-данных в виде таблицы в MS Excel

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

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

Листинг 11.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 CтрокаXML =

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

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

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

Показатель>

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

<Дата>2010.05.15 06:30 UТСДата>

Показатель>

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

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

Показатель>

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

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

Показатель>

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

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

Показатель>

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

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

Показатель>

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

<Давление>760 мм рт стДавление>
Показатель>
МетеорологическиеПоказатели>";

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

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

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

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

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

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

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

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

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

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

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

select у.Value;

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

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

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

textBox1.Text = textBox1.Text + x;

}

}

}

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



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

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

Пример 81. Поиск строк (записей) в XML-данных с помощью LINQ-запроса

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