Java--Dom解析XML文件
之前写过几篇关于Java中解析XML文件的方法,不过,感觉不够简单,今天重写了一遍代码,用到的是方法是Dom,其中加入了日志记录功能--Log4j。
好了,不多说了,先把XMl文件贴出来
<?xml version="1.0" encoding="GB2312"?> <EPClientDemo> <WebService_IP>201.55.46.79</WebService_IP> <WebService_PORT>3389</WebService_PORT> <Dest>DLUT</Dest> <RootPath_Receive>F:\rec</RootPath_Receive> <Receiver>研发</Receiver> </EPClientDemo>
可以看到,这个XML文件不像标准的那样在根下面再包含一层,而是直接Document过后是Element,所以,解析变得更为简单,好吧,贴出代码看看我是怎么做的
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.SAXException; public class ParseXMLTest { private static Logger logger = Logger.getLogger(ParseXMLTest.class.getName()); public void getDemos(InputStream inputStream) throws Exception{ Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("Config.xml"); Element element = document.getDocumentElement(); for(int i = 0; i < element.getElementsByTagName("WebService_IP").getLength(); i++){ System.out.println("<---------共有" + element.getElementsByTagName("WebService_IP").getLength() + "个EPClientDemo--------->"); System.out.println("第" + (i + 1) + "个EPClientDemo:"); System.out.println(" WebService_IP: " + element.getElementsByTagName("WebService_IP").item(0).getTextContent()); System.out.println(" WebService_PORT: " + element.getElementsByTagName("WebService_PORT").item(0).getTextContent()); System.out.println(" Dest: " + element.getElementsByTagName("Dest").item(0).getTextContent()); System.out.println(" RootPath_Receive: " + element.getElementsByTagName("RootPath_Receive").item(0).getTextContent()); System.out.println(" Receiver: " + element.getElementsByTagName("Receiver").item(0).getTextContent()); } } public void update(String index, int count, String value, boolean outOrno) { Document document = null; try { document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("Config.xml"); Element root = document.getDocumentElement(); root.getElementsByTagName(index).item(count).setTextContent(value); output(root, "Config.xml"); if (outOrno) { output(root, null); } } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("SAXException error"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("IOException error"); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("ParserConfigurationException error"); } } //写回XML文件,保存修改或打印到控制台 public static void output(Node node, String filename) { TransformerFactory transFactory = TransformerFactory.newInstance(); try { Transformer transformer = transFactory.newTransformer(); // 设置各种输出属性 transformer.setOutputProperty("encoding", "gb2312"); transformer.setOutputProperty("indent", "yes"); DOMSource source = new DOMSource(); // 将待转换输出节点赋值给DOM源模型的持有者(holder) source.setNode(node); StreamResult result = new StreamResult(); if (filename == null) { // 设置标准输出流为transformer的底层输出目标 result.setOutputStream(System.out); } else { result.setOutputStream(new FileOutputStream(filename)); } // 执行转换从源模型到控制台输出流 transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); logger.error("TransformerConfigurationException error"); } catch (TransformerException e) { e.printStackTrace(); logger.error("TransformerException error"); } catch (FileNotFoundException e) { e.printStackTrace(); logger.error("FileNotFoundException error"); } } }
可以看出,我首先计算有几个Element,然后循环输出每一个的内容,这点很简单,现在需要注意的是这个方法
public void update(String index, int count, String value, boolean outOrno)
这个方法用于更新XML节点内容,它包含四个参数,其中第四个参数是布尔类型的,为什么需要它呢?因为,Element的个数不止一个,我不会每次更新一个Element都会输出看看是否更新成功,所以,加入一个判断条件,如果是 true 就输出更新过的内容以检查是否更新成功,如果是 false ,那么代表的是我在更新其中的一个Element,不用输出。
测试主程序如下:
import java.io.InputStream; import org.apache.log4j.Logger; public class Main_Test { private static Logger logger = Logger.getLogger(Main_Test.class.getName()); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub read(); update(); } public static void read() { InputStream input = Main_Test.class.getClassLoader().getResourceAsStream("Config.xml"); ParseXMLTest pXmlTest = new ParseXMLTest(); try { pXmlTest.getDemos(input); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); logger.error("Exception error"); } } public static void update(){ ParseXMLTest pXmlTest = new ParseXMLTest(); System.out.println("\n\n尝试修改节点内容中。。。"); pXmlTest.update("WebService_IP", 0, "201.55.46.79", false); pXmlTest.update("WebService_PORT", 0, "3389", false); pXmlTest.update("Dest", 0, "DLUT", false); pXmlTest.update("RootPath_Receive", 0, "F:\\rec", false); pXmlTest.update("Receiver", 0, "研发", true); System.out.println("修改节点内容成功。。。"); } }
当然,这和之前的代码相比没有什么太大的变化,只是变得简单了,只用到了Dom方法,而不使用SAX进行解析。
Java--Dom解析XML文件的更多相关文章
- 使用DOM解析xml文件
使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...
- 精讲 org.w3c.dom(java dom)解析XML文档
org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...
- DOM解析XML文件例子
DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...
- Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- Java Dom解析xml
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,下面结合这个xml文件来进行dom解析. <?xml version="1.0&q ...
- 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点
使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...
- DOM解析XML文件实例
XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...
- dom 解析xml文件
JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两 ...
- org.w3c.dom(java dom)解析XML文档
位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析 ...
随机推荐
- 【USACO12JAN】视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- bzoj3224Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 17706 Solved: 7764[Submit][St ...
- 基于GCC的openMP学习与测试
(一).openMP简述 Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基 ...
- 春招实习面经分享(已拿到腾讯春招Offer)
十分幸运地收到了腾讯的Offer..回来报答一下各位牛客网的战友们,说起来也是有点运气成分,最后通过腾讯的内推收到了offer!之前也屡遭重创,阿里的内推一面挂了(寒假过早地投简历,电话面试应对地不太 ...
- Python开发——排队问题随机模拟分析
案例:主要是基于"蒙特卡罗思想",求解排队等待时间问题 场景:厕所排队问题 1.两场电影结束时间相隔较长,互不影响: 2.每场电影结束之后会有20个人想上厕所: 3.这20个人会在 ...
- TCP/UDP的区别
TCP与UDP区别 TCP提供的是面向连接的.可靠的数据流传输: UDP提供的是非面向连接的.不可靠的数据流传输. TCP提供可靠的服务,通过TCP连接传送的数据,无差错.不丢失,不重复,按序到达:U ...
- 论文笔记--PCN:Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks
关键词:rotation-invariant face detection, rotation-in-plane, coarse-to-fine 核心概括:该篇文章为中科院计算所智能信息处理重点实验室 ...
- MySQL UPDATE 查询
MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...
- Docker镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去. 通常 Union FS 有两个用途, 一方面可以实 ...
- Latex:入门教程
http://blog.csdn.net/pipisorry/article/details/54571521 总的来说,LaTex是一套排版系统,与word那种所见即所得对排版方式不太,用LaTex ...