简体   繁体   English

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

[英]How to parse XML string with XmlPullParser in Java?

I have this xml: 我有这个xml:

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

and following java code: 以及以下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;
}

But xpp.getName() returns null instead of "result" . 但是xpp.getName()返回null而不是"result" As result NullPointerException is throwed. 结果,抛出NullPointerException

Where am I wrong? 我哪里错了?

Change your code like this. 像这样更改您的代码。

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

XmlPullParser doc XmlPullParser文档

Of course you need to check some more conditions like what if there is no text or tag consist another nested tag... 当然,您需要检查更多条件,例如如果没有文本或标签包含另一个嵌套标签,该怎么办...

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

and this 和这个

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

would work for something nested like 适用于嵌套的东西

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM