Создание объекта XML-документа
Можно создать объект, представляющий XML-документ — т.е. экземпляр NSXMLDocument — одним из двух общих способов. Используя NSXML, можно или проанализировать исходный код XML и создать представителя древовидной структуры содержания, или можно создать XML-документ программно.
Создание объекта документа от существующего XML
Класс NSXMLDocument позволяет Вам создать экземпляр документа из текста разметки XML в одной из нескольких форм: как строковый объект, как объект NSData, и как ОПРЕДЕЛЯЕМЫЙ URL файл (удаленный или локальный). Следующие инициализаторы NSXMLDocument (соответствующий этим формам) также включают параметры для обрабатывающих ввод опций и для получения информации об ошибках инициализации:
Перечисление 1 показывает, как Вы могли бы создать экземпляр NSXMLDocument от абсолютного пути до локального XML-файла.
Перечисление 1 , Создающее документ из файла URL (локальный файл)
- (void)createXMLDocumentFromFile:(NSString *)file { |
NSXMLDocument *xmlDoc; |
NSError *err=nil; |
NSURL *furl = [NSURL fileURLWithPath:file]; |
if (!furl) { |
NSLog(@"Can't create an URL from file %@.", file); |
return; |
} |
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl |
options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA) |
error:&err]; |
if (xmlDoc == nil) { |
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl |
options:NSXMLDocumentTidyXML |
error:&err]; |
} |
if (xmlDoc == nil) { |
if (err) { |
[self handleError:err]; |
} |
return; |
} |
if (err) { |
[self handleError:err]; |
} |
} |
Если инициализация перестала работать, NSXMLDocument init
метод непосредственно возвращается nil
и наиболее вероятные возвраты косвенно NSError создание отчетов об ошибке анализа или ошибке соединения. Если отказ вследствие ошибки анализа, можно попытаться восстановиться (как в Перечислении 1) путем инициализации документа с NSXMLDocumentTidyXML
опция; эта опция переформатировала документ до парсинга, чтобы гарантировать, что это правильно построено. Однако это действительно имеет побочные эффекты, такие как удаление продвижения и конечных пробелов; см. справочную документацию NSXMLDocument для подробных данных.
Если NSXMLDocument init
метод косвенно возвращает объект NSError в своем третьем параметре, можно вывести на экран предупредительное диалоговое окно для информирования пользователя об ошибке. Однако объекты NSError, создаваемые для ошибок анализа или предупреждений, не могли бы содержать много полезной информации. Когда документы не правильно построены, большинство объектов NSError инкапсулирует ошибки или предупреждения, испускаемые синтаксическим анализатором; они могут также быть ошибками соединения от попыток до доступа XML при удаленном использовании расположений initWithContentsOfURL:options:error:
.
Вы устанавливаете опции инициализации во втором параметре трех инициализаторов NSXMLDocument, обсужденных выше; если Вы хотите указать многократные опции, используйте выражение битового «ИЛИ». Опции инициализации покрывают три категории обработки ввода:
Сохранение.
enum
начало константNSXMLNodePreserve
точность документации поддержки. Они позволяют Вам гарантировать, что аспекты строки, ввод XML — например, заключая стиль в кавычки значений атрибута, разделов CDATA, атрибута и порядка пространства имен — остается тем же, когда текст XML записан из объекта NSXMLDocument. Если Вы не указываете опцию сохранения для аспекта, NSXMLDocument обрабатывает его предопределенным способом. Например, когда NSXMLDocument читает в и анализирует XML-документ, он обычно разделяет пробельные символы, используемые в форматировании (включая вкладки и возвраты каретки); однако, если Вы указываетеNSXMLNodePreserveWhitespace
эти символы сохранены скрытыми во внутреннем представлении XML-документа. («Скрытый» означает, что пробельные символы сохраняются для вывода документа, но не видимы в древовидном представлении.) Обратите внимание на то, что пробел в текстовых узлах всегда сохраняется и не затронутNSXMLNodePreserveWhitespace
опция.Опрятность.
NSXMLDocumentTidyHTML
иNSXMLDocumentTidyXML
опции исправляют любые уродливые части источника HTML или XML-документ, соответственно, прежде, чем создать внутреннее представление документа. Уборка поддерживает содержание документа, но не обязательно поддерживают пробел или порядок конструкций в документе. Объекты и символьные ссылки всегда разрешаются к их тексту или unicode символу. Если источником является HTML иNSXMLDocumentTidyHTML
указан, NSXMLDocument пытается преобразовать его в XHTML; исправления принимают во внимание контекст HTML. Если источник является XML иNSXMLDocumentTidyXML
указан, NSXMLDocument пытается фиксировать любые дефекты для создания его правильно построенным.Проверка.
NSXMLDocumentValidate
опция проверяет исходный XML-документ против своей связанной схемы. Та схема может быть определена через DTD (внутренний или внешний) или XML-схема. Блок проверки допустимости сообщает о причинах недействительности документа косвенно через параметр NSError. Для проверки против XML-схемы необходимо идентифицировать документ схемы через комбинацию пространства имен,xmlns:xsi
, иxsi:schemaLocation
объявления атрибута в корневом элементе. Значение URI пространства имен должно соответствовать одно из значений в кортежах пространства имен расположения вxsi:schemaLocation
объявление. Вот пример:<MyRootElement xmlns="http://www.example.com/foo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.example.com/foo http://www.example.com/foo.xsd
http://www.w3.org/1999/xhtml http://www.w3.org/1999/xhtml.xsd">
Для получения информации о том, как Вы указываете расположение определений схемы в сети, видите рекомендацию XML-схемы W3C (http://www .w3.org/TR/xmlschema-1/). Схема должна быть физически установлена в системе OS X в
/System/Library/Schemas/
elementName.xsd
.XInclude. Если
NSXMLDocumentXInclude
опция указана, замены синтаксического анализатораxsi:include
элементы, обращающиеся к другим XML-документам (или части документов) с содержанием, на которое ссылаются. По умолчанию эта опция включена так, Ваше приложение может запросить и отредактировать узлы, определяющие включения.
Они enum
константы определяются в NSXMLNodeOptions.h
. Для определенной информации об опциях инициализации проверьте справочную документацию на NSXMLDocument.
Создание нового XML-документа
Иногда Вы могли бы хотеть создать XML-документ, который является полностью новым, там не будучи никаким файлом первоисточника или страницей веб-сайта. Когда документ записан в файл, можно хотеть управлять всеми узлами в древовидной структуре — добавлением, удалением, и перемещением их — и позволить NSXML заботиться о подробных данных форматирования.
initWithRootElement:
инициализатор NSXMLDocument позволяет Вам делать это. Объект NSXMLDocument имеет два вида определения данных: ряд глобальных документом атрибутов и корневого элемента. Как только у Вас есть корневой элемент, можно создать остальную часть древовидного представления документа путем добавления дочерних узлов различных типов для порождения узлов на различных уровнях.
Перечисление 2 показывает пример создания совершенно нового объекта XML-документа.
Перечисление 2 , Создающее экземпляр NSXMLDocument, представляющий новый документ
NSXMLElement *root = |
(NSXMLElement *)[NSXMLNode elementWithName:@"addresses"]; |
NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithRootElement:root]; |
[xmlDoc setVersion:@"1.0"]; |
[xmlDoc setCharacterEncoding:@"UTF-8"]; |
[root addChild:[NSXMLNode commentWithStringValue:@"Hello world!"]]; |
Этот фрагмент кода использует методы NSXMLDocument для установки version
и encoding
атрибуты определения XML документа. Вы могли также установить автономное, URI и атрибуты типа MIME с помощью соответствующих методов «метода set» NSXMLDocument. Можно связать Определение типа документа с объектом NSXMLDocument через setDTD:
метод. NSXMLDocument также позволяет Вам указывать выходной формат документа (использование setDocumentContentKind:
) как HTML, XHTML, текст, или (значение по умолчанию) XML. Например, следующие списки различный handlings <br>
элемент:
XML:
<br></br>
XHTML:
<br />
HTML:
<br>
Простой текст: ничто
Как только Вы создаете объект XML-документа и устанавливаете его атрибуты, можно начать добавлять содержание к нему — т.е. элементы, атрибуты и другие узлы, составляющие XML-документ — через надлежащие методы NSXMLElement и NSXMLNode.
Если XML-документу связали схему с ним — определенный или с DTD или с XML-схемой — Вы могли бы хотеть проверить документ периодически. Для проверки документа отправьте validateAndReturnError:
обменивайтесь сообщениями к объекту NSXMLDocument. Если работа не допустима, возвраты метода NO
; причины недействительности возвращаются косвенно в параметре метода NSError.