Какао — запись NSXMLElement в NSXMLDocument

Я создаю NSXMLDocument, из которого я получаю файл, определенный в константе USER_PRINTXML_URL, следующим образом:

NSXMLDocument *ads_user_printxml = [[NSXMLDocument alloc] initWithContentsOfURL: [NSURL URLWithString:USER_PRINTXML_URL]    options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA)                                          error:&ads_err];

Затем я использую XPath, чтобы добраться до нужного места в файле XML, следующим образом:

NSArray* ipp_folder = [[ads_user_printxml nodesForXPath:@".//root/printing/IPP"error:&ads_err] objectAtIndex:0];

Теперь, если я хочу добавить NSXMLElements после элемента в файле XML, как мне это сделать?

Я попытался сделать следующее:

NSXMLElement *s= [ipp_folder objectAtIndex:0];

Но это вызывает ошибку времени выполнения. Я также пытался использовать NSXMLNode вместо помещения данных в NSArray, но снова безрезультатно. Я считаю, что решение довольно простое, но я не могу найти ответ в документах.

Спасибо за любую помощь.


person Kevin    schedule 25.04.2012    source источник


Ответы (1)


-nodesForXPath:error: возвращает NSArray*, но ваш второй фрагмент кода уже применил к нему -objectAtIndex:. Итак, ipp_folder содержит не массив, а указатель на NSXMLNode. Исправьте его объявленный тип.

Затем вы можете идентифицировать его родителя, используя метод -parent, и его индекс в дочерних элементах родителя, используя метод -index. Затем, предполагая, что родителем является NSXMLElement, вы можете сделать:

[[ipp_folder parent] insertChild:someNewNode atIndex:[ipp_folder index] + 1];
person Ken Thomases    schedule 25.04.2012
comment
Когда вы говорите, что родителем является NSXMLElement, как я могу объявить его таковым? Так что, если родителем является ‹IPP› в файле XML, и я хочу вставить дочерний элемент между ‹IPP› и ‹/IPP›, как мне это сделать, учитывая, что [ipp_folder parent] возвращает NSXMLNode, а не NSXMLElement? ? Спасибо, Кен! - person Kevin; 25.04.2012
comment
Подождите, из предоставленного вами XPath сам элемент будет элементом IPP. Если вы хотите вставить в это, вам не нужен его родитель. (Изначально вы сказали, что хотите вставить после элемента IPP.) Таким образом, вы можете просто объявить переменную такого типа: NSXMLElement* ipp_folder = .... Если вы хотите убедиться, что это так, вы можете проверить, что [ipp_folder kind] == NSXMLElementKind. И тогда вы просто вставите прямо в это, а не в его родителя, используя -addChild:. - person Ken Thomases; 25.04.2012
comment
Я хотел сказать в IPP, а не после, извините за это. Вы правы. NSElement * ipp_folder =... действительно работает. Думаю, я запутался с типом возвращаемого значения, объявив NSArray, когда использовал параметр objectAtIndex:int. Большое спасибо за помощь, Кен. - person Kevin; 25.04.2012