`
y8820960
  • 浏览: 115754 次
  • 性别: 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(Extensible Markup Language)被广泛应用于数据交换、配置文件管理以及多种跨平台的应用场景中。Java作为一种重要的后端开发...

    xml的JAVA解析与格式定义

    6. **Java操纵XML实例讲解**: 在实际应用中,Java通过XML API进行数据操作,例如读取配置文件、序列化和反序列化对象、与Web服务交互等。比如,使用`javax.xml.transform.Transformer`和`TransformerFactory`可以...

    java解析xml——dom

    ### Java解析XML——DOM详解 #### 一、DOM解析概念 **Document Object Model (DOM)**是一种平台和语言中立的接口,它允许...通过熟练掌握DOM API,开发人员能够有效地处理和操纵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 ...

    Java解析XML文件

    通过这种方式,开发人员可以轻松地访问、修改和操纵XML文档中的数据。 在Java中,DOM解析主要依赖于JAXP(Java API for XML Processing)提供的`DocumentBuilderFactory`类和`DocumentBuilder`类。`...

    Excel与XML相互转化的Java实现

    ### Excel与XML相互转化的Java实现 #### 一、引言与背景 Excel,作为Microsoft Office套件的重要组成部分,广泛应用于各行各业的数据统计和办公电子表格文档处理,深受全球Windows用户的欢迎,成为企业不可或缺的...

    java与XML深入研究以及用例练习

    DOM(Document Object Model,文档对象模型)是XML的一种处理方式,它将XML文档转换为树形结构,使得开发者可以通过操纵树中的节点来读写XML数据。 #### DOM的概念与特点 DOM通过解析XML文档,将文档转化为一棵树...

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

    Dom4J是Java社区中一个非常流行的处理XML的开源库,它提供了灵活且高效的API,支持XML的读取、写入、修改等多种操作。Dom4J的设计目标是简单易用,同时具备高性能,使得开发人员可以轻松地进行XML文档的解析和操作。...

    XML Programming in Java

    通过使用XML解析器处理、创建和操纵XML文档,开发者可以构建出功能丰富、性能优越的应用程序。随着技术的不断进步,XML解析器的高级功能也为开发者提供了更多的可能性,使其能够在数据交换和应用开发领域发挥更大的...

    Java™ API for XML

    它允许Java程序读写和操纵XML数据,使得Java程序能够创建、解析、打印和修改XML文档。这些API通常被集成到Java标准版(J2SE)或Java企业版(J2EE)中,方便开发人员进行XML相关的操作。 2. JAX-RPC 1.1:JAX-RPC...

    java操纵excel的jar包

    本篇文章将深入探讨如何使用JXL.jar包来实现Java对Excel的操纵。 首先,JXL库提供了一个直观的API,使Java程序员能够处理Excel文件中的工作簿(Workbook)、工作表(Worksheet)、行(Row)和单元格(Cell)。这个...

    XML_Java技术实现Oracle数据远程访问的探讨.pdf

    JDBC使得Java程序能够执行SQL查询,操纵数据库中的数据,同时也支持数据库连接池和事务管理,提高了性能和可靠性。 结合XML和Java,可以通过以下步骤实现Oracle数据的远程访问: 1. **创建XML数据文件**:根据需求...

    用jdom解析xml文件

    XML(eXtensible Markup ...通过学习和熟练掌握JDOM,我们可以更好地理解和操纵XML数据,从而在各种应用场景中发挥XML的优势。在这个例子中,我们只是触及了JDOM的皮毛,更多的功能和技巧等待着开发者去探索和实践。

    simplexml

    - DML(数据操纵语言):INSERT、UPDATE、DELETE操作。 - DDL(数据定义语言):用于创建、修改和删除数据库对象,如表、视图、索引等。 - 子查询、联接、集合操作等高级查询技术。 文件 "tinyxml" 是一个开源的C++...

    JavaScript处理XML文档

    DOM定义了一种逻辑结构,以及一系列用于访问和操纵文档的方法。通过DOM,开发者能够从文档中读取、搜索、修改、增加和删除数据,从而为文档导航提供了标准的功能定义,并且可以灵活地操作XML文档的内容和结构。 ###...

    xml安全基础

    XML注入是一种常见的安全威胁,攻击者通过在XML输入数据中插入恶意代码,以篡改或操纵应用程序的行为。例如,XPATH注入和XXE(XML External Entity)注入。XPath注入允许攻击者通过构造特定的XPath表达式来获取敏感...

    sql 转换成xml语言

    3. 自定义转换:如果数据库不直接支持XML转换,我们也可以通过编程语言(如Python、Java、C#等)连接到数据库,执行SQL查询,然后使用这些语言的XML库(如Python的lxml、Java的DOM或SAX解析器)将查询结果转换为XML...

    xml-dom4j解析工具类

    总的来说,XML-DOM4J解析工具类是Java开发中处理XML数据的一种实用手段,它简化了对复杂XML文档的操纵,使得开发者可以更加专注于业务逻辑,而不是底层的解析细节。通过学习和使用这样的工具类,我们可以提高代码的...

    java manipulate MS Word

    标题“Java操纵MS Word”揭示了我们今天要探讨的核心主题:使用Java编程语言与Microsoft Word进行交互。在Java中,我们可以借助不同的库和API来创建、读取、修改以及操作Word文档,使得开发者无需直接使用Word应用...

Global site tag (gtag.js) - Google Analytics