Синтаксический анализатор SAX, игнорирующий родительские элементы? Элементы с одинаковыми именами, сгруппированные в результате

#java #android #sax #saxparser

#java #Android #sax #saxparser

Вопрос:

Я не уверен, что это именно то, как должен работать синтаксический анализатор SAX, или я что-то упускаю.

Это тот XML, который я снимаю со своего сервера:

 <Data>
    <Item id="1">
        <Group>
          <Name>Question One</Name>
          <type>true</type>

          <Selection>
              <Name>Answer 1</Name>
          </Selection>
        </Group>
    </Item>
    <Item id="2">
        <Group>
          <Name>Question Two</Name>
          <type>true</type>

          <Selection>
              <Name>Answer 2</Name>
          </Selection>
        </Group>
    </Item>
</Data>
 

Как вы можете видеть, существует элемент с именем «Name», который дважды отображается у разных родителей и содержит разные данные. Я пытаюсь собрать «Вопрос один» и «Вопрос два» в ArrayList, где у меня есть получатель и установщик setName getName . Как следует из названия, мой результат означает, что даже ответы собираются в ArrayList для этого типа.

Есть ли способ получить только «Имя», которое относится к первому и второму вопросам? Вот как у меня это сейчас в моем конечном элементе:

 @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(uri, localName, qName);

    if (qName.equalsIgnoreCase("name")) {
        dataItem.setName(currentValue);
    }
 

Очевидно, я ищу только имя, но когда я попробовал его для «группы», а затем поставил второе состояние if внутри, мне тоже не повезло. По сути, он игнорирует родителей, группу и выделение и просто собирает все, что называется name . Использование localName также не помогает.

Я был бы очень признателен за вашу помощь, заранее спасибо.

Ответ №1:

SAX не обращает внимания на иерархию, но вы можете компенсировать это в своем коде.

Методы startElement , characters и endElement вызываются соответствующим образом для каждого начального тега, содержимого символа и конечного тега в порядке их появления, поэтому вам нужно распознать <Selection> тег в вашем startElement и установить флаг в вашем обработчике, чтобы не забывать игнорировать любые <name> теги, которые встречаются, пока вы не сбросите флаг при нажатии на </Selection> теги распознает его в вашем endElement методе.

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

Комментарии:

1. В конце концов я попросил моего серверного сотрудника изменить имя элемента, но, конечно, ваша точка зрения верна и является способом сделать это, если XML не может быть изменен.