org.w3c.dom.document 类方法引用报错

the method setxmlversion(string) is undefined for the type document

开发时我们可能会碰到这样的问题,它产生的原因是我们实际需要调用的是 jdk 环境 rt.jar 下的 org.w3c.dom.org.w3c.dom.document ,但事实上 eclipse 等 ide 工具此时自动为我们调用的是 j2ee 中的 xerces\xmlparserapis\2.6.2\xmlparserapis-2.6.2.jar ,这一点通过 ctrl 左键点击 document 类可以发现。

发现问题出在哪里就好解决了

我们需要做的是调整 eclipse 的调用顺序

项目右键 > properties > java build path > 右边 order and export

把 jre system library 通过点击 up 按钮放到 j2ee(maven dependencies) 的上面即可。

org.w3c.dom(java dom)解析xml文档

位于org.w3c.dom操作xml会比较简单,就是将xml看做是一颗树,dom就是对这颗树的一个数据结构的描述,但对大型xml文件效果可能会不理想

首先来了解点java dom 的 api:

1.解析器工厂类:documentbuilderfactory

创建的方法:

documentbuilderfactory dbf = documentbuilderfactory.newinstance();

2.解析器:documentbuilder

创建方法:通过解析器工厂类来获得

documentbuilder db = dbf.newdocumentbuilder();

3.文档树模型document

创建方法:a.通过xml文档 document doc = db.parse(“bean.xml”); b.将需要解析的xml文档转化为输入流 inputstream is = new fileinputstream(“bean.xml”);

document doc = db.parse(is); 

document对象代表了一个xml文档的模型树,所有的其他node都以一定的顺序包含在document对象之内,排列成一个树状结构,以后对xml文档的所有操作都与解析器无关,

直接在这个document对象上进行操作即可;

包含的方法:

4.节点列表类nodelist

nodelist代表了一个包含一个或者多个node的列表,根据操作可以将其简化的看做为数组

5.节点类node

node对象是dom中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用node对象,而是使用node对象的子对象element,attr,text等

6.元素类element

是node类最主要的子对象,在元素中可以包含属性,因而element中有存取其属性的方法

7.属性类attr

代表某个元素的属性,虽然attr继承自node接口,但因为attr是包含在element中的,但并不能将其看做是element的子对象,因为attr并不是dom树的一部分

基本的知识就到此结束,更加具体的大家可以参阅jdk api文档

实战:

1.使用dom来遍历xml文档中的全部内容并且插入元素:

school.xml文档:

<?xml version = "1.0" encoding = "utf-8"?>
<school>
    <student>
        <name>沈浪</name>
        <num>1006010022</num>
        <classes>信管2</classes>
        <address>浙江杭州3</address>
        <tel>123456</tel>
    </student>
    <student>
        <name>沈1</name>
        <num>1006010033</num>
        <classes>信管1</classes>
        <address>浙江杭州4</address>
        <tel>234567</tel>
    </student>
    <student>
        <name>沈2</name>
        <num>1006010044</num>
        <classes>生工2</classes>
        <address>浙江杭州1</address>
        <tel>345678</tel>
    </student>
    <student>
        <name>沈3</name>
        <num>1006010055</num>
        <classes>电子2</classes>
        <address>浙江杭州2</address>
        <tel>456789</tel>
    </student>
</school>

domdemo.java

