iPhone: разобрать длинный XML-файл на основе поля ключа - PullRequest
1 голос
/ 05 октября 2009

Я хочу проанализировать XML-файл. Структура файла XML следующая

<?xml version="1.0" encoding="utf-8"?>
<Level>
<p id='327'>
   <Item>
      <Id>5877</Id>
      <Type>0</Type>
      <Icon>---</Icon>
      <Title>Btn1Item1</Title>
   </Item>
   <Item>
      <Id>5925</Id>
      <Type>0</Type>
      <Icon>---</Icon>
      <Title>Btn1Item4</Title>
   </Item>
</p>
<p id='328'>
   <Item>
      <Id>5878</Id>
      <Type>0</Type>
      <Icon>---</Icon>
      <Title>Btn2Item1</Title>
   </Item>
   <Item>
      <Id>5926</Id>
      <Type>0</Type>
      <Icon>---</Icon>
      <Title>Btn2Item4</Title>
   </Item>
</p>
</Level>

в приведенном выше коде есть только 2 тега для <p>. но на самом деле есть несколько тегов. Я хочу найти конкретный тег, для которого атрибут id имеет определенное значение (скажем, 327). Таким образом, один из способов заключается в том, что я анализирую файл XML с самого начала, чтобы получить желаемый результат. Есть ли какой-либо другой метод, из которого я могу напрямую найти нужный тег. например, если я хочу найти тег <p> в приведенном выше XML для атрибута id = 328, то он не анализирует id = 327 и напрямую возвращает только те элементы, которые связаны с id = 328

Пожалуйста, предложите

Ответы [ 2 ]

0 голосов
/ 05 октября 2009

Библиотека libxml2 может получать запросы XPath с следующими расширениями . С этими расширениями вы можете выполнить запрос XPath /p[@id = "328"], чтобы получить дочерние узлы этого конкретного узла.

0 голосов
/ 05 октября 2009

Зависит от того, как вы определяете «анализ». «Быстрый и грязный» (и потенциально ошибочный) способ заключается в том, чтобы сначала найти фрагмент, используя поиск по регулярному выражению (или пользовательский анализатор), а затем передать фрагмент в настоящий анализатор XML. Я не знаю ничего, что сделало бы это для вас, вам бы пришлось свернуть это самостоятельно. Я бы предположил, что это не тот путь.

Следующий уровень - передать его через SAX-подобный синтаксический анализатор (форма NSXMLParser). В вашем обработчике для элемента

проверьте атрибут id и, если он соответствует вашему значению (или значениям), установите флаг, чтобы указать, следует ли интерпретировать дочерние элементы. В ваших обработчиках дочерних элементов, сначала проверьте этот флаг (конечно, в необработанном обработчике NSXMLParser все элементы будут идти к одному и тому же методу).

Так что это правда, что NSXMLParser будет анализировать весь документ - но только для того, чтобы выполнить минимальную работу для установления правильного контекста XML-анализатора. Реальная работа с элементами будет отложена до тех пор, пока значение не будет достигнуто. Я не вижу возможности обойти это без чего-то хакерского, вроде предложения регулярного выражения.

Если это слишком много, я бы пересмотрел, является ли XML подходящим для вас форматом сериализации (при условии, что у вас есть какой-то контроль над этим)?

Если вы придерживаетесь NSXMLParser, моя статья в блоге здесь может помочь, по крайней мере, улучшить восприятие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...