`
y8820960
  • 浏览: 112988 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java操纵XML

    博客分类:
  • XML
 
阅读更多
import java.io.File; 
import java.io.FileWriter; 
import java.io.Writer; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Stack; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.dom4j.Element; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.SAXReader; 
import org.dom4j.io.XMLWriter; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 


public class HandleXML {

	/** 
	 * 采用DOM方式 
	 * @author Stone 
	 * 
	 */
	public class DOMForXml {
		/** 
		 * 获得doc对象 
		 * @param fileName 
		 * @return 
		 */
		public Document getDocument(String fileName) {
			Document document = null;
			try {
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				DocumentBuilder builder = factory.newDocumentBuilder();
				document = builder.parse(new File(fileName));

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

			return document;
		}

		/** 
		 * 将改动持久到文件 
		 * @param doc 
		 * @param distFileName 
		 */
		public void modifyFile(Document doc, String distFileName) {
			try {
				TransformerFactory tf = TransformerFactory.newInstance();
				Transformer tfer = tf.newTransformer();
				DOMSource dsource = new DOMSource(doc);
				StreamResult sr = new StreamResult(new File("student.xml"));
				tfer.transform(dsource, sr);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		/** 
		 * 解析 
		 * @param fileName 
		 */
		public void paseXml(String fileName) {
			Document document = getDocument(fileName);
			NodeList nodeList = document.getElementsByTagName("student");
			for (int i = 0; i < nodeList.getLength(); i++) {
				StringBuilder sb = new StringBuilder();
				sb.append("姓名:"
						+ document.getElementsByTagName("name").item(i)
								.getFirstChild().getNodeValue());
				sb.append(" , ");
				sb.append("年龄:"
						+ document.getElementsByTagName("age").item(i)
								.getFirstChild().getNodeValue());
				sb.append(" , ");
				sb.append("性别:"
						+ document.getElementsByTagName("sex").item(i)
								.getFirstChild().getNodeValue());
				sb.append(" , ");
				sb.append("地址:"
						+ document.getElementsByTagName("address").item(i)
								.getFirstChild().getNodeValue());

				System.out.println(sb.toString());
			}
		}

		/** 
		 * 创建一个新的学生 
		 * @param name 
		 * @param age 
		 * @param sex 
		 * @param address 
		 */
		public void addNewNode(String name, String age, String sex,
				String address) {
			try {
				Document document = getDocument("student.xml");
				NodeList nodeList = document.getElementsByTagName("students");
				//创建新的节点 
				Node studentNode = document.createElement("student");
				Node nameNode = document.createElement("name");
				nameNode.appendChild(document.createTextNode(name));
				Node ageNode = document.createElement("age");
				ageNode.appendChild(document.createTextNode(age));
				Node sexNode = document.createElement("sex");
				sexNode.appendChild(document.createTextNode(sex));
				Node addressNode = document.createElement("address");
				addressNode.appendChild(document.createTextNode(address));
				// 添加节点 
				studentNode.appendChild(nameNode);
				studentNode.appendChild(ageNode);
				studentNode.appendChild(sexNode);
				studentNode.appendChild(addressNode);
				nodeList.item(0).appendChild(studentNode);
				// 此时真正的处理将新数据添加到文件中(磁盘) 
				TransformerFactory tf = TransformerFactory.newInstance();
				Transformer tfer = tf.newTransformer();
				DOMSource dsource = new DOMSource(document);
				StreamResult sr = new StreamResult(new File("student.xml"));
				tfer.transform(dsource, sr);
			} catch (Exception e) {
				e.printStackTrace();
			}

			paseXml("student.xml");
		}

		/** 
		 * 删除一个节点 
		 * @param name 
		 */
		public void deleteNode(String name) {
			Document document = getDocument("student.xml");

			NodeList nodeList = document.getElementsByTagName("name");
			for (int i = 0; i < nodeList.getLength(); i++) {
				String value = nodeList.item(i).getFirstChild()
						.getTextContent();
				if (name != null && name.equalsIgnoreCase(value)) {
					Node parentNode = nodeList.item(i).getParentNode();
					document.getFirstChild().removeChild(parentNode);
				}
			}
			modifyFile(document, "student.xml");
		}

		/** 
		 * 根据name修改某个节点的内容 
		 * @param name 
		 */
		public void updateNode(String name) {

			Document document = getDocument("student.xml");
			NodeList nodeList = document.getElementsByTagName("name");
			for (int i = 0; i < nodeList.getLength(); i++) {
				String value = nodeList.item(i).getFirstChild()
						.getTextContent();
				if (name != null && name.equalsIgnoreCase(value)) {
					Node parentNode = nodeList.item(i).getParentNode();
					NodeList nl = parentNode.getChildNodes();
					for (int j = 0; j < nl.getLength(); j++) {
						String modifyNode = nl.item(j).getNodeName();
						if (modifyNode.equalsIgnoreCase("age")) {
							nl.item(j).getFirstChild().setTextContent("25");
						}
					}
				}
			}
			modifyFile(document, "student.xml");
		}

	}

	/** 
	 * 采用SAX方式 
	 * @author Stone 
	 * 
	 */
	@SuppressWarnings("unchecked")
	public class SAXForXml extends DefaultHandler {
		private Stack tags = new Stack();
		private Map contents = new LinkedHashMap();
		public int count = 0;

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			String tag = (String) tags.peek();

			if ("name".equals(tag)) {
				String name = new String(ch, start, length);
				contents.put("name" + count, name);
			}
			if ("age".equals(tag)) {
				contents.put("age" + count, new String(ch, start, length));
			}
			if ("sex".equals(tag)) {
				contents.put("sex" + count, new String(ch, start, length));
			}
			if ("address".equals(tag)) {
				contents.put("address" + count, new String(ch, start, length));
			}
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if ("student".equals(qName)) {
				count++;
			}
			tags.push(qName);
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			tags.pop();
		}

		public Map getContents() {
			return contents;
		}
	}

	/** 
	 * 采用JDOM方式 
	 * @author Stone 
	 * 
	 */
	public class JDOMForXml {

	}

	/** 
	 * 采用DOM4J方式 
	 * @author Stone 
	 * 
	 */
	public class DOM4JForXml {
		/** 
		 * 获取doc对象(org.dom4j.Document) 
		 * @param fileName 
		 * @return 
		 */
		public org.dom4j.Document getDocument(String fileName) {
			SAXReader sr = new SAXReader();
			org.dom4j.Document doc = null;
			try {

				doc = sr.read(new File(fileName));

			} catch (Exception e) {

				e.printStackTrace();
			}
			return doc;
		}

		/** 
		 * 将文件保存到硬盘 
		 * @param doc 
		 * @param fileName 
		 */
		public void writeToFile(org.dom4j.Document doc, String fileName) {
			try {
				Writer writer = new FileWriter(fileName);
				OutputFormat format = OutputFormat.createPrettyPrint();
				format.setEncoding("UTF-8");
				XMLWriter xmlWriter = new XMLWriter(writer, format);
				xmlWriter.write(doc);
				xmlWriter.close();
				System.out.println(" 文件已经钝化!");
			} catch (Exception e) {

				e.printStackTrace();
			}
		}

		/** 
		 * 遍历xml文件输出节点值 
		 * 
		 * @param fileName 
		 */
		@SuppressWarnings("unchecked")
		public void readXml(String fileName) {
			org.dom4j.Document doc = getDocument(fileName);
			List nameList = doc.selectNodes("/students/student/name");
			List ageList = doc.selectNodes("/students/student/age");
			List sexList = doc.selectNodes("/students/student/sex");
			List addressList = doc.selectNodes("/students/student/address");
			for (int i = 0; i < nameList.size(); i++) {
				StringBuilder sb = new StringBuilder();
				sb.append("name=" + ((Element) nameList.get(i)).getTextTrim());
				sb.append(",age=" + ((Element) ageList.get(i)).getTextTrim());
				sb.append(",sex=" + ((Element) sexList.get(i)).getTextTrim());
				sb.append(",address="
						+ ((Element) addressList.get(i)).getTextTrim());
				System.out.println(sb.toString());
			}

		}

		/** 
		 * 根据姓名修改一个学生的信息 
		 * @param name 
		 * @param newValue 
		 * @param fileName 
		 */
		@SuppressWarnings("unchecked")
		public void updateXml(String name, Map newValue, String fileName) {
			org.dom4j.Document doc = getDocument(fileName);
			List nameList = doc.selectNodes("/students/student/name");
			Iterator iterator = nameList.iterator();

			while (iterator.hasNext()) {
				Element element = (Element) iterator.next();

				if (name != null && name.equals(element.getText())) {
					Element pe = element.getParent();
					List childList = pe.elements();
					for (int i = 0; i < childList.size(); i++) {
						Iterator valueSet = newValue.entrySet().iterator();
						while (valueSet.hasNext()) {
							Map.Entry entry = (Map.Entry) valueSet.next();
							String nodeName = ((Element) childList.get(i))
									.getName();
							String key = entry.getKey().toString();
							if (key != null && key.equals(nodeName)) {
								((Element) childList.get(i))
										.setText((String) entry.getValue());
							}
						}
					}
				}
			}
			writeToFile(doc, fileName);
		}

	}

}


import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;

public class TestXml
{
    
    @Test
    public void testDomForXml()
    {
        
        HandleXML handleXml = new HandleXML();
        HandleXML.DOMForXml domForXml = handleXml.new DOMForXml();
        //解析 
        //domForXml.paseXml("student.xml"); 
        // 新增 
        //domForXml.addNewNode("Sun", "20", "Man", "USA"); 
        //删除 
        //domForXml.deleteNode("sun"); 
        domForXml.updateNode("Stone");
    }
    
    @Test
    public void testSAXForXml() throws Exception
    {
        HandleXML handleXml = new HandleXML();
        HandleXML.SAXForXml saxForXml = handleXml.new SAXForXml();
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        javax.xml.parsers.SAXParser sp = saxFactory.newSAXParser();
        sp.parse(new File("student.xml"), saxForXml);
        Map contents = saxForXml.getContents();
        Iterator keys = contents.keySet().iterator();
        while (keys.hasNext())
        {
            String key = (String)keys.next();
            System.out.println(key + ":" + contents.get(key));
        }
    }
    
    @Test
    public void testDom4jForXml()
    {
        HandleXML handleXml = new HandleXML();
        HandleXML.DOM4JForXml dom4j = handleXml.new DOM4JForXml();
        //解析xml 
        dom4j.readXml("student.xml");
        
        Map newValue = new HashMap();
        newValue.put("age", "26");
        dom4j.updateXml("Stone", newValue, "student.xml");
    }
    
}

分享到:
评论

相关推荐

    java操纵xml文件的读写,并根据xml生成树型菜单

    java操纵xml文件的读写,并根据xml生成树型菜单

    xml的JAVA解析与格式定义

    解析器的介绍 文档对象模型(DOM)解析实例 SAX解析实例 DOM4J解析实例 JDOM解析实例 JAVA操纵XML 实例讲解

    论文研究-XMLBEANS简化Java对XML编程的应用研究 .pdf

    XMLBEANS简化Java对XML编程的应用研究,刘永环,,XMLBeans是把java类和xml 文档实例进行绑定的一种技术。XMLBean提供了很多种方法操纵XML,其中主要包括JavaBeans 、XML Cursor、XQuery。本文首先��

    Java语言基础下载

    JAVA操纵XML 实例讲解 414 通过JAVA写数据到XML里面 415 内容总结 418 独立实践 418 第二十三章:HTML基础 419 学习目标 419 知识要点 420 HTML元素 420 标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 ...

    Dom4J采用XPath操纵XML教程及例子

    Dom4J采用XPath操纵XML教程及例子,提供入门教程,源代码及有关jar包,并提供对XPath的支持,包含基本的增删改查的操作,由此可举一反三

    Java实现用DOM文档和XML文件互换的操作

    文档对象模型是HTML和XML文档的编程接口...可以说,要自由的操纵XML文件,就要用到DOM规范。DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。

    DOM和SAX概念的总结

    通常我们使用根据以下这些模型创建的API 来分析和操纵XML结构,这些模型可以是基于对象(基于树)的,如文档对象模型(Document Object Model,DOM);也可以是基于事件(基于流、推模型)的,如 Simple API for XML...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    基于J2EE的介绍

    •XML技术(JAXP,SAAJ,JAX-RPC等):一个完整的技术套件操纵XML和构建基于标准的XML Web服务。 •JMX(Java管理扩展):设施管理设备,工具,流程和网络。 •JAAS(Java认证和授权):用于管理安全性的接口。

    Java/JavaEE 学习笔记

    第四章 操纵持久化对象..................190 第五章 事务控制...191 第六章 高级映射...192 第七章 高级查询...196 HTML&java; script学习笔记.....................198 HTML: 超文本标记语言.......................

    Web开发+java+ssh框架

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    整理后java开发全套达内学习笔记(含练习)

    Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æ...

    cocoon-2.1.1源码代及编译环境

    Cocoon最初的型态是一个简单的Java servlet,全部使用标准W3C组件:用文档对象模型(DOM)来解析文档,用XML来捕捉和格式化数据,用XSLT来转换数据和合并/操纵XML文档,并用XSL来管理文档的表示以便通过Web传送。...

    Xml20191128BookStore.zip

    使用JDBC,连接Java与MySQL数据库.通过Java语言去操纵数据库,对其进行增删改查操作.一个综合练习,实现了对书城数据库的增删改查,适合初学者练手.

    [Java.SDK.1.4.2.编译版帮助文档]

    为最新版本Java 2 SDK1.4而设计的测试代码;...数据和文件的管理与操纵;并行程序设计和线程;Swing(Java的GUI);大型图形用户界面的例子Sketcher;用Java语言实现打印功能;XML新技术及其应用。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    AJax详解.chm

    第 5 部分: 操纵 DOM 第 6 部分: 建立基于 DOM 的 Web 应用程序 第 7 部分: 在请求和响应中使用 XML 第 8 部分:在请求和响应中使用 XML 第 9 部分: 使用 Google Ajax Search API 第 10 部分: 使用 JSON 进行数据...

Global site tag (gtag.js) - Google Analytics