Модель данных NSXML

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

NSXML представляет XML-документ как упорядоченное, маркированное дерево, в котором каждый узел имеет уникальные идентификационные данные и может иметь значение, атрибуты и пространства имен, связанные с ним. Концептуально, NSXML основывается на улучшенной модели данных XQuery 1.0/XPath 2.0, которые самостоятельно имеют сродство со стандартом Ядра DOM. Как делает XQuery, NSXML воздействует на краткий обзор, логическую структуру XML-документа — модели данных — а не ее поверхностный синтаксис. В XQuery каждый ввод или вывод к или от запроса является экземпляром модели данных. Эта модель состоит из двух общих видов элементов: узлы и атомарные значения.

Узлы

Модель данных NSXML представляет XML-документ как дерево узлов. Дерево может иметь различные виды узлов, каждый из которых соответствует типу конструкции XML:

Дерево XML также имеет понятие документа, объект, представляющий все дерево.

Объекты NSXML имеют атрибут, указывающий их вид. Вид узла постоянно установлен при его создании; это не может быть изменено в другой вид узла.

Одна вещь, которую Вы могли бы заметить о вышеупомянутом списке, состоит в том, что он не содержит все возможные виды конструкций разметки XML. Самый известный пропуск является разделами CDATA и символьными и ссылками на сущность. Когда NSXML обрабатывает существующий документ, он разрешает любые символьные или ссылки на сущность в стандартные текстовые узлы — если не установлены надлежащие опции точности. Даже когда CDATA и символьные и ссылки на сущность сохраняются, NSXML обрабатывает их как не больше, чем текстовые узлы специальные в корпусе.

Имя узла, индекс и уровень

Каждый узел в дереве имеет уникальные идентификационные данные. Большинство узлов имеет имя — документ, комментарий, и текстовые узлы не делают — и много узлов имеют некоторую строку или другой тип имеющий значение, связанный с ними. Таким образом узел комментария, не имеющий имени, почти всегда имеет значение. Если существует другой узел комментария в дереве с тем же значением, это считается отличающимся, потому что это происходит в другой части дерева. Даже если два узла являются тем же видом и имеют то же имя и содержание, NSXML обрабатывает их как отличные узлы, потому что у них есть различные расположения в дереве.

NSXML использует два атрибута узла для определения расположения узла: индекс и уровень. Индекс является основанным на нуле числом, указывающим относительную позицию узла к ее одноуровневым узлам (все дочерние элементы того же родительского узла). Уровень является числом, указывающим уровень вложенности узла в иерархии документа; узел корневого элемента всегда имеет уровень 1 (и единственный узел с этим числом уровня).

Чтобы видеть, как эти нумерации могли бы терять значение, рассмотрите этот простой XML-документ:

<person>
   <name>
      <firstName>John</firstName>
      <middle_i>J</middle_i>
      <lastName>Doe</lastName>
   </name>
   <phone>
      <mobile>(408) 362-4593</mobile>
   </phone>
</person>

После обработки этого документа NSXML представляет его как древовидную структуру. Рисунок 1 показывает индекс и уровень каждого узла в этом маленьком дереве (игнорирование текстовых узлов).

  Уровень Узла рисунка 1 и индекс
Node level and index

NSXML изменяет уровень и индекс узла, поскольку узел изменяет местоположение в дереве. Например, Вы могли отсоединить узел от одного родителя и присоединить его к другому, и его уровень и индекс изменятся.

Узел документа

Древовидное представление NSXML XML-документа имеет один, и только один, узел документа. Узел документа является всегда первым в любом древовидном представлении, и это - больше, чем первый узел в дереве. Узел документа охватывает весь документ. Это представляет сам документ.

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

Однако узел документа может содержать узлы кроме корневого элемента. Это может иметь дочерние инструкции обработки представления узлов и комментарии (см. рисунок 2). Узлу документа можно было также связать метаданные документа с ним, такие как URI или тип MIME, DTD, или кодирование или версия, указанная в определении XML для документа. NSXML также позволяет Вам указывать вид вывода для документа, т.е. выписывает ли документ XML, XHTML, или разметку HTML, или просто текст.

Рисунок 2  узел документа
The document node

Узлы элемента и другие дочерние элементы

Узлы элемента являются самыми важными узлами в дереве. Элементы являются основным структурным компонентом для получения информации, выраженной XML-документом. За исключением узлов документа (см. Узел Документа) и узлов DTD, только узлы элемента могут иметь дочерние элементы. Виды узлов, которые могут быть дочерними элементами узла элемента, являются текстовыми узлами, узлами инструкции обработки, узлами комментария и другими узлами элемента. Текстовые узлы являются неназванным, универсальным типом узла, которые переносят текст между запуском и конечными тэгами элемента. Например, рассмотрите следующий элемент:

