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


Posted in Java/Android onAugust 07, 2021

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的操作应该还是非常简单明了的,掌握了没哦。

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

Java/Android 相关文章推荐
MybatisPlus代码生成器的使用方法详解
Jun 13 Java/Android
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
springboot+WebMagic+MyBatis爬虫框架的使用
Aug 07 Java/Android
spring cloud 配置中心native配置方式
Sep 25 Java/Android
解析mybatis-plus中的resultMap简单使用
Nov 23 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 Java/Android
springboot+WebMagic+MyBatis爬虫框架的使用
Aug 07 #Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 #Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 #Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 #Java/Android
浅谈Java父子类加载顺序
Aug 04 #Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 #Java/Android
Java后台生成图片的完整步骤
Aug 04 #Java/Android
You might like
使用php shell命令合并图片的代码
2011/06/23 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Django实现学生管理系统
2019/02/26 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
国际贸易专业个人鉴定
2014/02/22 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
法人身份证明书
2015/06/18 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书