Обработка атрибутов и пространств имен
Пространства имен XML и атрибуты подобны в некотором отношении, но отличаются в других. Атрибуты являются парами значение-имя, обычно использующимися для содержания метаданных, связанных с элементом. Пространства имен значительно более сложны в цели. Они служат для различения элементов и атрибутов из других источников, имеющих идентичные имена, но различные значения. Они также используются для группировки связанных атрибутов и элементов так, чтобы приложение обработки могло легко распознать их. Пространства имен объявляются способом, подобным способу, которым атрибуты, но с xmlns:
снабдите префиксом имя, присвоил значение, которое является URI, например:
<employee xmlns:emp=”http://www.acme.com/defs/empl.html”/> |
Эта конструкция отображает префикс на уникальный идентификатор URI; после того префикс может использоваться для идентификации пространства имен атрибута или элемента (например, “<emp:title> </emp:title>”). Значение по умолчанию, префиксные меньше пространства имен могут также быть объявлены тем влиянием всеми текущими и происходящими элементами и атрибутами мимо точки объявления, если они не переопределяются другим пространством имен.
Несмотря на то, что цели атрибутов и пространств имен отличаются, они концептуально подобны. Они не могут быть дочерними элементами узла элемента, но они всегда тесно связаны с одним. Действительно связанный элемент является их родителем. Даже при том, что они - узлы NSXML — объекты NSXMLNode видов NSXMLAttributeKind
и NSXMLNamespaceKind
— они не могут иметь дочерних элементов и не могут быть дочерними элементами никакого узла. (Пространства имен, однако, могут квалифицировать атрибуты элемента, а также самого элемента.) С пространством имен и узлами атрибута не встречаются во время обхода документа.
Программируемый интерфейс NSXMLElement отражает это архитектурное сродство. Это предлагает подобные наборы методов для узлов пространства имен и узлов атрибута. Это обвиняет, объясняет, как использовать эти методы и затем обсуждает уникальную функцию пространства имен API: разрешение пространств имен.
Методы для управления атрибутами и пространствами имен
Класс NSXMLElement определяет методы для управления и доступа к атрибутам элемента, которые почти идентичны в форме другому набору методов для управления и доступа к узлам пространства имен. Таблица 1 перечисляет эти дополнительные наборы методов.
Методы атрибута | Методы пространства имен |
---|---|
Имена этих методов ясно указывают то, для чего Вы используете их, но гарантированы некоторые комментарии о каждой категории метода:
add...
иset...
методы обычно требуют, чтобы Вы создали объекты NSXMLNode надлежащего вида (NSXMLAttributeKind
илиNSXMXLNamespaceKind
) прежде, чем добавить или установить объект. Для создания этих объектов узла можно использовать методы фабрики классов NSXMLNodenamespaceWithName:stringValue:
,attributeWithName:stringValue:
, иattributeWithLocalName:URI:stringValue:
. Последний из этих методов создает атрибут, связывающийся с пространством имен, идентифицированным параметром URI.setAttributesAsDictionary:
метод позволяет Вам установить атрибуты элемента, не имея необходимость создавать объекты NSXMLNode сначала. Ключи в словаре являются именами атрибутов, и значения являются строковыми значениями атрибутов.Все методы, устанавливающие атрибуты или пространства имен элемента, удаляют все существующие атрибуты или пространства имен.
Методы, удаляющие атрибут или пространство имен от элемента или тот доступ определенный атрибут или пространство имен, требуют, чтобы Вы знали имя атрибута или префикс пространства имен. Для узла атрибута можно просто попросить у узла его имени с помощью NSXMLNode
name
метод. Для узла пространства имен, однако,name
метод возвращает полностью определенное имя (т.е. префикс плюс локальное имя, разделенное двоеточием). Можно получить префикс путем вызова метода класса NSXMLNodeprefixForName:
, передача на полностью определенное имя.attributeForLocalName:URI:
требует, чтобы Вы предоставили локальное (неквалифицированное) имя атрибута, а также пространства имен URI, с которым это связывается. Если можно получить доступ к связанному узлу пространства имен, можно получить URI путем отправки узла astringValue
сообщение. Можно получить локальное имя от полностью определенного имени при помощи метода класса NSXMLNodelocalNameForName:
.Если Вы хотите получить доступ или удалить существующее пространство имен или узел атрибута, можно получить ссылку на ее элемент путем отправки пространства имен или приписать узел a
parent
сообщение.
Как только Вы получили доступ к определенному пространству имен или приписываете узел, можно получить или установить его строку или возразить значению (см. Изменение Значений Узлов для подробных данных). Примите во внимание, что значением узла пространства имен является URI пространства имен; если Вы хотите установить URI как объектное значение, сделайте его объектом NSURL.
Разрешение пространств имен
Если Ваше приложение знает (или подозреваемые), что оно могло бы иметь дело с XML из других источников или созданное в различных словарях XML, таких как XSLT и RDF, оно должно иметь дело с пространствами имен. В любой точке обработки этому, возможно, придется знать пространство имен, с которым элемент или атрибут связываются для обработки того элемента или атрибута соответственно. Рассматриваемый вопрос set
элемент, определяющийся и SVG и MathML в различных целях. Прежде чем можно будет определить значение a set
элемент в документе, содержащем и SVG и разметку MathGL, необходимо узнать, какому пространству имен это принадлежит. Для обнаружения присоединения пространства имен элемента, необходимо разрешить его.
Для разрешения пространства имен NSXMLElement объявляет два метода вне тех обсужденных в Методах для Управления Атрибутами и Пространствами имен.
Первый метод берет квалифицированное или локальное имя элемента и возвращает узел пространства имен, представляющий пространство имен, которому принадлежит элемент. Ваше приложение может получить URI от узла (его строковое значение) и сравнить его со списком известного или ожидаемого URIs для определения присоединения пространства имен. Если нет никакого связанного пространства имен, resolveNamespaceForName:
возвраты метода nil
.
Второй метод разрешения пространства имен, resolvePrefixForNamespaceURI:
, работы в противоположном направлении. Вы передаете в URI и возвращаете префикс, связанный с тем URI. Например, когда Вы добавляете элементы к документу и должны знать префиксы их полностью определенных имен, можно использовать этот метод.