3. Исполнение Document Object Model (DOM)
Микрософт .NET Framework SDK использует W3C Document object
Model (DOM) level 1 Core и Core DOM Level 2. DOM - это
memory-resident (кэш) представление дерева Xml документа и
допускает навигацию и редактированию этого документа.
Класс
XmlNode (System.Xml.XmlNode) - это воплощение W3C Document
Object Model (DOM). Обеспечивается поддержка, как DOM Level 1,
так и DOM Level 2. Класс XmlDocument (System.Xml.XmlDocument))
является расширением XmlNode, и поддерживает методы для
выполняющихся операций над документом в целом, например,
загрузка или сохранение в XML файле.
XmlDocument
обеспечивает средства просмотра и управления узлами полного
XML документа, а не только текущий (current) узел, который
представляет XmlNavigator.
XmlDocument и XmlNode имеют
следующие методы и свойства:
- Исследует и изменяет узлы,
определенные в DOM, например, атрибуты, элементы, символьные
данные, текст, комментарии, обрабатываемые команды, и
сущности.
- Изменение, удаление, и вставка текста в
соответствующие DOM узлы.
- Восстановление полных узлов
(например, полный узел "programming instruction") или
индивидуальных частей узлов (например, только " target" узла
"programming instruction").
Примечание: Если прикладная программа не использует
структуру соответствующую DOM, классы XmlTextReader и
XmlTextWriter обеспечивают быстрый (non-cached) поток
forward-only доступа к XML (см. п. 2. Чтение и запись
Xml).
3.3. XmlNavigator и поддержка Xpath
Абстрактный класс XmlNavigator обеспечивает эффективные
средства исследования и редактирования XML данных в XML
документе. Он поддерживает выражения Xpath, и может
использоваться как входной параметр класса XslTransform,
который обеспечивает исполнение и XSLT преобразования.
DocumentNavigator реализует XmlNavigator для XmlDocument и
DataDocumentNavigator реализует это для XmlDataDocument.
XmlNavigator имеет следующие методы и свойства:
- Move, delete, insert и copy (перемещение, удаление,
вставка и копирование) ветвей дерева узла в основном Xml
документе. Текущий "current" узел остается узлом, на который
осуществляется воздействие, даже если он перемещён, скопирован
или изменён как-либо иначе.
- Создание клонов, каждый из
которых может осуществлять независимую навигацию по Xml
документу.
- Установка и определение свойств узла и
атрибута.
- Перемещение "current" узла в заданный тип узла
(возможные типы: first, last, next, child, parent).
-
Перемещение по атрибутам в пределах узла.
- Выбор
подмножества узлов, использующих выражение Xpath, и затем,
перемещения по узлам в пределах этого подмножества.
- Move,
copy, insert и delete для узла и его подузлов; то есть
перемещение, копирование и так далее, целых ветвей дерева
узла.
Основная модель данных для XmlNavigator та же самая что и в
DOM. XmlNavigator обеспечивает виртуальное окно в дерево узлов
и допускает следующие разветвления:
- Когда виртуальный узел, на который указывает
XmlNavigator, удален из дерева или перемещен в другое дерево,
XmlNavigator продолжает указывать на этот перемещённый узел, и
MoveToParent может перемещаться в совершенно другом узле.
-
MoveToNext и MoveToPrevious не выходят за конец списка,
оставляя, таким образом, XmlNavigator в неопределенном
состоянии.
- Когда виртуальный узел, на который указывает
XmlNavigator, перемещён в другое место дерева, XmlNavigator
переместиться вместе с ним.
- XmlNavigator всегда
позиционируется на узел. В случае сбоя использования метода,
затронувшего листья, XmlNavigator укажет, где это
произошло.
XmlNavigator охватывает весь узел и свойства уровня атрибут
поддерживаемые XmlReader (хотя их установка может быть
изменена) и добавляет навигацию для произвольного доступа.
Однако, XmlNavigator не строит дерево узла, что позволяет
организовать работу в стиле курсора доступа к XML данным,
строя единственный узел, когда происходит перемещение в него.
API дает Вам возможность получить текущий узел и двигаться к
связанным с ним узлам.
С помощью Xpath
(http://www.w3.org/TR/Xpath), поддерживаемой и обеспеченной
XmlNavigator, определите Xpath запросы (например.
Books/Book/Price/Text) и перемещайтесь в явно заданные узлы.
Метод Select предоставляет Вам возможность выбора из набора
узлов с помощью выражения Xpath, а метод MoveToSelected даёт
Вам возможность передвигаться в другие узлы в пределах
выборки. Xpath - наиболее интуитивный и дружественный путь
доступа к узлам.
Проверка и обход состояния Null
Если XmlNavigator находится в состоянии null, он временно
не указывает ни на какой узел. Когда XmlNavigator переводится
в позицию null (MoveTo (null)), происходит сбой операции
редактирования с исключением InvalidPosition. Вы можете
выяснять, находится ли объект XmlNavigator в состоянии null,
проверив, возвращается ли NodeType 0. Вы можете вывести объект
XmlNavigator из состояния null, используя MoveTo
(XmlNavigator) или MoveToDocument.
3.4. XslTransform и поддержка XSLT
Хотя Xml документы структурированы, прикладные программы
часто требуют, чтобы информация была структурирована
по-другому. eXtensible Stylesheet Language (XSL) - это
основанный на Xml язык, предназначенный для преобразования
одного Xml документа в другой Xml, документ HTML или в любой
другой структурированный документ. XSL основан на Xpath, что
позволяет определять специфические части Xml документа и
формулировать запросы.
Реализуется класс XslTransform в
соответствии со спецификацией W3C XSL Transformations (XSLT).
XslTransform загружает таблицу стилей XSLT, используя
XmlReader и преобразовывает входные данные, использующие
XmlNavigator.
Чтобы исполнять преобразования, Xml Framework
использует процессор XSLT и лист стиля XSL, который сообщает
им, как сделать преобразование. Лист стиля составлен из
шаблонов, которые определяют, как каждый узел источника
документа Xml должен появляться в результирующем Xml
документе. Процессор XSLT работает одновременно с тремя
деревьями, одно - это источник Xml, второе - для
результирующей структуры и третье - для листа стиля.
Метод
преобразований XslTransform преобразовывает данные в указанном
XmlNavigator и выводит их в одно из следующих назначений:
- XmlReader
- XmlWriter
- TextWriter
- Stream
Обратите внимание, что выбранные преобразования оперируют с
документом в целом. Другими словами, если текущий узел
установлен на некотором дереве узла в отличном от корневого
узле документа, это не исключает преобразование всех доступных
узлов загруженного документа. После того, как преобразование
было выполнено, XmlNavigator остаётся в его первоначальном
состоянии. Это означает, что узел, который был текущий перед
процессом преобразования, все ещё остаётся текущим узлом после
того, как был вызван Transform метод.