在单个请求上处理两个不同的xml文件:Android

时间:2011-08-16 13:27:18

标签: android xmlhttprequest xml-parsing saxparser

首先,我没有为我的问题找到更好的标题,所以如果你有一些话,请更新。

我在做什么:

目前我正在为此目的发送两个请求(一个用于用户验证,另一个用于数据,如果用户已获得授权)。但我想使用单一请求。

我想要的是什么:

我将以POST方式向服务器发送请求,服务器将发送XML,因为响应取决于我的请求。

例如:

  • 我正在向服务器发送用户和密码。
  • 服务器验证该用户。
  • 如果用户授权,服务器将响应xml发送为

    enter image description here

  • 如果身份验证失败,服务器会将响应发送为

enter image description here

我遇到的问题:

我无法处理XML数据,实际上无法识别xml数据。

我正在使用android.sax解析器,我为这两种类型的xml响应创建了两个解析器类,但是如何识别我应该使用哪个解析器类取决于响应?

更新:

这是我的实际xml

enter image description here enter image description here

那么如何使用单一解析器解析它呢?

2 个答案:

答案 0 :(得分:1)

我会使用一种数据结构,它允许解析器查看它是否失败。 示例:

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;
 }
}

在您的解析器中,查看响应是否为false。这是基于以下事实:如果成功,您的Web服务响应不包含响应标记。

以下是解析器的示例,可能需要进行一些调整才能使用它。只有在您的回复中只有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);
}

答案 1 :(得分:0)

答案是有一个特别适合传达响应值的响应类。一个共同的结构是:

  • ISERROR
  • 消息
  • 数据

这个想法是,对于每个响应,您可以检查是否是错误...如果是,您可以在Message中向用户显示值。如果没有,请采取'数据',然后反序列化