xml DOM解析
DOM解析方法:必不可少的五句话,剩下的就是根据自己的要求来写了。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //取得DocumentBuilderFactory实例 DocumentBuilder builder = factory.newDocumentBuilder(); //从factory获取DocumentBuilder实例 InputStream is = getAssets().open("DevInfoRequest.xml"); Document doc = builder.parse(is); //解析输入流 得到Document实例 Element rootElement = doc.getDocumentElement();//得到根节点
XML文档:
<?xml version="1.0" ?> <book> <author>wyq</author> <page>90</page> <font color = "red">word</font> </book>
以上面的xml文档为例来说明。
1、String rootName = doc.getDocumentElement().getNodeName() 得到的根节点是"book";
2、int len = rootElement.getChildNodes().getLength(); 得到的长度是7
打印之:for(int i=0;i<len;i++){
Node n = rootElement.getChildNodes().item(i); Log.d("nodeName",n.getNodeName(););}
分别是#text, author, #text, page, #text, font, #text。
对应 ? , <author> </author> <page> </page> <font> </font>
但是,第一个#text代表什么了? 我们用rootElement.getFirstChild().getNodeName()看看,打印出#text,不懂?
注意:取节点名,要用getNodeName(),不能用getLocalName()。
3、想取出某个元素的文本内容,如<author>wyq</author>,取出wyq。
if(nodeName=="author"){ n.getTextContent(); //值为wyq}
注意:不可用getNodeValue(),它取出来的值为null
4、想取出某个元素的属性,如<font color = "red">word</font>,取出red
Element e =(Element)rootElement.getElementsByTagName("font").item(0);
e.getAttribute("color"); //值为red
5、想为元素赋值,同上,有相应的set方法。
再举一例,此例中有xml嵌套定义
<?xml version="1.0" ?> <Message Version="1"> <Header> <get_node_info domain_name="m20121716.dddns.org" ></get_node_info> </Header> </Message>
我们利用
int len = rootElement.getChildNodes().getLength();
Log.d("len","len is "+len); //结果为3
for(int i=0;i<len;i++){
Node n = rootElement.getChildNodes().item(i);
String nodeName = n.getNodeName();
Log.d("nodeName",nodeName);
}
结果为:#text, Header, #text
对应: ? <Header> </Header>
可以看出,并没有遍历到get_node_info这个节点,可见,getChildNodes()只是得到它的直接子节点。
1、想要取得get_node_info的属性值,直接用
Element e =(Element)rootElement.getElementsByTagName("get_node_info").item(0);
a=e.getAttribute("domain_name");
并不需要遍历到这个节点,可以直接查找。
2、更改属性
e.setAttribute("domain_name", "nice");
再用e.getAttribute("domain_name");取出来打印看,已经修改成功了,打印为"nice"