以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  JAVA DOM解析错误,节点被删除以后导致错误  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=40462)


--  作者:hardcoder
--  发布时间:11/24/2006 4:19:00 PM

--  JAVA DOM解析错误,节点被删除以后导致错误
XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" herf="students.xsl"?>
<students>
 <student sn="01">
  <name>张三</name>
  <age>18</age>
 </student>
 <student sn="02">
  <name>李四</name>
  <age>20</age>
 </student>
</students>

JAVA代码:
package domstudentinfo;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.*;
import org.xml.sax.SAXException;


/**
* <p>Title:添加,删除和修改节点 </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class DOMConvert
{
    public static void main(String[] args)
    {
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        try
        {
            DocumentBuilder db=dbf.newDocumentBuilder();
            Document doc=db.parse("students.xml");

            //------------------添加节点------------------
            //创建表示一个学生信息的各元素节点
            Element eltStu=doc.createElement("student");
            Element eltName=doc.createElement("name");
            Element eltAge=doc.createElement("age");

            //创建<student>元素的sn属性节点
            Attr attr=doc.createAttribute("sn");
            attr.setValue("03");

            //创建代表学生信息的文本节点
            Text txtName=doc.createTextNode("王五");
            Text txtAge=doc.createTextNode("19");

            //将文本节点添加为对应的元素节点的子节点
            eltName.appendChild(txtName);
            eltAge.appendChild(txtAge);

            //将name和age节点添加为student节点的子节点
            eltStu.appendChild(eltName);
            eltStu.appendChild(eltAge);

            //为<student>元素添加sn属性节点
            eltStu.setAttributeNode(attr);

            //得到XML文档的根元素。
            Element eltRoot=doc.getDocumentElement();

            //将student节点添加为根元素的子节点
            eltRoot.appendChild(eltStu);

            NodeList nl=doc.getElementsByTagName("student");

            //------------------删除节点------------------
            Node nodeDel=nl.item(0);
            nodeDel.getParentNode().removeChild(nodeDel);

            //------------------修改节点------------------
            //注意:NodeList对象是动态的,所以前面删除节点的操作会影响到NodeList对象,
            //NodeList中的节点对象会重新进行排列,此时,索引为0的节点是先前节点
            //列表中索引为1的节点。
            Element eltChg=(Element)nl.item(0);
            Node nodeAgeChg=eltChg.getElementsByTagName("age").item(0);
            nodeAgeChg.getFirstChild().setNodeValue("22");


            //输出修改后的学生信息。
            for(int i=0;i<nl.getLength();i++)
            {
                Element elt=(Element)nl.item(i);
                System.out.println("编号:"+elt.getAttribute("sn"));

                Node nodeName=elt.getElementsByTagName("name").item(0);
                Node nodeAge=elt.getElementsByTagName("age").item(0);

                String name=nodeName.getFirstChild().getNodeValue();
                String age=nodeAge.getFirstChild().getNodeValue();

                System.out.print("姓名:");
                System.out.println(name);

                System.out.print("年龄:");
                System.out.println(age);
                System.out.println("------------------------------------------");
            }
        }
        catch(ParserConfigurationException e){e.printStackTrace();}
        catch(SAXException e){e.printStackTrace();}
        catch(IOException e){e.printStackTrace();}
    }
}

错误输出:

java.lang.NullPointerException

 at domstudentinfo.DOMConvert.main(DOMConvert.java:85)

编号:01

姓名:张三

年龄:22

------------------------------------------

Exception in thread "main"


--  作者:hardcoder
--  发布时间:11/24/2006 4:20:00 PM

--  
如果把删除节点的代码注释去,就OK,为什么
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms