【背景】
一个android项目,在项目的/res/raw文件夹下面存在一个xml文件:groupmenu.xml
现在需要加载并解析出来。
【折腾过程】
1.参考:
Providing Resources | Android Developers
找到解释:
Arbitrary files to save in their raw form. To open these resources with a raw However, if you need access to original file names and file hierarchy, you might consider saving some resources in the |
2.然后去看看:
Resources | Android Developers
3.再去参考:
Complete XML reading/parsing on Android Tutorial | ITek Blog
结果出错:
【已解决】Android中使用getResources去尝试解析xml时出错:The method getResources() is undefined for the type
然后就可以通过代码:
InputStream is = AppContext.getInstance().getResources().openRawResource(R.raw.groupmenu);
去获得对应的InputStream了。
4.接下来,就是学习:
Complete XML reading/parsing on Android Tutorial | ITek Blog
得知:
对于得到了xml文件的InputStream后,有三种处理办法:
- Pull parser
- XmlResourceParser就是此变体
- Java’s Simple API for XML (SAX) parser
- 最常用的就是SAX
- Document Object Model (DOM) parser
然后打算用SAX去处理xml。搜:
android sax xml
找到:
Android——使用SAX解析XML – guanMac – eoe移动开发者社区
看了后,发现SAX使用上的确很繁琐,所以放弃用SAX了。
5.打算去试试:
Providing Resources | Android Developers
中说的那个:
不过暂时不去试了。
6.想要去用XmlPullParser去解析xml,参考了一堆帖子:
andoird — XmlPullParser 的使用 – andyhuabing的专栏 – 博客频道 – CSDN.NET
XML解析——XmlPullParser – 阿弥陀佛 – ITeye技术网站
发现也还是很麻烦,所以也是放弃。
7.想起了:
Complete XML reading/parsing on Android Tutorial | ITek Blog
提到DOM可以用xpath,所以感觉应该会好用些。
所以再去看看DOM方式解析xml。
期间遇到一个bug:
【已解决】Android中用DOM方式解析xml时使用getElementsByTagName去获得节点结果为空
但是暂时规避掉了。。。
8.剩下的,就是可以正常去解析xml了。
给出相关的代码:
//public String getUniversalDataGroup() { public UIDataGroup getUniversalDataGroup() { UIDataGroup uiDataGroup = new UIDataGroup(); //parse xml file to UIDataGroup String menuTag = "Menu"; //String tabMenuTag = "TabMenu"; //ArrayList<XmlItem> rootMenuItemList= XmlHelper.getXmlItems(groupMenuFilename, menuTag,null); //XmlItem rootMenuItem = InputStream inputStream = AppContext.getInstance().getResources().openRawResource(R.raw.groupmenu); //ArrayList<XmlItem> rootMenuItemList= XmlHelper.getXmlItems(inputStream, menuTag,null); ArrayList<XmlItem> rootMenuItemList= XmlHelper.getXmlItems(inputStream, menuTag); return uiDataGroup; } public static ArrayList<XmlItem> getXmlItems(InputStream inputStream, String tag){ ArrayList<XmlItem> xmlItemList = new ArrayList<XmlItem>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; try { builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); Element root = document.getDocumentElement(); //Element menuElement = document.getElementById("Menu"); //NodeList tabNodeList = menuElement.getElementsByTagName("TabMenu"); //NodeList nodeList = root.getElementsByTagName(tag); NodeList nodeList = root.getElementsByTagName("TabMenu"); //NodeList nodeList = root.getChildNodes(); //String namespaceURI = root.getNamespaceURI(); //null //NodeList nodeList = root.getElementsByTagNameNS(namespaceURI, tag); for(int idx = 0; idx < nodeList.getLength(); idx++){ Node curNode = nodeList.item(idx); String nodeName = curNode.getNodeName(); String nodeValue = curNode.getNodeValue(); //....... } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return xmlItemList; }
【总结】
Android中解析/res/raw下面的xml文件的相关主题代码如下:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.content.res.XmlResourceParser; import android.util.Xml; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; InputStream is = AppContext.getInstance().getResources().openRawResource(R.raw.groupmenu); ArrayList<XmlItem> xmlItemList = new ArrayList<XmlItem>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); Element root = document.getDocumentElement(); NodeList nodeList = root.getChildNodes(); //NodeList nodeList = root.getElementsByTagName("TabMenu"); for(int idx = 0; idx < nodeList.getLength(); idx++){ Node curNode = nodeList.item(idx); String nodeName = curNode.getNodeName(); String nodeValue = curNode.getNodeValue(); //get value, add to your var list }
供参考。