如何用Java中的XmlPullParser解析XML字符串?

时间:2015-12-10 08:52:50

标签: java android xml

我有这个xml:

<xml><result>-1</result></xml>

以及以下java代码:

public String findElement(String xml, String elem) {
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();

        xpp.setInput( new StringReader (xml) );

        while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
            if (xpp.getName().equals(elem)) {
                return xpp.getText();
            }
            xpp.next();
        }
    } catch (XmlPullParserException | IOException e) {
        e.printStackTrace();
    }
    return null;
}

xpp.getName()返回null而不是"result"。结果NullPointerException被抛出。

我哪里错了?

2 个答案:

答案 0 :(得分:1)

像这样更改您的代码。

        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {
                if (xpp.getName().equals(elem)) {
                    eventType = xpp.next(); // advance to inner text
                    return xpp.getText();
                }
            }
            eventType = xpp.next();
        }

答案 1 :(得分:1)

XmlPullParser doc

当然你需要检查一些更多的条件,比如如果没有文本或标签包含另一个嵌套标签......

public String findElement(String xml, String elem) {
    try {
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      factory.setNamespaceAware(true);
      XmlPullParser xpp = factory.newPullParser();

      xpp.setInput(new StringReader(xml));
      while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {

        final int event = xpp.getEventType();
        if (event == XmlPullParser.START_TAG && xpp.getName().equals(elem)) {
          xpp.next();
          return xpp.getText();
        }
        xpp.next();

      }
    } catch (XmlPullParserException | IOException e) {
      e.printStackTrace();
    }
    return null;
  }

和这个

        if (event == XmlPullParser.START_TAG && xpp.getName().equals(elem)) {
      xpp.next();
      if (xpp.getEventType() == XmlPullParser.TEXT) {
        return xpp.getText();
      }
    }else{
      xpp.next();
    }

适用于嵌套的内容,如

"<xml><result><noway><result>-1</result></noway></result></xml>"