java操纵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");
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值