<title>War and Peace</title>

title элемент в этом случае имеет единственный дочерний элемент, текстовый узел с содержанием (строковое значение) «Войны и мира». Если элемент смешал содержание — т.е. текст, смешанный с элементами — каждый промежуток текста считают дочерним элементом, как каждый элемент.

Возьмите в качестве примера следующий XML:

<para>The Novel <title>War and Peace</title> is huge.</para>

Первый дочерний элемент является текстовым узлом со значением «Роман», вторым является <заголовок> элемент (с единственным дочерним элементом), и третьим является текстовый узел со значением», огромно."

Нормализация объединяет смежные текстовые узлы. Это не имело бы никакого эффекта на пример выше, но если бы необходимо было создать элемент программно со смежными текстовыми узлами, нормализация объединила бы их в одного.

Порядок документа

Порядок документа, проще говоря, порядок конструкций разметки XML, поскольку они появляются в документе. Когда Вы отправляете сообщения NSXMLNode nextNode (или previousNode) к каждому последовательному объекту узла, с которым встречаются в дереве NSXML, Вы пересекаете дерево вперед (или назад) в порядке документа.

С программируемым представлением дерева порядок обхода определяется “дочерним элементом сначала, одноуровневый элемент затем” (или “глубина сначала”) логика. Другими словами, NSXML развивается через дерево путем убывания первому дочернему элементу текущего родителя (если таковые имеются). Если тот узел имеет свои собственные дочерние элементы, следующий узел, который посещают, является первым дочерним элементом того родителя. Как только NSXML достигает вершины (узел без дочерних элементов), он продолжается к любому одноуровневому узлу — т.е. узлу с тем же родителем. Если существует не (или не больше) одноуровневые узлы, NSXML возвращает один уровень и переходит к следующему дочернему узлу предыдущего родителя (если таковые имеются). Обход узлов продолжается таким образом до заключительной вершины посетили дерево (или раздел дерева). Рисунок 3 изображает этот обход в порядке документа.

  Порядок Документа рисунка 3
Document order

Управление памятью объектов узла NSXML

Управление памятью объектов узла в NSXML подобно выполняемому объектами коллекции. Родительский узел управляет сохраненным состоянием своих «содержавших» объектов — т.е. своих дочерних элементов. Это управление может быть получено в итоге следующим образом:

  • Когда Вы добавляете или вставляете узел, родитель сохраняет его.

  • При удалении узла родитель выпускает его.

  • При отсоединении узла узел сохранен и затем автовыпущен.

Когда NSXML анализирует источник XML и создает дерево, узлы в дереве сохраняются их родителями. Каждый из этих узлов имеет сохранить количество одного.

Импликации этого поведения для монопольного использования объекта ясны. Если Вы хотите содержать на объект узла, удаленный или отсоединенный от дерева, необходимо гарантировать, что это имеет надлежащее, сохраняют количество. Для полных подробных данных политики монопольного использования объекта и управления объектными продолжительностями жизни, см. Усовершенствованное Руководство по программированию управления памятью.

Для управления памятью и целей производительности, необходимо сохранить объекты узла, а не скопировать их. Узлы только должны быть скопированы, если они - часть дерева (т.е. у них есть родитель), и Вы хотите клонировать узел к новому расположению в текущем дереве или в различном дереве.

Последовательности и атомарные значения

В дополнение к узлам модель данных XQuery также позволяет атомарные значения. Атомарные значения являются значениями, имеющими простые типы, как определено в стандарте XML-схемы: строка, десятичное число, целое число, плавание, дважды, булевская переменная, дата, URI, массив и двоичные данные. В NSXML объекты Основы, которые эквивалентны этим атомарным значениям — например, NSString, NSNumber и объекты NSCalendarDate — формируют содержание или объектное значение, узлов.

Атомарные значения могут также быть частью ввода и вывода запросов XQuery. XQuery обрабатывает каждое значение в запросе как часть последовательности. Последовательность является набором элементов, каждый из которых может быть узлом или атомарным значением. Если запрос в XQuery возвратит только один элемент, то это будет возвращено в последовательности (или массив) одного. Понятие последовательностей то, почему XQuery и методы XPath NSXMLNode —objectsForXQuery:error: и nodesForXPath:error:— возвратите объект NSArray.