【问题】
折腾:
【未解决】Android中解析/res/raw文件夹下面的xml文件
时,试了试下面代码:
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(); NodeList nodeList = root.getElementsByTagName(tag); //NodeList nodeList = root.getElementsByTagNameNS(namespaceURI, localName)(tag); for(int idx = 0; idx < nodeList.getLength(); idx++){ Node curNode = nodeList.item(idx); String nodeName = curNode.getNodeName(); } } 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; } //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; }
结果用getElementsByTagName去获得对应的xml:
<?xml version="1.0" encoding="UTF-8"?> <Menu> <TabMenu Label="HART"> ...... </TabMenu> <TabMenu Label="Device"> ...... </TabMenu> ...... </Menu>
竟然得到是空的NodeList:
【解决过程】
1.使用自动提示,看了看,root还有另外一个函数:
public abstractAttrgetAttributeNodeNS (StringnamespaceURI,StringlocalName)Added inAPI level 1 Retrieves an Per [ XML Namespaces ] , applications must use the value Parameters namespaceURI localName Returns
Throws NOT_SUPPORTED_ERR: May be raised if the implementation does not support the feature |
但是不知道:
是不是由于namespace的原因
以及如何获得当前的namespace(好像当然xml中没有什么namespace)
2.参考:
xml – GetElementsByTagName returns empty list – Stack Overflow
xml – android getElementsByTagName returns empty list – Stack Overflow
没看到解决办法。
3.后来看到:
的提示,貌似是可以通过:
root的另外一个函数:
getNamespaceURI()
去获得当然namespace,然后再去试试:
//NodeList nodeList = root.getElementsByTagName(tag); String namespaceURI = root.getNamespaceURI(); NodeList nodeList = root.getElementsByTagNameNS(namespaceURI, tag);
看看结果如何,调试发现得到的namespace也是null。
所以还是无法获得对应的我要的内容。
4.后来看到:
android getElementsByTagName returns empty list (1 answer)
还是没解决办法。
5.参考:
Element.getElementsByTagName – Web API Interfaces | MDN
去看看document是否有“ getElementById
”,不过待会再试。
6.不过试了试,去查找,非root节点,找其他的tag:
//NodeList nodeList = root.getElementsByTagName(tag); NodeList nodeList = root.getElementsByTagName("TabMenu");
就可以找到了:
7.突然想到了,是不是:
当然已经是处于root节点了,所以无法获得对应的root节点的tag?
但是可以(通过tag去)获得root节点其下的其他的节点?
所以,去验证一下此想法:
builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); Element root = document.getDocumentElement(); Element menuElement = document.getElementById("Menu"); NodeList tabNodeList = menuElement.getElementsByTagName("TabMenu");
结果还是获得空值:
8.再去试试:
NodeList nodeList = root.getChildNodes();
看看结果,是可以获得对应的子节点的:
[org.apache.harmony.xml.dom.TextImpl@211914f8, org.apache.harmony.xml.dom.ElementImpl@21191668, org.apache.harmony.xml.dom.TextImpl@21194f58, org.apache.harmony.xml.dom.ElementImpl@21194fb8, org.apache.harmony.xml.dom.TextImpl@21198c80, org.apache.harmony.xml.dom.ElementImpl@21198d48, org.apache.harmony.xml.dom.TextImpl@2119f038, org.apache.harmony.xml.dom.ElementImpl@2119f100, org.apache.harmony.xml.dom.TextImpl@211a16c0] |
其中的4个ElementImpl才是我们所关心的节点。
9.也注意到:
xml – android getElementsByTagName returns empty list – Stack Overflow
中提到了,其遇到此问题的android的版本是3.0或3.1
所以去看看我此处的:
Samsung Galaxy Tab 3 GT-P5210
android版本是:4.2.2
结果也出现此问题。。。
【总结】
算了,截至目前:
虽然会遇到上述bug:
即:
NodeList nodeList = root.getElementsByTagName("Menu");
获得空列表。
但是此处,还是可以通过,直接使用
NodeList nodeList = root.getElementsByTagName("TabMenu");
的方式,去获得根节点其下的子节点的,暂时规避此问题,继续去写我的其他代码的。。。