【问题标题】:Handle two diffrent xml files on single request : Android在单个请求上处理两个不同的 xml 文件:Android
【发布时间】:2011-08-16 13:27:17
【问题描述】:

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

我在做什么:

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

我想要什么:

我将以 POST 方法向服务器发送请求,服务器将根据我的请求发送 XML 作为响应。

例如:

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

  • 如果认证失败,服务器发送响应为

我遇到的问题:

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

我正在使用 android.sax 解析器,并为这两种类型的 xml 响应创建了两个解析器类,但是如何根据响应确定我应该使用哪个解析器类?强>

更新:

这是我的实际 xml

那么我该如何解析它,使用单个解析器呢?

【问题讨论】:

  • 你为什么不只使用一个解析器?只需让错误解析器返回 null 或某种告诉您错误的标志。
  • David Olsson 我可以使用单个解析器。但我不知道如何将单个解析器用于不同的 XML。请提供一些信息。
  • 我已经发布了一个带有示例的答案,以便能够使用一个解析器。
  • 有关示例和文档,请参阅 totheriver.com/learn/xml/xmltutorial.html

标签: android xmlhttprequest xml-parsing saxparser


【解决方案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;
 }
}

在您的解析器中,查看响应是否为假。这是基于这样一个事实,即您来自 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);
}

【讨论】:

  • 这太棒了!但问题是一样的,我的第二个 XML(实际上)是不同的。我只是举了一个 XML 的例子。我可以输入我的实际 XML 吗?
  • 是的,把它放在你的问题中。其实没关系,你只需要在不同的 if-cases 中改变 localName.equals("yourRealTags") 。
  • 如果您复制文本而不添加图片会更容易。您确定这些列只是命名列而不是真实名称吗?如果您不知道名称,则需要尝试根据所包含的内容来弄清楚它们是什么。可以说 buffer.toString() 只给你数字,它可能是年龄。但是您的 XML 似乎有点粗糙。我给了你一个例子,我没有时间为你做所有的代码。试试看能否得到更多唯一的标签名称。
  • 尝试在 xml 解析器下的 ibm.com/developerworks/opensource/library/x-android 阅读它。
  • 如何使用上述方法读取 tag_attr 的值?
【解决方案2】:

答案是有一个专门适合于传达响应值的响应类。一个常见的结构是:

  • IsError
  • 留言
  • 数据

这个想法是,对于每个响应,您都可以检查它是否是错误的......如果是这样,您可以将 Message 中的值显示给用户。如果不是,则获取“数据”并反序列化它

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2013-12-26
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多