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 相关文章推荐
教你用Java在个人电脑上实现微信扫码支付
Jun 13 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
Java数据结构之链表相关知识总结
Jun 18 Java/Android
Mybatis-plus在项目中的简单应用
Jul 01 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
正则表达式拆分url实例代码
Feb 24 Java/Android
Java练习之潜艇小游戏的实现
Mar 16 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
详解Angular4 路由设置相关
2017/08/26 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
jQuery实现日历效果
2020/09/11 jQuery
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
python通过yield实现数组全排列的方法
2015/03/18 Python
python中requests模块的使用方法
2015/04/08 Python
Python字符串详细介绍
2015/05/09 Python
python文件与目录操作实例详解
2016/02/22 Python
Python线程创建和终止实例代码
2018/01/20 Python
python三大神器之fabric使用教程
2019/06/10 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
体育部部长竞选稿
2015/11/21 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
关于JavaScript轮播图的实现
2021/11/20 Javascript
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android