|
Программирование >> Программирование с использованием ajax
Таблица 25.2. Свойства, предназначенные для навигации по элементам XML Свойство Описание FirstChild LastChild ParentNode NextSibling HasChildNodes Возвращает первый дочерний элемент после данного. Если вы вспомните файл books .xml, приведенный ранее в этой главе, то в нем корневой элемент документа называется books, а следующий за ним - book. Таким образом, в этом документе первым дочерним по отношению к корневому элементу books является book: <books> @@1а Root node <book> @@la FirstChild nodeFirstChild возвращает объект XmlNode, и вы должны проверить тип возвращенного узла, потому что маловероятно, что он всегда будет экземпляром XmlElement. В примере books дочерним по отношению к элементу Title фактически является узел xmlText, представляющий текст Beginning Visual С#. Работает точно так же, как свойство FirstChild, за исключением того, что возвращает последний дочерний элемент текущего узла. В случае примера books последним дочерним элементом узла books также будет узел book, но представляющий книгу Professional С# 2nd Edition. <books> @@1а Root node <book> @@la FirstChild <title>Beginning Visual C#</title> <author>Karli Watson</author> <code>7582</code> </book> <book> @@la LastChild <title>Professional C# 2nd Edition</title> <author>Simon Robinson</author> <code>7043</code> </book> </books> Возвращает родителя текущего узла. В примере books узел books является родителем обоих узлов book В то время как свойства FirstChild и LastChild возвращают листовой узел текущего узла, узел NextSibling возвращает следующий узел, имеющий того же родителя. В случае примера books это означает, что NextSibling элемента title вернет элемент author, а вызов NextSibling на нем вернет элемент code Позволяет проверить наличие дочерних элементов у текущего элемента, не получая значения от FirstChild и не проверяя его на равенство null Используя четыре свойства из табл. 25.2, можно проходить по всему документу XmlDocument, как показано в следующем практическом занятии. Пра1СШческоезан11Тн ц прОХОДа ПО ВСем уЗЛЭМ ДОКуменТЭ XML В этом примере вы создадите небольшое приложение Windows Forms, которое пройдет циклом по всем узлам документа XML и напечатает имя элемента или, в случае элемента XmlText, текст, содержащийся в элементе. Этот код использует book. xml, который был представлен в разделе Схемы ранее в главе; если вы не создали этот файл во время изучения упомянутого раздела, найдите его в загружаемом коде. 1. Начните с создания нового приложения Windows Forms, выбрав пункт меню File=New=t>Project (Файл=>Создать=>Проект). В появившемся диалоговом окне выберите вариант Windows Application (Приложение Windows). Назовите проект LoopThroughXmlDocument и нажмите <Enter>. 2. Спроектируйте форму, как показано на рис. 25.3, перетащив на нее элементы управления ListBox и Button. Рис. 25.3. Форма приложения LoopThroughXmlDocument 3. Присвойте ListBox имя listBox3unlNodes, а кнопке - buttonLoopThroughDocument. 4. Выполните двойной щелчок на кнопке и введите приведенный ниже крд. Не забудьте добавить строку using System.Xml; в начало файла: private void buttonLoopThroughDocument Click(object sender, EventArgs e) { Очистить ListBox. listBoxXmlNodes.Items.Clear(); Загрузить документ XML. XmlDocument document = new XmlDocument() ; document.Load(0 C:\Beginning Visual C#\Chapter 25\Books.xml ); Использовать рекурсию для циклического прохода по документу. RecurseXmlDocument((XmlNode)document.DocumentElement, 0) ; private void RecurseXmlDocument(XmlNode root, int indent) { Если корень равен null, не делать ничего, if (root == null) return; if (root is XmlElement) Корень имеет тип XmlElement { Сначала напечатать имя. listBoxXmlNodes.Items.Add(root.Name.PadLeft(root.Name.Length + indent)); Затем проверить наличие дочерних элементов, и если они есть, вызвать этот метод снова для их распечатки, if (root.HasChildNodes) RecurseXmlDocument(root.FirstChild, indent + 2); И, наконец, проверить, есть ли соседние узлы, и если они есть, вызвать этот метолд снова для их распечатки, if (root.NextSibling != null) RecurseXmlDocument(root.NextSibling, indent); else if (root is XmlText) { Печатать текст. string text = ( (XmlText)root).Value; listBoxXmlNodes.Items.Add(text.PadLeft(text.Length + indent)); 5. Запустите приложение и щелкните на кнопке Loop (Цикл). Вы должны получить результат, показанный на рис. 25.4. books book Ube mhor Kar Watson code 7582 book Ute РгЫемюги1Сяаж1Е(Йюп author Senon Robinson code 7043 Puc. 25.4. Результат работы приложения LoopThroughXmlDocument Вывод не выглядит как корректный XML и очевидно таковым не является. Следует отметить, что когда вы проходите по элементам документа XML, то не встречаете ни одного закрывающего дескриптора. Другими словами, вы не беспокоитесь о том, являет ся ли текущий элемент открывающим или закрывающим дескриптором - XmlNode или XmlElement представляют узел целиком, а не являются представлениями дескриптора. Описание полученных результатов После щелчка на кнопке первое, что происходит - это вызов метода Load класса XmlDocument. Этот метод загружает XML из файла в экземпляр XmlDocument, который впоследствии используется для доступа к элементам XML. Затем вы вызываете метод, который позволяет пройти циклом по XML рекурсивно, передавая методу корневой узел документа XML. Корневой элемент получается из свойства DocumentElement класса XmlDocument. Помимо проверки на null переданного в метод RecurseXmlDocument параметра root, первая строка, на которую следует обратить внимание - это оператор if: if (root is XmlElement) Корень имеет тип XmlElement else if (root is XmlText) Напомним, что операция is позволяет проверить тип объекта и возвращает true, если экземпляр относится к указанному типу. Даже несмотря на то, что узел root объявлен как XmlNode, это всего лишь базовый тип объектов, с которыми вы будете работать. Используя операцию is для проверки типа объектов, код может определить тип объекта во время выполнения и вести себя соответственно.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |