先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类

      由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问题,怎样去解析xml文件。

      做过Android的朋友应该知道,Android中有几种解析xml文件的方法,最简单的当然是SAX(Simple API for XML),不过,这里需要注意一点,正是由于SAX太简单了,所以,它能做的事也是有很大局限性的,它只能解析而不能进行增删改操作。好了,下面具体的讲解怎样用SAX在JAVA中解析XML文件。

      首先,我先把测试用的XML文件贴出来:

<?xml version="1.0" encoding="UTF-8"?>
<EPClientDemo>
	<WebService_IP>172.16.6.17</WebService_IP>
	<WebService_PORT>8080</WebService_PORT>
	<Dest>最高人民检查院 </Dest>
	<RootPath_Receive>E:\rec</RootPath_Receive>
	<Receiver>测试 </Receiver>
</EPClientDemo>

首先,利用面向对象的思想,构造一个以根标签为类名的类,以方便进行相应的操作:

package com.brucezhang.xmltest;

//XML标签类,方便操作各个标签
public class EPClientDemo {

	private String WebService_IP;
	private int WebService_PORT;
	private String Dest;
	private String RootPath_Receive;
	private String Receiver;

	public String getWebService_IP() {
		return WebService_IP;
	}
	public void setWebService_IP(String webService_IP) {
		WebService_IP = webService_IP;
	}
	public int getWebService_PORT() {
		return WebService_PORT;
	}
	public void setWebService_PORT(int webService_PORT) {
		WebService_PORT = webService_PORT;
	}
	public String getDest() {
		return Dest;
	}
	public void setDest(String dest) {
		Dest = dest;
	}
	public String getRootPath_Receive() {
		return RootPath_Receive;
	}
	public void setRootPath_Receive(String rootPath_Receive) {
		RootPath_Receive = rootPath_Receive;
	}
	public String getReceiver() {
		return Receiver;
	}
	public void setReceiver(String receiver) {
		Receiver = receiver;
	}

}

      接下来,就是编写工具类了,这个类我命名为:MyHandler_Read,这个类继承自DefaultHandler,哈哈,这里是不是太熟悉了,和Android中是一样的,然后重载我们需要的几个方法。

注意:这里我需要讲解一个问题,这个问题确实是使我困惑,大家看这几条语句:

super.startElement(uri, localName, qName, attributes);
super.endElement(uri, localName, qName);

      这个我也很熟悉,不过,就是熟悉的地方报错了。

      这个方法是解析各个标签的方法,在Android中标签的名字是 localName ,但是这里要注意了,Java中标签的名字不再是 localName了,而变成了 qName,哎,这个问题害的我调试了好长时间。

      好了,不废话了,下面贴出完整的解析类代码:

package com.brucezhang.xmltest;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler_Read extends DefaultHandler{

	public List<EPClientDemo> demos;
    public EPClientDemo demo;
    public StringBuffer buffer=new StringBuffer();  

	//开始解析XML文件
    @Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("-------------------------开始解析文档-------------------------");
		 demos = new ArrayList<EPClientDemo>();
	}

    //结束解析XML文件,并打印解析结果
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();

		 String msg = "--------------共" + demos.size() + "个Demo--------------\n";
         for(EPClientDemo demo : demos){
             msg += "WebService_IP: " + demo.getWebService_IP() + "\n" +
            		 "WebService_PORT: " + demo.getWebService_PORT()
            		 + "\n" + "Dest: " + demo.getDest() +
            		 "\n" + "RootPath_Receive: " + demo.getRootPath_Receive()
            		  + "\n" + "Receiver: " + demo.getReceiver();
         }
         System.out.println(msg);

         System.out.println("-------------------------解析文档结束-------------------------");
	}

	//对每个标签开始解析
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);

		if (qName.equals("WebService_IP")) {
            demo = new EPClientDemo();
        }
	}

	//结束解析标签
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);

		if (qName.equals("EPClientDemo")) {
            demos.add(demo);
        }
		else if (qName.equals("WebService_IP")) {
			demo.setWebService_IP(buffer.toString().trim());
			buffer.setLength(0);
		}
        else if (qName.equals("WebService_PORT")) {
            demo.setWebService_PORT(Integer.parseInt(buffer.toString().trim()));
            buffer.setLength(0);
        }
        else if (qName.equals("Dest")) {
            demo.setDest(buffer.toString().trim());
            buffer.setLength(0);
        }
        else if (qName.equals("RootPath_Receive")) {
            demo.setRootPath_Receive(buffer.toString().trim());
            buffer.setLength(0);
        }
		else if (qName.equals("Receiver")) {
			demo.setReceiver(buffer.toString().trim());
			buffer.setLength(0);
		}
	}

	//对标签中的内容进行操作
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);

		buffer.append(ch,start,length);
	}

}

      哈哈,大部分的工作完成了,下面只需要编写主类测试代码就可以了,这里的方法都是固定的模式,所以,这个类我就不多做讲解了,直接贴出代码:

package com.brucezhang.xmltest;

import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class Main_Test {

	/**
	 * @param args
	 * Author:DLUTBruceZhang
	 */
	public static void main(String[] args){
		// TODO Auto-generated method stub

		//对XML文件进行解析
		read();
	}

	 public static void read(){
	        try {
	        	//固定的方法调用!!!
	            SAXParserFactory factory = SAXParserFactory.newInstance();
	            SAXParser parser = factory.newSAXParser();
	            InputStream in = MyHandler_Read.class.getClassLoader().getResourceAsStream("my_xml.xml");
	            //开始解析
	            parser.parse(in, new MyHandler_Read());  

	        } catch (ParserConfigurationException e) {
	            e.printStackTrace();
	        } catch (SAXException e) {
	            e.printStackTrace();
	        } catch (Exception e) {
	        	e.printStackTrace();
			}
	    }
}

下面,我们来运行下编写的程序,看看结果是什么样的:

-------------------------开始解析文档-------------------------
--------------共1个Demo--------------
WebService_IP: 172.16.6.17
WebService_PORT: 8080
Dest: 最高人民检查院
RootPath_Receive: E:\rec
Receiver: 测试
-------------------------解析文档结束-------------------------

好了,解析XML文件的方法就介绍完了,下一篇文章将介绍对XML文件进行增删改的方法。

java操作XML文件--读取内容的更多相关文章

  1. Java操作XML文件 dom4j 篇

    在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...

  2. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  3. Java操作xml文件

    Bbsxml.java public class Bbsxml { private String imgsrc; private String title; private String url; p ...

  4. java实现xml文件读取并保存到对象

    首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...

  5. java操作xml文件--修改节点

          上一篇文章我介绍了SAX方法解析XML文件的过程,这篇文章讲解的内容是利用DOM方法修改XML文件的节点内容.       下面依然是首先贴出XML文件: <?xml version ...

  6. Java操作xml文件的jar包dom4j

    只能解析xml文件,不能解析普通的文件 https://www.cnblogs.com/sharpest/p/7877501.html

  7. Java文件操作①——XML文件的读取

    一.邂逅XML 文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输.所以XML在现今应用程序中是非常流行的.本文主要讲Java解析和生成XML.用于不同平台.不同设备间的数据 ...

  8. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  9. 更新java对xml文件的操作

    //更新java在xml文件中操作的内容 public static void upda(Document doc) throws Exception{ //创建一个TransformerFactor ...

随机推荐

  1. hdu 4609 (FFT求解三角形)

    Problem Description King OMeGa catched three men who had been streaking in the street. Looking as id ...

  2. Java Servlet 笔记4

    Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的. 读取 HTTP 头的 ...

  3. c语言第四次作业

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  4. js黑魔法

    清空一个数组 一直以来,清空一个数组都是var i = [1,2,3]; i = [];,习惯成自然,被自己坑了. 举个例子 var i = [1,2,3]; var obj = {val: i}; ...

  5. jquery easyui datagrid 排序列

    点击排序列,将获取参数有:page=1&rows=10&sort=UserName&order=desc c#后台获取sort跟order参数 string sortColum ...

  6. vue 移动端公众号采坑经验

    自己用vue做微信公众号项目有一段时间了,遇到各种奇葩的问题,下面细数那些坑: 第一坑:微信分享导致安卓手机无法调起相册和无法调起微信充值 解决方案: setTimeout(_ => { wx. ...

  7. LeeCode

    No1. Given an array of integers, return indices of the two numbers such that they add up to a specif ...

  8. nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装

    nginx的yum安装从nginx官网获取源 vim /etc/yum.repose.d/nginx.repo[nginx]name=nginx repobaseurl=http://nginx.or ...

  9. C#利用Attribute实现简易AOP介绍

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  10. Git提交代码到远程服务器

    1.下载Git 不用说了,这个是必须的,也是最简单的步骤,地址如下: http://git-scm.com/download 这里会提供三个版本的下载地址,读者可以自行查找. 2.创建代码库 远程的代 ...