Как сделать так, чтобы XmlPullParser возвращал списки элементов верхнего уровня? - PullRequest
0 голосов
/ 03 августа 2011

Я использую XmlPullParser для генерации форм в приложении для Android из локально сохраненного XML-документа.

XmlPullParser xpp = getResources().getXml(R.xml.calculator);
int eventType = xpp.getEventType();

и тогда у меня есть цикл while, который обрабатывает все элементы дерева.Однако, поскольку я продолжаю использовать

eventType = xpp.next(); 

, это метод, основанный на глубине, когда на самом деле я хочу использовать метод, основанный на ширине, (пользователь выполняет детализацию дерева, задавая вопросы).Большинство учебников по xml опираются на DOM, который, как я слышал, ненадежен на Android из-за ограничений памяти.Буду очень признателен за помощь.

XML находится в этой форме

<top>
    <page>
    <question>This is the first question</question>
    <answer>
         <text>Answer 1</text>
         <page>
              <question>If you choose Answer 1 you get asked this question</question>
              <answer>
              .
              .
              </answer>
              <answer>
              .
              .
               </answer>
         </page>
    </answer>

    <answer>
         <text>Answer 2</text>
         .
         .
         .
    </answer>

    </page>
</top>

Я надеюсь, что это имеет немного больше смысла, чем раньше.Таким образом, по сути, учитывая это дерево, я хочу создать экраны (во время выполнения), которые задают пользователю эти вопросы и принимают их ответы. В зависимости от своих ответов они получают следующий набор вопросов.Спасибо за действительно быстрые ответы !!

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Если вы хотите просто получить элементы верхнего уровня (те, которые находятся внутри корневого элемента документов), то я бы предложил сохранить Stack текущего элемента (ов). Когда вы нажмете начало, поместите имя элемента в стек. Когда вы остановитесь, вытолкните название элемента из стека. Всякий раз, когда у вас есть один элемент в стеке, у вас есть элемент верхнего уровня.

0 голосов
/ 03 августа 2011

Мне кажется, что первый алгоритм был бы интуитивно эффективнее для получения узлов первого уровня.Тем не менее, это, кажется, очень "человеческий" подход.Я не могу придумать, как парсер xml мог угадать, где заканчивается тег первого уровня, когда он читает начальный тег.

Так что, в любом случае, вашему парсеру придется читать весь файл, укладывая все узлы.Возможно, можно было бы избежать суммирования, но это похоже на арахис по сравнению с фактической оценкой самой структуры xml.Таким образом, выгода не будет огромной.

Рассматривали ли вы использование базы данных и двух таблиц с отношением один ко многим?Это решит вопрос эффективности и объема данных, с которыми ваше приложение сможет справиться.

С уважением, Стефан

0 голосов
/ 03 августа 2011

Если вы не хотите использовать DOM, вам нужно будет создать собственную объектную модель документа из XML с глубокой перспективы. После построения модели вы можете применить семантику в ширину.

Если вы беспокоитесь о памяти, то нет ничего, что говорит о том, что ваша объектная модель должна быть в памяти ... вы можете сохранить ее в базе данных SQLLite во время анализа. Это может помочь вам избежать многократного анализа XML и улучшить интеграцию с вашим приложением.

Без каких-либо других деталей, это все, что я могу вам сказать.

...