是否可以在Android中使用DOM解析器解析特定的XML?

用户名

以下格式是服务器的响应。我正在尝试通过使用DOM来解析此问题,但是却出现了一个异常,即“只允许一个根元素”。

<?xml version="1.0" encoding="UTF-8" ?>
  <responseCode>2000</responseCode>
  <responseText>Success</responseText>
  <response>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
  </response>
  <response>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
  </response>
  <response>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
    <response1>on</response1>
  </response>
拉希特·米什拉(Rachit Mishra)

使用进行解析会容易得多XmlPullParser,并且效率也更高

前任。XML文件内容(在外部存储中另存为code.xml)

<?xml version="1.0" encoding="utf-8"?>
<countries>
 <country>
   <name>Iran</name>
   <phonecode>+98</phonecode>
   <code>IRI</code>
 </country>
 <country>
   <name>United State</name>
   <phonecode>+1</phonecode>
   <code>USA</code>
 </country>
</countries>

让我们开始解析它

  1. 首先创建一个Helper类

    import android.util.Xml;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class XmlDataParseHelper {
    
    private XmlPullParser parser;
    private static final String NULL = null;
    
    /**
     * 
     * @param in
     * @throws XmlPullParserException
     * @throws IOException
     * @throws IllegalArgumentException
     */
    public XmlDataParseHelper(InputStream in) throws XmlPullParserException,
            IOException, IllegalArgumentException {
        try {
            parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(in, null);
            parser.nextTag();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 
     * @return XmlPullParser
     */
    public XmlPullParser getParser() {
        return parser;
    }
    
    /**
     * 
     * @param parser
     * @param tag
     * @return String
     * @throws IOException
     * @throws XmlPullParserException
     */
    public static String readTag(XmlPullParser parser, String tag)
            throws IOException, XmlPullParserException {
        String tagData = "";
        parser.require(XmlPullParser.START_TAG, NULL, tag);
        if (parser.next() == XmlPullParser.TEXT) {
            tagData = parser.getText();
            parser.nextTag();
        }
        parser.require(XmlPullParser.END_TAG, NULL, tag);
        return tagData;
    }
    
    /**
     * 
     * @param parser
     * @param tag
     * @param attributeName
     * @return String
     * @throws IOException
     * @throws XmlPullParserException
     */
    public static String readAttribute(XmlPullParser parser, String tag,
            String attributeName) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, NULL, tag);
        String attributeData = parser.getAttributeValue(NULL, attributeName);
        parser.nextTag();
        parser.require(XmlPullParser.END_TAG, NULL, tag);
        return attributeData;
    }
    
    }
    
  2. 读取xml文件为

    public InputStream readFile(String fileName) throws FileNotFoundException,
            IOException {
    //check external storage present
    // else throw new IOException();
    
    return new FileInputStream(Environment.getExternalStorageDirectory()
            + "/" + fileName);
    }
    
  3. 将InputStream传递给另一个方法,该方法初始化XMLPullParser对象

     public void readXmlFile(String fileName) {
     try {
        if (fileName.isEmpty())
        throw new NullPointerException();
        readData(new XmlDataParseHelper(readFile(fileName)).getParser());
     } catch (IOException e) {
           e.printStackTrace();
     } catch (XmlPullParserException e) {
           e.printStackTrace();
     } catch (IllegalArgumentException e) {
           e.printStackTrace();
     }
     }
    
  4. Atlast将XMLPullParser objectas解析

      public void readData(XmlPullParser parser)
                throws XmlPullParserException, IOException {
    int eventType = parser.getEventType();
    String tagName = "";
    Log.w("Developer", "Reading file...");
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT :
                Log.w("Developer", "Reading backup file...");
                break;
            case XmlPullParser.START_TAG :
                tagName = parser.getName();
                if (tagName.equals("countries")) {
                    Log.w("XMLParse", "Start TAG countries");
                    // do something when countries tag starts
                }
                if (tagName.equals("country")) {
                    Log.w("XMLParse", "Start TAG country");
                    // do some when country tag starts
                } else if (tagName.equals("name")) {
                    // read tag value using XmlDataParseHelper class
                    String countryName = XmlDataParseHelper.readTag(parser,
                                    "name");
                    Log.w("XmlParser", "Country name : "+countryName);
                } else if (tagName.equals("phonecode")) {
                    String countryPhoneCode = 
                                  XmlDataParseHelper.readTag(parser,"phonecode");
                    Log.w("XmlParser", "Country Phone code : "+countryPhoneCode);
                } else if (tagName.equals("code")) {
                    String countryCode = 
                                 XmlDataParseHelper.readTag(parser, "code");
                    Log.w("XmlParser", "Country code name : "+countryCode); 
                }
            break;
            case XmlPullParser.END_TAG :
                tagName = parser.getName();
                if (tagName.equals("countries")) {
                      // do something when counties tag is close.
                }           
            break;
        }
        eventType = parser.next();
    }
    Log.w("Developer", "File parsing complete...");
     }
    
  5. 要读取文件,只需readXmlFile(String fileName)使用存储在外部存储器中的文件名在AsyncTask中调用该方法

