之前写过几篇关于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文件的更多相关文章

  1. 使用DOM解析xml文件

    使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...

  2. 精讲 org.w3c.dom(java dom)解析XML文档

    org.w3c.dom(java dom)解析XML文档 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会 ...

  3. DOM解析XML文件例子

    DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...

  4. Java jdom解析xml文件带冒号的属性

    Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...

  5. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  6. Java Dom解析xml

    Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,下面结合这个xml文件来进行dom解析. <?xml version="1.0&q ...

  7. 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点

    使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...

  8. DOM解析XML文件实例

    XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...

  9. dom 解析xml文件

    JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两 ...

  10. org.w3c.dom(java dom)解析XML文档

    位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析 ...

随机推荐

  1. 【BZOJ1036】【ZJOI2008】数的统计

    接着找树剖的题...传送门(点我) 题意:给你一棵无根树,有三种操作:查询树上2点路径的点权和/最大点权:更改某点的点权. 解题思路:树链剖分裸题,我采用了常数较小的zkw线段树维护剖下来的树(毕竟线 ...

  2. 勤拂拭软件系列教程 之 Android开发之旅

    勤拂拭软件工作室持续推出Android开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢Android的朋友们学习进步: 1. 勤拂拭软件Android开发之旅(1) 之 Android 开发环 ...

  3. Windows提示dll组件丢失

    我们在运行一些软件时,常常会遇到这种问题.下面就来提供解决办法: 登陆网址:www.dll-files.com. 找到页面的搜索部分,并且进行相关搜索: 下图显示了相关的dll下载链接. 下载解压即可 ...

  4. jmeter正则表达式书写

    在测试过程中,经常会有以下几种场景,如A接口的返回值,用于B接口中,而且A登陆的账户,每次登陆,这个sid值还是变化的.那么在实际工作中,如何才能A接口中提取参数到B接口中?接下来我们就可以用正则表达 ...

  5. js匿名函数,闭包

    http://www.cnblogs.com/chenxianbin89/archive/2010/01/28/1658392.html

  6. thymeleaf:局部变量 th:with

    当th:with被处理,firstPer变量创建一个局部变量和变量添加到map自上下文,以便它是用于评估和其他上下文中声明的变量从开始,但只有包含< div >标记的范围内. <di ...

  7. 简介JSP与FreeMarker及Volicity区别

    FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  8. php闭包类外操作私有属性

    Closure::bind() Closure::bindTo(); class person{ private $age; private $sex; public function __const ...

  9. CSS中display:block属性的作用

    display:block可以理解为块,举个简单的例子!比如你做一个超链接,<li><a href="#">超链接</a></li> ...

  10. 01_自动化构建工具之Maven

    目前技术中存在问题(为什么使用Maven): 一个项目就是一个工程: 缺陷:如果项目太过庞大,就不适合使用package来划分层次,最好是一个模块就是一个工程,利于分工协作. 解决:Maven可以将一 ...