Java org.w3c.dom.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对象上进行操作即可;
包含的方法:
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的操作应该还是非常简单明了的,掌握了没哦。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: react初始化准备工作