#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 не может быть изменен.