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.解析 ...
随机推荐
- UVALive4727:jump
约瑟夫环变式 设f[i][j]表示处理i个人,按照处理顺序,倒数第j个人是谁 则有f[i][j]=(f[i-1][j]+k)%i #include<cstdio> #include< ...
- 12563 Jin Ge Jin Qu hao
• Don’t sing a song more than once (including Jin Ge Jin Qu). • For each song of length t, either si ...
- [BZOJ]2458: [BeiJing2011]最小三角形
题目大意:给出平面上n个点,求最小的由这些点组成的三角形的周长.(N<=200,000) 思路:点按x坐标排序后分治,每次取出与排在中间的点的横坐标相差不超当前答案一半的点,按y坐标排序后再暴力 ...
- ●BZOJ 3545 [ONTAK2010]Peaks(离线)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.ph ...
- Windows下使用notepad++对文本进行行列转换
行转列: Ctrl + F 选择替换 查找目标:填写指定的内容 替换为:\r\n 查找模式:正则表达式 单击替换或全部替换按钮 列转行: Ctrl + F 选择替换 查找目标:\r\n 替换为:不 ...
- TensorFlow 中文资源全集,官方网站,安装教程,入门教程,实战项目,学习路径。
Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...
- c++ Struct和Class的区别
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!stru ...
- @RequestBody注解用法
做Java已经有8个多月了,但是基本没有学习过Java语言,因此在项目中写代码基本靠的是其他语言的基础来写Java代码,写出来的很多代码虽然能用,但是感觉很不地道,虽然从来没有同事说过,但是我自己觉得 ...
- Web API对application/json内容类型的CORS支持
假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...
- Ubuntu 16.04.4 LTS下安装JDK
写在前面 为什么我又装jdk?今天顺手升级了我的双系统中的ubuntu,开始的时候用的图形化界面升级,后来你懂的,升级软件死锁了.. 用命令行也没有效果了,提示锁被占用,手残重启试试,彻底崩了...我 ...