package xidian.sl.dom;
import java.io.fileoutputstream;
import javax.xml.parsers.documentbuilder;
import javax.xml.parsers.documentbuilderfactory;
import org.apache.crimson.tree.xmldocument;
import org.w3c.dom.document;
import org.w3c.dom.element;
import org.w3c.dom.nodelist;
public class domdemo {
    /**
     * 遍历xml文档
     * */
    public static void queryxml(){
        try{
            //得到dom解析器的工厂实例
            documentbuilderfactory dbfactory = documentbuilderfactory.newinstance();
            //从dom工厂中获得dom解析器
            documentbuilder dbbuilder = dbfactory.newdocumentbuilder();
            //把要解析的xml文档读入dom解析器
            document doc = dbbuilder.parse("src/xidian/sl/dom/school.xml");
            system.out.println("处理该文档的domimplementation对象  = "+ doc.getimplementation());
            //得到文档名称为student的元素的节点列表
            nodelist nlist = doc.getelementsbytagname("student");
            //遍历该集合,显示结合中的元素及其子元素的名字
            for(int i = 0; i< nlist.getlength() ; i ++){
                element node = (element)nlist.item(i);
                system.out.println("name: "+ node.getelementsbytagname("name").item(0).getfirstchild().getnodevalue());
                system.out.println("num: "+ node.getelementsbytagname("num").item(0).getfirstchild().getnodevalue());
                system.out.println("classes: "+ node.getelementsbytagname("classes").item(0).getfirstchild().getnodevalue());
                system.out.println("address: "+ node.getelementsbytagname("address").item(0).getfirstchild().getnodevalue());
                system.out.println("tel: "+ node.getelementsbytagname("tel").item(0).getfirstchild().getnodevalue());
            }
            
        }catch (exception e) {
            // todo: handle exception
            e.printstacktrace();
        }
    }
    /**
     * 向已存在的xml文件中插入元素
     * */
    public static void insertxml(){
        element school = null;
        element student = null;
        element name = null;
        element num = null;
        element classes = null;
        element address = null;
        element tel = null;
        try{
            //得到dom解析器的工厂实例
            documentbuilderfactory dbfactory = documentbuilderfactory.newinstance();
            //从dom工厂中获得dom解析器
            documentbuilder dbbuilder = dbfactory.newdocumentbuilder();
            //把要解析的xml文档读入dom解析器
            document doc = dbbuilder.parse("src/xidian/sl/dom/school.xml");
            //得到文档名称为student的元素的节点列表
            nodelist nlist = doc.getelementsbytagname("school");
            school = (element)nlist.item(0);
            //创建名称为student的元素
            student = doc.createelement("student");
            //设置元素student的属性值为231
            student.setattribute("examid", "23");
            //创建名称为name的元素
            name = doc.createelement("name");
            //创建名称为 香香 的文本节点并作为子节点添加到name元素中
            name.appendchild(doc.createtextnode("香香"));
            //将name子元素添加到student中
            student.appendchild(name);
            /**
             * 下面的元素依次加入即可
             * */
            num = doc.createelement("num");
            num.appendchild(doc.createtextnode("1006010066"));
            student.appendchild(num);
            
            classes = doc.createelement("classes");
            classes.appendchild(doc.createtextnode("眼视光5"));
            student.appendchild(classes);
            
            address = doc.createelement("address");
            address.appendchild(doc.createtextnode("浙江温州"));
            student.appendchild(address);
            
            tel = doc.createelement("tel");
            tel.appendchild(doc.createtextnode("123890"));
            student.appendchild(tel);
            
            //将student作为子元素添加到树的根节点school
            school.appendchild(student);
            //将内存中的文档通过文件流生成insertschool.xml,xmldocument位于crison.jar下
            ((xmldocument)doc).write(new fileoutputstream("src/xidian/sl/dom/insertschool.xml"));
            system.out.println("成功");
        }catch (exception e) {
            // todo: handle exception
            e.printstacktrace();
        }    
    }
    public static void main(string[] args){
        //读取
        domdemo.queryxml();
        //插入
        domdemo.insertxml();
    }
}

运行后结果:

然后到目录下查看生成的xml文件:

打开查看内容:

上面添加元素后输出的文件与之前的文件不是同一个文件,如果需要输出到原文件中,那么只要将路径改为原文间路径即可:src/xidian/sl/dom/school.xml

2.创建xml过程与插入过程相似,就是document需要创建

package xidian.sl.dom;
import java.io.fileoutputstream;
import javax.xml.parsers.documentbuilder;
import javax.xml.parsers.documentbuilderfactory;
import org.apache.crimson.tree.xmldocument;
import org.w3c.dom.document;
import org.w3c.dom.element;
public class createnewdom {
    /**
     * 创建xml文档
     * */
    public static void createdom(){
        document doc;
        element school,student;
        element name = null;
        element num = null;
        element classes = null;
        element address = null;
        element tel = null;
        try{
            //得到dom解析器的工厂实例
            documentbuilderfactory dbfactory = documentbuilderfactory.newinstance();
            //从dom工厂中获得dom解析器
            documentbuilder dbbuilder = dbfactory.newdocumentbuilder();
            //创建文档树模型对象
            doc = dbbuilder.newdocument();
            if(doc != null){
                //创建school元素
                school = doc.createelement("school");
                //创建student元素
                student = doc.createelement("student");
                //设置元素student的属性值为231
                student.setattribute("examid", "23");
                //创建名称为name的元素
                name = doc.createelement("name");
                //创建名称为 香香 的文本节点并作为子节点添加到name元素中
                name.appendchild(doc.createtextnode("香香"));
                //将name子元素添加到student中
                student.appendchild(name);
                /**
                 * 下面的元素依次加入即可
                 * */
                num = doc.createelement("num");
                num.appendchild(doc.createtextnode("1006010066"));
                student.appendchild(num);
                
                classes = doc.createelement("classes");
                classes.appendchild(doc.createtextnode("眼视光5"));
                student.appendchild(classes);
                
                address = doc.createelement("address");
                address.appendchild(doc.createtextnode("浙江温州"));
                student.appendchild(address);
                
                tel = doc.createelement("tel");
                tel.appendchild(doc.createtextnode("123890"));
                student.appendchild(tel);
                
                //将student作为子元素添加到树的根节点school
                school.appendchild(student);
                //添加到文档树中
                doc.appendchild(school);
                //将内存中的文档通过文件流生成insertschool.xml,xmldocument位于crison.jar下
                ((xmldocument)doc).write(new fileoutputstream("src/xidian/sl/dom/createschool.xml"));
                system.out.println("创建成功");
            }
        }catch (exception e) {
            // todo: handle exception
            e.printstacktrace();
        }
    }
    public static void main(string[] args) {
        createnewdom.createdom();
    }
}

运行结果:

dom的操作应该还是非常简单明了的,掌握了没哦。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。