Создание объекта 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 константы определяются в 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-документа и устанавливаете его атрибуты, можно начать добавлять содержание к нему — т.е. элементы, атрибуты и другие узлы, составляющие XML-документ — через надлежащие методы NSXMLElement и NSXMLNode.

Если XML-документу связали схему с ним — определенный или с DTD или с XML-схемой — Вы могли бы хотеть проверить документ периодически. Для проверки документа отправьте validateAndReturnError: обменивайтесь сообщениями к объекту NSXMLDocument. Если работа не допустима, возвраты метода NO; причины недействительности возвращаются косвенно в параметре метода NSError.