整个android工作示例代码位于https://gist.github.com/rachitrm/7810837或分叉项目http://www.github.com/rachitrm/rm-xmlparser/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否有任何可以在 oracle 查询中使用的 xml 到 json 解析器?

来自分类Dev

无法使用php dom解析器解析特定的链接

来自分类Dev

使用DOM解析器解析XML困难

来自分类Dev

在qt DOM xml解析器中使用setContent(&file)加载较大的文件时出错

来自分类常见问题

使用DOM解析器从XML读取注释

来自分类Dev

使用DOM解析器读取XML注释

来自分类Dev

使用xml dom解析器获取元素

来自分类Dev

如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

来自分类Dev

如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

来自分类Dev

如何使用Android上的DocumentBuilder DOM解析器解析带有包含非拉丁Unicode字符的标记名的XML

来自分类Dev

使用xml解析器读取xml

来自分类Dev

解析网站并使用“ PHP简单HTML DOM解析器”保存特定的DIV

来自分类Dev

使用DOM解析器Java解析带有嵌套重复元素名称的xml文档。

来自分类Dev

使用DOM解析器Java解析具有嵌套重复元素名称的xml文档。

来自分类Dev

如何在不使用Java的DOM或SAX解析器的情况下解析XML?

来自分类Dev

QT:读取xml文件并使用DOM解析器对其进行解析

来自分类Dev

XML解析器是否可以防止.NET Core中的XML外部实体(XML)注入?

来自分类Dev

在路由解析器中使用订阅

来自分类Dev

在子解析器中使用`err`

来自分类Dev

是否可以使用JavaCC解析器解析String并对其应用分配法则?

来自分类Dev

在Python 3中使用SAX解析器解析XML

来自分类Dev

在Java中使用SAX解析器解析和更新xml

来自分类Dev

在Python 3中使用SAX解析器解析XML

来自分类Dev

使用PHP Simple HTML DOM解析器解析输出

来自分类Dev

使用PHP Simple HTML DOM解析器解析输出

来自分类Dev

如何在Android中使用Jackson解析器处理JSON数组解析

来自分类Dev

android xml解析器使用saxparser

来自分类Dev

如何使用android的Json解析器?

来自分类Dev

无法使用SAX XML解析器(Android)解析父/子元素

Related 相关文章

  1. 1

    是否有任何可以在 oracle 查询中使用的 xml 到 json 解析器?

  2. 2

    无法使用php dom解析器解析特定的链接

  3. 3

    使用DOM解析器解析XML困难

  4. 4

    在qt DOM xml解析器中使用setContent(&file)加载较大的文件时出错

  5. 5

    使用DOM解析器从XML读取注释

  6. 6

    使用DOM解析器读取XML注释

  7. 7

    使用xml dom解析器获取元素

  8. 8

    如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

  9. 9

    如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

  10. 10

    如何使用Android上的DocumentBuilder DOM解析器解析带有包含非拉丁Unicode字符的标记名的XML

  11. 11

    使用xml解析器读取xml

  12. 12

    解析网站并使用“ PHP简单HTML DOM解析器”保存特定的DIV

  13. 13

    使用DOM解析器Java解析带有嵌套重复元素名称的xml文档。

  14. 14

    使用DOM解析器Java解析具有嵌套重复元素名称的xml文档。

  15. 15

    如何在不使用Java的DOM或SAX解析器的情况下解析XML?

  16. 16

    QT:读取xml文件并使用DOM解析器对其进行解析

  17. 17

    XML解析器是否可以防止.NET Core中的XML外部实体(XML)注入?

  18. 18

    在路由解析器中使用订阅

  19. 19

    在子解析器中使用`err`

  20. 20

    是否可以使用JavaCC解析器解析String并对其应用分配法则?

  21. 21

    在Python 3中使用SAX解析器解析XML

  22. 22

    在Java中使用SAX解析器解析和更新xml

  23. 23

    在Python 3中使用SAX解析器解析XML

  24. 24

    使用PHP Simple HTML DOM解析器解析输出

  25. 25

    使用PHP Simple HTML DOM解析器解析输出

  26. 26

    如何在Android中使用Jackson解析器处理JSON数组解析

  27. 27

    android xml解析器使用saxparser

  28. 28

    如何使用android的Json解析器?

  29. 29

    无法使用SAX XML解析器(Android)解析父/子元素

热门标签

归档