Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.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-данные, в которых содержится традиционная для нашей книги таблица с именами и телефонами, причем имена в этой телефонной табличке повторяются, например, строка с именем "Витя" содержит мобильный телефон, а потом по мере знакомства с этим Витей у нас появился уже и его домашний телефон. Задача состоит в том, чтобы в данной таблице телефонов (представленной в виде
//Программа создает типичный 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-данные, в которых содержится традиционная для нашей книги таблица с именами и телефонами, причем имена в этой телефонной табличке повторяются, например, строка с именем "Витя" содержит мобильный телефон, а потом по мере знакомства с этим Витей у нас появился уже и его домашний телефон. Задача состоит в том, чтобы в данной таблице телефонов (представленной в виде