Как разобрать сложное XML-дерево с помощью TouchXml в iPhone

Я пытаюсь создать приложение, которое во время запуска подключается к веб-сайту и загружает данные XML. Хотя данные большие (100 КБ), и я использую для них TouchXml. xml такой.

<?xml version="1.0" encoding="UTF-8"?>
<itemA attA="AAA" attB="BBB" attC="CCC">
      <itemB>
            <itemC1 attD="DDD" attE="EEE" attF="FFF">
                  <itemD>                     
                         <itemE1 attG="GGG">
                                <itemF>ZZZ</itemF>
                                <itemG>
                                      <itemH1 attH="HHH">
                                            <itemG>ZZZ</itemG>
                                            <itemH>YYY</itemH>
                                      </itemH1>
                                      <itemH1 attH="III">
                                      ...                               
                                </itemG>
                          </itemE1>
                          ...
                   </itemD> 
              </itemC1>
              ...
       </itemB>
</itemA>

Здесь три точки ". . ." обозначают десятки/сотни элементов одного типа. я хочу извлечь каждый атрибут и содержимое узла. Сначала я начинаю с

[CXMLDocument nodesForXPath: @"//itemA" ошибка: ноль];

и может получить свои атрибуты и до первых дочерних узлов, используя -

[CXMLElement дочернийAtIndex:индекс];

но как я буду двигаться дальше в дочерние узлы и их узлы и получать их значения. Любая помощь приветствуется. Текст ссылки


person Community    schedule 17.09.2010    source источник


Ответы (2)


Вы можете использовать XPaths для этого: -

  NSArray *nodes = [doc nodesForXPath:@"//itemA/itemB/itemC1" error:nil]; 

Это вернет все узлы в элементе itemC1. Обратите внимание, что «doc» — это ваш объект CXMLDocument.

Google XPath для полного синтаксиса.

person Echelon    schedule 17.09.2010
comment
Эшелон спасибо за пост. Я не хочу предоставлять nodesForXPath для каждого интересующего меня ребенка. Я хочу углубиться в дерево и, соответственно, я сделаю массивы словарей/словарей массивов и, наконец, выйду из itemA. - person ; 17.09.2010
comment
Итак, для обхода дерева используется прямой рекурсивный метод, перебирающий [узлы-потомки]. Я помню, что у меня были некоторые трудности, когда я впервые использовал TouchXML, пока я не понял, что CXMLElement является подклассом CXMLNode, и как только вы начинаете рассматривать все как CXMLNode, это обретает больше смысла. - person Echelon; 17.09.2010

В этом случае вам, вероятно, определенно лучше использовать анализатор, управляемый событиями; NSXMLParser.

person Williham Totland    schedule 17.09.2010
comment
Вам просто нужно сохранить немного состояния в вашем синтаксическом анализаторе; текущий объект, который вы готовите, является хорошим примером; и скажите, чтобы добавить любой текст, который вы найдете в foundCharacters. - person Williham Totland; 17.09.2010
comment
Я также думал использовать NSXMLParser, но я хорош только в извлечении значений атрибутов. Я не уверен, как получить содержимое узла (элемента) с помощью синтаксического анализатора: foundCharacters: хотя существует множество руководств, в которых используется if или BOOL (s). Как я буду реализовывать такое количество if(s) для каждого элемента. - person ; 17.09.2010
comment
Не могли бы вы показать более подходящий XML; (например, та, которая используется на самом деле), и какую структуру данных вы хотите построить? Это облегчило бы объяснение. И не удаляйте свои комментарии, это сбивает с толку разговор. :П - person Williham Totland; 17.09.2010
comment
Да, вы хотите использовать NSXMLParser. - person Williham Totland; 20.09.2010