Обработка двух разных XML-файлов по одному запросу: Android - PullRequest
1 голос
/ 16 августа 2011

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

Что я делаю:

В настоящее время я посылаю два запроса для этой цели (один для подтверждения пользователя, другой для данных, если пользователь авторизован). Но я хочу использовать один запрос.

Что я хочу:

Я отправлю запрос в качестве метода POST на сервер, где сервер отправит XML, поскольку ответ зависит от моего запроса.

Например:

  • Я отправляю имя пользователя и пароль на сервер.
  • Сервер аутентифицирует этого пользователя.
  • Если пользователь авторизован, сервер отправляет ответ xml как

    enter image description here

  • Если аутентификация не удалась, сервер отправляет ответ как

enter image description here

Проблема, с которой я столкнулся:

Я не могу обрабатывать данные XML, фактически не могу идентифицировать данные XML.

Я использую синтаксический анализатор android.sax и создал два класса анализатора для обоих типов ответов xml. Но как определить, какой класс анализатора следует использовать, зависит от ответа?

Обновление:

Вот мой фактический xml

enter image description hereenter image description here

Так как я могу разобрать его, используя один парсер?

Ответы [ 2 ]

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

Я бы использовал структуру данных, которая позволяет анализатору увидеть, произошел ли сбой или нет.Пример:

public class XMLResponse {
 private boolean hasFailed;
 private Employee employee;
 public void setFailure(boolean in) {
    this.hasFailed=in;
 }
 public void setEmployee(Employee in) {
    this.employee=in;
 }
}

И в вашем парсере посмотрите, является ли ответ ложным или нет.Это основано на том факте, что ваш ответ от веб-службы не содержит тег ответа, если он успешен.

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

public class XMLHandler extends DefaultHandler {
private XMLResponse myResponse;
private Employee employee;
public XMLResponse getParsedData() { 
    return this.myResponse;
}
@Override
public void startDocument() throws SAXException {
    myResponse = new XMLResponse();
    employee = new Employee();
}

@Override
public void startElement(String namespaceURI, String localName,

        String qName, Attributes atts) throws SAXException {
    buffer = new StringBuffer();
    if(localName.equals("employee")) {
        employee.setId(atts.getValue("id"));
    }
}
@Override

public void endElement(String namespaceURI, String localName, String qName)

throws SAXException {

    if(localName.equals("response")) {
        if(buffer.toString().contains("failure")) {
            myResponse.setFailure(true);
        }
    }
    else if(localName.equals("info")) {
        /*
         * This is only an example, could bee employee or whatever. You should use the startElement to get the tag. 
         */
    }
    else if(localName.equals("name")) {
        employee.setName(buffer.toString());
    }
    else if(localName.equals("age")) {
        employee.setAge(buffer.toString());
    }
    else if(localName.equals("employee")) {
        myResponse.setEmployee(employee);
    }


}

/** Gets be called on the following structure:

 * <tag>characters</tag> */


StringBuffer buffer;
@Override
public void characters(char ch[], int start, int length) {

    buffer.append(ch,start,length);
}
0 голосов
/ 16 августа 2011

Ответ должен иметь класс ответа, специально предназначенный для передачи значений ответа. Общая структура:

  • IsError
  • Сообщение * * 1006
  • Данные

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

...