欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java org.w3c.dom.Document 类方法引用报错

程序员文章站 2022-06-16 08:32:27
org.w3c.dom.document 类方法引用报错the method setxmlversion(string) is undefined for the type document开发时我们...

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对象上进行操作即可;

包含的方法:

Java org.w3c.dom.Document 类方法引用报错

Java org.w3c.dom.Document 类方法引用报错

4.节点列表类nodelist

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

Java org.w3c.dom.Document 类方法引用报错

5.节点类node

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

6.元素类element

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

Java org.w3c.dom.Document 类方法引用报错

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();
    }
}

运行后结果:

Java org.w3c.dom.Document 类方法引用报错

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

Java org.w3c.dom.Document 类方法引用报错

打开查看内容:

Java org.w3c.dom.Document 类方法引用报错

上面添加元素后输出的文件与之前的文件不是同一个文件,如果需要输出到原文件中,那么只要将路径改为原文间路径即可: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();
    }
}

运行结果:

Java org.w3c.dom.Document 类方法引用报错

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

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