2012-01-30 3 views
0

Как выполнить синтаксический анализ вложенных узлов с помощью NSXMLParser. Поскольку этот анализатор знать, чтобы разобрать узел мудрого способа XML, как мы должны обрабатывать несколько узлов разбора с такими же именами, как показано ниже:nsxmlparser разобрал один за другим?

<data> 
    <nodesame attrisame="this is same"> 
     <nodesame> this is also same </nodesame> 
     <nodedifferent> this is different although </nodedifferent> 
    </nodesame> 
</data> 

В выше мы имеем узел основных данных, который содержит nodesame узла, который содержит другой узел nodesame внутри. Скажите, пожалуйста, как различать оба узла с различным контекстом.

Пожалуйста, предложите мне хороший способ для получения словарь/массив от делегата:

parser:didEndElement:namespaceURI:qualifiedName 

Я famaliar с libxml2 и touchXML, но с использованием NSXMLParser делает меня с ума, плюс мы должны использовать то же самое, потому что код, который мы используем NSXMLParser, поэтому его изменение в Libxml будет чертовски.

ответ

0

Когда вы используете nsxmlparser, он идет сверху вниз и вызывает соответствующие пары didStartElement и didEndElement. Итак, для вашего первого вопроса (как узнать, когда вы находитесь в дочернем узле с тем же именем, что и родительский узел?), Ответ заключается в том, чтобы отслеживать, когда был вызван didStartElement, а затем еще один didStartElement того же имени узла без звонок в didEndElement между ними.

Теперь каждый элемент называется так, что массив не применим для общего синтаксического анализа. Это оправдано только в ответ JSON. Итак, для вашего второго вопроса (как создать массив или словарь для xml?), Чтобы каждый узел был собственным словарем, возможно, с ключом «атрибутов», который является другим словарем. Я хотел бы создать что-то подобное для примера:

{"data": 
    {"nodesame": 
     {"attributes": 
      {"attrisame":"this is same"} 
     }, {"nodesame": 
       {"text":"this is also same"} 
     }, {"nodedifferent": 
       {"text":"this is different although"} 
     } 
    } 
} 

Одна из проблем здесь, занимающее слово «атрибуты» и «текст», так что это не очень подходит.

+0

так что мне нужно поддерживать инкремент за каждый раз, потому что теперь я выделяю каждый раз, когда didEndElement вызывается, поэтому старые данные удаляются и выделяется новый массив. – aksani56

+0

Вы можете сделать это, конечно. Поэтому, если вы перейдете в 'didStartElement', а имя -« nodeame », вы сделаете +1, и если вы перейдете в' didEndElement', а имя «nodeame», вы выполните -1. Всякий раз, когда счетчик равен 1, вы находитесь на втором уровне, и всякий раз, когда он равен 0, вы находитесь в первом. – vakio

+0

Спасибо @vakio, который работал как отличный! – aksani56