<?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元素删除。

View Code
  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增删改查后更新源文件异常报错相关推荐

  1. 基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传

    运行界面(话不多说先上图) 运行之后的index界面,有登陆.注册功能 登陆界面,输入数据库中用户名.密码不为空且密码是加密的数据,进入main界面 注册界面,用的bootstrop的弹窗,用户名和密 ...

  2. Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)

    Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码(前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询 修改密 ...

  3. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例

    本文实例讲述了PHP实现对xml进行简单的增删改查(CRUD)操作.分享给大家供大家参考,具体如下: 假如有下面xml文件: 55.8 56 40 339 如何使用php对它进行CRUD?其实像这种简 ...

  4. net对XML增删改查

    Pass:看公司代码,配置下拉框的功能,和下拉框的数字转文字.配置xml里面有下拉的value,name,这样界面直接显示数字,然后转译成中文 1.xml文件格式 <?xml version=& ...

  5. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作...

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库)增create database day43 charset utf8;改alter ...

  6. ORACLE 增删改查与更新

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 修改字段的语法:alter ...

  7. python 读取与修改 XML(增删改查)

    XML操作 xml 访问与查找 xml 创建与修改 xml 增删改查 -- 综合案例 xml 访问与查找 import xml.etree.ElementTree as ETtree = ET.par ...

  8. C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

    说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种  你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙 ...

  9. java springboot整合zookeeper入门教程(增删改查)

    java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...

  10. Android(安卓)订餐APP(Sqlite数据库,完整的增删改查)

     Android(安卓)订餐APP(Sqlite数据库,完整的增删改查) 一.背景 首先说说项目的背景,基于地铁口鸡蛋饼的一个小项目,APP中固定设置的鸡蛋饼搭配,顾客也可以自己搭配 二.开发环境 A ...

最新文章

  1. 两种常见的点云配准方法ICPNDT
  2. ajax只能用get吗,基本的Ajax,但无法使用GET或POST方法
  3. 如何快速高效读懂1本书?|阅读
  4. 输出某个目录下的所有文件和文件夹,包括子文件夹中的内容
  5. 微信平台第三方服务器,浅谈微信第三方服务平台的发展前景
  6. php 保护连接字符串,PHP OOP更新扩展类__construct上的受保护字符串
  7. 2017.5.7 过河 失败总结
  8. php curl 模拟Host,php模拟用户请求之CURL
  9. Maven generate/构建项目太慢解决方法
  10. neo4j limit
  11. python 课后作业_python 学习笔记 五 课后作业
  12. 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现
  13. web服务器 linux+apache+tomcat+mysql+jsp+php 整合安装
  14. 3.5 重要的环境变量
  15. Spring入门看这一篇就够了
  16. 移动端JS事件、移动端框架
  17. 算法导论学习笔记13_贪心算法
  18. php如何去除文件扩展名,php怎样去除文件后缀名
  19. 网络管理维护(SNMP、RMON)期末考试大纲总结
  20. 高感性时代--全新思维:决胜未来的6大能力

热门文章

  1. 最大似然估计与最小二乘
  2. javascript生成n至m的随机整数
  3. javascript的table 对象 属性 方法
  4. MFC中的CFileFind类
  5. BAT经典面试题,深入理解Java内存模型JMM
  6. Flutter mixin用法详解
  7. 设计模式(行为型模式)——模板方法模式(Template Method)
  8. 博客6:磁盘以及创建文件系统的相关知识点
  9. ADO中最重要的对象有三个:Connection、Recordset和Command
  10. import 导入模块学习