Запись XML от объектов NSXML
Все объекты NSXML могут испустить текстовое представление себя как разметка XML. Кроме того, объекты NSXMLDocument могут исписаться как полный XML или документы XHTML. NSXML обеспечивает различные наборы методов и опций (как enum
константы) и для выписывания содержания NSXMLNode и для объектов NSXMLDocument. Это также предлагает методы для выполнения трансформаций XSLT на XML-документах.
Выписывание XML-документа
Возможно, наиболее распространенный образец приложения, обрабатывающего XML, является чем-то как следующее:
Считайте XML-документ из файла или веб-сайта, преобразовав его во внутреннюю древовидную структуру.
Измените, добавьте и удалите узлы в дереве.
От объектов в дереве запишите новый или обновленный XML-документ в файл или веб-сайт.
Два метода класса NSXMLDocument помогают Вам с последним шагом, XMLData
и XMLDataWithOptions:
. Поскольку имена методов подразумевают, оба метода возвращают объект NSData. Символьные данные вывода кодируются на основе кодирования, указанного как атрибут в определении XML документа. (Если это не существует, NSXML использует UTF-8 в качестве кодировки по умолчанию.)
XMLData
просто вызывает XMLDataWithOptions:
с параметром NSXMLNodeOptionsNone
, запрос никаких выходных опций. Последний метод позволяет Вам указывать следующий enum
- постоянные опции:
NSXMLNodePrettyPrint
— Делает вывод XML более человекочитаемым, например, вставляя возвраты каретки и располагая вложенные элементы с отступом.NSXMLDocumentIncludeContentTypeDeclaration
— Включает объявление типа контента для вывода HTML или XHTML.
Если Вы хотите указать многократные константы, используйте выражение битового «ИЛИ».
Перечисление 2 показывает, как Вы могли бы вызвать XMLDataWithOptions:
метод в writeToFile:ofType:
метод подкласса NSDocument.
Перечисление 1 Пишущий XML-документ в файл (подкласс NSDocument)
- (BOOL)writeToFile:(NSString *)fileName ofType:(NSString *)type { |
NSData *xmlData = [xmlDoc XMLDataWithOptions:NSXMLNodePrettyPrint]; |
if (![xmlData writeToFile:fileName atomically:YES]) { |
NSBeep(); |
NSLog(@"Could not write document out..."); |
return NO; |
} |
return YES; |
} |
Запись XML, представленного узлами
Иногда Вы могли бы хотеть иметь определенные узлы или ответвления экспресса дерева XML сами как разметка XML, а не весь документ. Например, приложение могло идти через большой XML-документ, ища узлы, соответствующие определенные критерии, и затем создать меньший XML-документ из вывода этих узлов.
Основные методы NSXMLNode, которые Вы используете с этой целью, XMLString
и XMLStringWithOptions:
. Прежний метод просто вызывает последнее указание никаких выходных опций (NSXMLNodeOptionsNone
). Кроме того, чтобы быть invokable на любом объекте NSXMLNode (включая объекты NSXMLDocument), то, что отличает эти методы от их дубликатов NSXMLDocument, - то, что они возвращают строковый объект (NSString), а не объект данных (NSData).
Когда Вы отправляете одно из этих сообщений к объекту NSXMLNode, могущему (и делать), имеют дочерние элементы — в частности, документ, элемент или узлы объявления типа документа — эффект является рекурсивным. Все потомки объекта узла распечатывают себя в порядке документа.
XMLStringWithOptions:
разрешения только одна из выходных опций, доступных методу NSXMLDocument XMLDataWithOptions:
— NSXMLNodePrettyPrint
— для вставки пробела для улучшения удобочитаемости XML.
Метод в Перечислении 2 получает строковое представление XML-документа и использования это для содержания текстового представления и веб-представления. (Веб-представление и WebFrame, на которые ссылаются в следующих двух листингах кода, являются классами веб-платформы Набора.)
Перечисление 2 , Создающее второе использование XML-документа XMLStringWithOptions:
- (IBAction)reloadPreview:(id)sender { |
if (xmlDocument) { |
NSString *displayString = [xmlDocument |
XMLStringWithOptions:NSXMLNodePrettyPrint]; |
[previewTextView setString:displayString]; |
[[previewWebView mainFrame] loadHTMLString:displayString |
baseURL:[self baseDocURL]]; |
} |
} |
Можно получить текст разметки XML, который находится в канонической форме путем отправки любому объекту NSXMLNode сообщения canonicalXMLStringPreservingComments:
. Путем преобразования XML-документа или узла к канонической форме можно определить, эквивалентно ли это логически другому XML-документу (или узел) в канонической форме — который является, возможно, тем же документом после того, как незначительные изменения внесены в него. Помещение XML в канонической форме включает различные преобразования и «нормализацию», такую как разрешение символа и ссылок на сущность, преобразование пустых тегов элементов к парам начинать-конца и вставки значений атрибута по умолчанию. См. справочную документацию для класса NSXMLNode для более полного описания canonicalXMLStringPreservingComments:
.
Преобразование документа с XSLT
NSXML включает поддержку XSLT. С XSLT можно применить ряд шаблонных правил и образцов к исходному XML-документу и таким образом преобразовать тот документ в другой XML-документ или в HTML, RTF или документ простого текста. Три метода NSXMLDocument являются интерфейсом к обработке XSLT:
- (id)objectByApplyingXSLT:(NSData *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error
- (id)objectByApplyingXSLTString:(NSString *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error
- (id)objectByApplyingXSLTAtURL:(NSURL *)xsltURL arguments:(NSDictionary *)arguments error:(NSError **)error
Эти методы возврат преобразовали XML или документы HTML в форме объекта NSXMLDocument; они возвращают RTF или документы простого текста как объекты NSData.
Первый из этих методов берет код XSLT в качестве объекта данных, второе как строковый объект, и треть берет URL, идентифицирующий источник кода XSLT. Перечисление 3 иллюстрирует использование третьего метода. В этом случае файл, содержащий код XSLT, хранится как нелокализованный ресурс приложения. Метод получает путь к файлу XSLT, преобразовывает путь к URL, и затем отправляет objectByApplyingXSLTAtURL:arguments:error:
метод к объекту NSXMLDocument. Это получает содержимые HTML использования объекта итогового документа XMLString
; это тогда загружает ту строку в объект веб-представления, от которого это распечатано.
Перечисление 3 , Преобразовывающее XML-документ к HTML с помощью XSLT
- (IBAction)printDocument:(id)sender { |
NSError *err=nil; |
// webView is an off-screen WebView (ivar) |
WebFrame *frame = [webView mainFrame]; |
// find XSLT code |
NSString *xsltPath = [[NSBundle mainBundle] |
pathForResource:@"addresses_transform" ofType:@"xml"]; |
if (!xsltPath) |
return; |
// transform through XSLT |
NSXMLDocument *printDoc = (NSXMLDocument *)[xmlDoc |
objectByApplyingXSLTAtURL:[NSURL fileURLWithPath:xsltPath] |
arguments:nil // no extra XSLT parameters needed |
error:&err]; |
if (err) { |
[self handleError:err]; |
if (!printDoc) return; |
} |
// put in WebFrame and print |
[frame loadHTMLString:[printDoc XMLString] baseURL:nil]; |
[webView print:self]; |
} |
Много онлайновых учебных руководств на XSLT доступны, включая один от W3Schools (http://www.w3schools.com/xsl/). Можно искать сеть для нахождения других источников информации о XSLT.