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(Extensible Markup Language)被广泛应用于数据交换、配置文件管理以及多种跨平台的应用场景中。Java作为一种重要的后端开发...
6. **Java操纵XML实例讲解**: 在实际应用中,Java通过XML API进行数据操作,例如读取配置文件、序列化和反序列化对象、与Web服务交互等。比如,使用`javax.xml.transform.Transformer`和`TransformerFactory`可以...
### Java解析XML——DOM详解 #### 一、DOM解析概念 **Document Object Model (DOM)**是一种平台和语言中立的接口,它允许...通过熟练掌握DOM API,开发人员能够有效地处理和操纵XML数据,满足各种应用程序的需求。
XMLBEANS简化Java对XML编程的应用研究,刘永环,,XMLBeans是把java类和xml 文档实例进行绑定的一种技术。XMLBean提供了很多种方法操纵XML,其中主要包括JavaBeans 、XML Cursor、XQuery。本文首先��
JAVA操纵XML 实例讲解 414 通过JAVA写数据到XML里面 415 内容总结 418 独立实践 418 第二十三章:HTML基础 419 学习目标 419 知识要点 420 HTML元素 420 标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 ...
通过这种方式,开发人员可以轻松地访问、修改和操纵XML文档中的数据。 在Java中,DOM解析主要依赖于JAXP(Java API for XML Processing)提供的`DocumentBuilderFactory`类和`DocumentBuilder`类。`...
### Excel与XML相互转化的Java实现 #### 一、引言与背景 Excel,作为Microsoft Office套件的重要组成部分,广泛应用于各行各业的数据统计和办公电子表格文档处理,深受全球Windows用户的欢迎,成为企业不可或缺的...
DOM(Document Object Model,文档对象模型)是XML的一种处理方式,它将XML文档转换为树形结构,使得开发者可以通过操纵树中的节点来读写XML数据。 #### DOM的概念与特点 DOM通过解析XML文档,将文档转化为一棵树...
Dom4J是Java社区中一个非常流行的处理XML的开源库,它提供了灵活且高效的API,支持XML的读取、写入、修改等多种操作。Dom4J的设计目标是简单易用,同时具备高性能,使得开发人员可以轻松地进行XML文档的解析和操作。...
通过使用XML解析器处理、创建和操纵XML文档,开发者可以构建出功能丰富、性能优越的应用程序。随着技术的不断进步,XML解析器的高级功能也为开发者提供了更多的可能性,使其能够在数据交换和应用开发领域发挥更大的...
它允许Java程序读写和操纵XML数据,使得Java程序能够创建、解析、打印和修改XML文档。这些API通常被集成到Java标准版(J2SE)或Java企业版(J2EE)中,方便开发人员进行XML相关的操作。 2. JAX-RPC 1.1:JAX-RPC...
本篇文章将深入探讨如何使用JXL.jar包来实现Java对Excel的操纵。 首先,JXL库提供了一个直观的API,使Java程序员能够处理Excel文件中的工作簿(Workbook)、工作表(Worksheet)、行(Row)和单元格(Cell)。这个...
JDBC使得Java程序能够执行SQL查询,操纵数据库中的数据,同时也支持数据库连接池和事务管理,提高了性能和可靠性。 结合XML和Java,可以通过以下步骤实现Oracle数据的远程访问: 1. **创建XML数据文件**:根据需求...
XML(eXtensible Markup ...通过学习和熟练掌握JDOM,我们可以更好地理解和操纵XML数据,从而在各种应用场景中发挥XML的优势。在这个例子中,我们只是触及了JDOM的皮毛,更多的功能和技巧等待着开发者去探索和实践。
- DML(数据操纵语言):INSERT、UPDATE、DELETE操作。 - DDL(数据定义语言):用于创建、修改和删除数据库对象,如表、视图、索引等。 - 子查询、联接、集合操作等高级查询技术。 文件 "tinyxml" 是一个开源的C++...
DOM定义了一种逻辑结构,以及一系列用于访问和操纵文档的方法。通过DOM,开发者能够从文档中读取、搜索、修改、增加和删除数据,从而为文档导航提供了标准的功能定义,并且可以灵活地操作XML文档的内容和结构。 ###...
XML注入是一种常见的安全威胁,攻击者通过在XML输入数据中插入恶意代码,以篡改或操纵应用程序的行为。例如,XPATH注入和XXE(XML External Entity)注入。XPath注入允许攻击者通过构造特定的XPath表达式来获取敏感...
3. 自定义转换:如果数据库不直接支持XML转换,我们也可以通过编程语言(如Python、Java、C#等)连接到数据库,执行SQL查询,然后使用这些语言的XML库(如Python的lxml、Java的DOM或SAX解析器)将查询结果转换为XML...
总的来说,XML-DOM4J解析工具类是Java开发中处理XML数据的一种实用手段,它简化了对复杂XML文档的操纵,使得开发者可以更加专注于业务逻辑,而不是底层的解析细节。通过学习和使用这样的工具类,我们可以提高代码的...
标题“Java操纵MS Word”揭示了我们今天要探讨的核心主题:使用Java编程语言与Microsoft Word进行交互。在Java中,我们可以借助不同的库和API来创建、读取、修改以及操作Word文档,使得开发者无需直接使用Word应用...