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"

  

原文地址:https://www.cnblogs.com/wyqfighting/p/3120835.html