DOM技术对xml增删改查后更新源文件异常报错
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cars><car id="1"><name>bus</name><effect>城市公共交通工具</effect><weight>3</weight><fixed>40</fixed></car><car id="2"><name>tractor</name><effect>农业运载工具</effect><weight>2</weight><fixed>2</fixed></car>
</cars>
现有如上XML文档,请使用DOM为id为1的汽车添加长度元素(length),同时修改fixed元素的值为30,并将id为2的汽车fixed元素删除。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 package com.yiscat.dom; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.StringWriter; 7 8 import javax.xml.parsers.DocumentBuilder; 9 import javax.xml.parsers.DocumentBuilderFactory; 10 import javax.xml.parsers.ParserConfigurationException; 11 import javax.xml.transform.OutputKeys; 12 import javax.xml.transform.Transformer; 13 import javax.xml.transform.TransformerConfigurationException; 14 import javax.xml.transform.TransformerException; 15 import javax.xml.transform.TransformerFactory; 16 import javax.xml.transform.dom.DOMSource; 17 import javax.xml.transform.stream.StreamResult; 18 19 import org.apache.xml.serialize.OutputFormat; 20 import org.apache.xml.serialize.XMLSerializer; 21 import org.w3c.dom.Document; 22 import org.w3c.dom.Element; 23 import org.w3c.dom.NamedNodeMap; 24 import org.w3c.dom.Node; 25 import org.w3c.dom.NodeList; 26 import org.xml.sax.SAXException; 27 28 public class DOMForXML { 29 30 public static Document doc = getDocuemt("car.xml"); 31 public static int count = 0; 32 33 /** 34 * 获取document对象 35 * 36 * @param fileName 37 * xml文件路径 38 * @return 39 */ 40 public static Document getDocuemt(String filePath) { 41 42 // 通过DOM解析器解析XML文件 43 // DOMParser parser = new DOMParser(); 44 // try { 45 // parser.parse("car.xml"); 46 // Document document = parser.getDocument(); 47 // } catch (SAXException e) { 48 // // TODO Auto-generated catch block 49 // e.printStackTrace(); 50 // } catch (IOException e) { 51 // // TODO Auto-generated catch block 52 // e.printStackTrace(); 53 // } 54 55 // 使用JAPX的工厂方法获得解析器对象 56 Document document = null; 57 // 获取DecumentBuilderFactory类的对象 58 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 59 DocumentBuilder builder; 60 try { 61 // 获取DocumentBuilder类的对象 62 builder = factory.newDocumentBuilder(); 63 // 获取Document对象 64 document = builder.parse(new FileInputStream(filePath)); 65 } catch (ParserConfigurationException e) { 66 // TODO Auto-generated catch block 67 e.printStackTrace(); 68 } catch (SAXException e) { 69 // TODO Auto-generated catch block 70 e.printStackTrace(); 71 } catch (IOException e) { 72 // TODO Auto-generated catch block 73 e.printStackTrace(); 74 } 75 return document; 76 } 77 78 /** 79 * 更新源文件 80 * 81 * @param document 82 * 文档节点 83 * @param filePath 84 * xml文件路径 85 * @return 86 */ 87 public static boolean saveXML(Document document, String filePath) { 88 boolean flag = false; 89 // 输出文档到文件中 90 TransformerFactory factory = TransformerFactory.newInstance(); 91 try { 92 // 使用工厂模式,实例化Transformer 93 Transformer transformer = factory.newTransformer(); 94 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 处理中文的 95 // 由DOM充当源树, 源树包含了源(如xml源)输入信息, 准备输出文档 96 DOMSource source = new DOMSource(document); 97 // 实例化结果树,结果树指转换后(对于stremResult包含了结果的输出流)结果的持有者 98 StreamResult result = new StreamResult(new File(filePath)); 99 // Transformer能够将源树转换成结果树 100 transformer.transform(source, result); 101 flag = true; 102 } catch (TransformerConfigurationException e) { 103 // TODO Auto-generated catch block 104 e.printStackTrace(); 105 } catch (TransformerException e) { 106 // TODO Auto-generated catch block 107 e.printStackTrace(); 108 } 109 return flag; 110 } 111 112 /** 113 * 在控制台输出xml文件 114 * 115 * @param document 116 * 文档节点 117 * @return 118 */ 119 public static boolean pritlnXML(Document document) { 120 boolean flag = false; 121 try { 122 // 输出一个DOM序列化的字符串 123 OutputFormat format = new OutputFormat(document); // 格式化DOM 124 StringWriter stringOut = new StringWriter(); // 字符流 125 XMLSerializer serial = new XMLSerializer(stringOut, format); 126 serial.asDOMSerializer(); // DOM序列化 127 serial.serialize(document.getDocumentElement()); 128 // 输出一个String的DOM 129 System.out.println(stringOut.toString()); 130 } catch (Exception ex) { 131 ex.printStackTrace(); 132 } 133 return flag; 134 } 135 136 /** 137 * 遍历文档 138 * 139 * @param node 140 */ 141 public static void processNode(Node node) { 142 switch (node.getNodeType()) { 143 // case Node.TEXT_NODE: 144 // 处理文本节点 145 // DOM中换行及空格也是作为节点处理的,这里把XML文件中的换行和空格过滤掉 146 // if (!node.getNodeValue().trim().equals("")) { 147 // System.out.println("元素数据:" + node.getNodeValue()); 148 // } 149 // break; 150 case Node.ELEMENT_NODE: 151 // 处理元素的属性 152 if (node.hasAttributes()) { 153 NamedNodeMap map = node.getAttributes(); 154 for (int i = 0; i < map.getLength(); i++) { 155 count++; 156 if (count == 1) { 157 Node lengthNode = doc.createElement("length"); // 创建length节点 158 lengthNode.appendChild(doc.createTextNode("长度")); // 设置节点内容 159 node.appendChild(lengthNode); // 设置节点关系 160 } 161 } 162 } 163 164 // 处理元素节点 165 if (node.getNodeName().equalsIgnoreCase("fixed")) { // 判断是否为fixed元素 166 if (count == 1) { 167 node.getFirstChild().setNodeValue("30"); // 设置fixed节点内容 168 } 169 if (count == 2) { 170 Node parent = node.getParentNode(); // 获取fixed元素的父节点 171 parent.removeChild(node); // 移除fixed元素节点 172 } 173 } 174 175 // 处理元素的子元素 176 if (node.hasChildNodes()) { 177 NodeList childNodeList = node.getChildNodes(); 178 for (int i = 0; i < childNodeList.getLength(); i++) { 179 Node childNode = childNodeList.item(i); 180 // 递归调用 181 processNode(childNode); 182 } 183 } 184 break; 185 } 186 } 187 188 public static void main(String[] args) { 189 // 获取根元素 190 Element root = doc.getDocumentElement(); 191 192 // 调用自定义静态方法对根元素进行处理 193 processNode(root); 194 195 // 控制台输出 196 pritlnXML(doc); 197 198 // 更改源文件 199 saveXML(doc, "car.xml"); 200 } 201 }
以上代码中,需要导入jar包:xerces-2.6.2.jar,由于之前导入的是xerces-2.3.0.jar包,遇到 java.lang.AbstractMethodError: org.apache.crimson.tree.XmlDocument.getXmlStandalone()Z
报错,换成xerces-2.6.2.jar就可以了!
原先还有导入crimson.jar包,但也是报这个错误,后来查到是sun把crimson.jar给废了,可是又没有错误提示。把crimson.jar删除了,xml就可以正常生成了。
Exception in thread "main" java.lang.AbstractMethodError: org.apache.crimson.tree.XmlDocument.getXmlStandalone()Zat com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:373)at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127)at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94)at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662)at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
在控制台和源文件car.xml输出如下:
转载于:https://www.cnblogs.com/yiscat/archive/2013/04/23/3037445.html
DOM技术对xml增删改查后更新源文件异常报错相关推荐
- 基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传
运行界面(话不多说先上图) 运行之后的index界面,有登陆.注册功能 登陆界面,输入数据库中用户名.密码不为空且密码是加密的数据,进入main界面 注册界面,用的bootstrop的弹窗,用户名和密 ...
- Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)
Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码(前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询 修改密 ...
- php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例
本文实例讲述了PHP实现对xml进行简单的增删改查(CRUD)操作.分享给大家供大家参考,具体如下: 假如有下面xml文件: 55.8 56 40 339 如何使用php对它进行CRUD?其实像这种简 ...
- net对XML增删改查
Pass:看公司代码,配置下拉框的功能,和下拉框的数字转文字.配置xml里面有下拉的value,name,这样界面直接显示数字,然后转译成中文 1.xml文件格式 <?xml version=& ...
- day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作...
在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库)增create database day43 charset utf8;改alter ...
- ORACLE 增删改查与更新
添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 修改字段的语法:alter ...
- python 读取与修改 XML(增删改查)
XML操作 xml 访问与查找 xml 创建与修改 xml 增删改查 -- 综合案例 xml 访问与查找 import xml.etree.ElementTree as ETtree = ET.par ...
- C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙 ...
- java springboot整合zookeeper入门教程(增删改查)
java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...
- Android(安卓)订餐APP(Sqlite数据库,完整的增删改查)
Android(安卓)订餐APP(Sqlite数据库,完整的增删改查) 一.背景 首先说说项目的背景,基于地铁口鸡蛋饼的一个小项目,APP中固定设置的鸡蛋饼搭配,顾客也可以自己搭配 二.开发环境 A ...
最新文章
- 两种常见的点云配准方法ICPNDT
- ajax只能用get吗,基本的Ajax,但无法使用GET或POST方法
- 如何快速高效读懂1本书?|阅读
- 输出某个目录下的所有文件和文件夹,包括子文件夹中的内容
- 微信平台第三方服务器,浅谈微信第三方服务平台的发展前景
- php 保护连接字符串,PHP OOP更新扩展类__construct上的受保护字符串
- 2017.5.7 过河 失败总结
- php curl 模拟Host,php模拟用户请求之CURL
- Maven generate/构建项目太慢解决方法
- neo4j limit
- python 课后作业_python 学习笔记 五 课后作业
- 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现
- web服务器 linux+apache+tomcat+mysql+jsp+php 整合安装
- 3.5 重要的环境变量
- Spring入门看这一篇就够了
- 移动端JS事件、移动端框架
- 算法导论学习笔记13_贪心算法
- php如何去除文件扩展名,php怎样去除文件后缀名
- 网络管理维护(SNMP、RMON)期末考试大纲总结
- 高感性时代--全新思维:决胜未来的6大能力