Java 读写XML总结

[size=medium][b]1. DOM(Document Object Model) [/b][/size]


此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
实例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student>
<name>TigerLee</name>
<age>26</age>
<sex>man</sex>
<address>北京朝阳区</address>
</student>
<student>
<name>snow</name>
<age>21</age>
<sex>girl</sex>
<address>上海</address>
</student>
</students>



package JavaXml;

import java.io.File;

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.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
* 采用DOM方式 在XML文档中实现增、删、改、查
*
*/
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 fileName
*/
public void paseXml(String strFileName)
{
Document document = getDocument(strFileName);
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 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(distFileName));
tfer.transform(dsource, sr);

paseXml("student.xml");
} catch (Exception e)
{
e.printStackTrace();
}

}

/**
* 创建一个新的学生
*
* @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);

//modifyFile(document, "student.xml");

// 此时真正的处理将新数据添加到文件中(磁盘)
TransformerFactory tf = TransformerFactory.newInstance();
Transformer tfer = tf.newTransformer();
DOMSource dsource = new DOMSource(document);
StreamResult sr = new StreamResult(new File("student_1.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");
}

/**
* @param args
*/
public static void main(String[] args)
{
DOMForXml domForXml = new DOMForXml();

//读取文本内容
//domForXml.paseXml("student.xml");
System.out.println("==============================");

domForXml.addNewNode("test", "22", "child", "shenzhen");

//domForXml.updateNode("snow");

//domForXml.deleteNode("Snow");
}
}


[size=medium][b]2. dom4j[/b][/size]
据悉dom4j在xml解析方面是性能最好的,hibernate等框架都使用它作为解析的工具。

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/

目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip


解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar


写了简单的dom4j的使用的demo,以备回忆,有些是dom4j的文挡里例子改编的
使用dom4j解析下面的xml文件。

读xml内容

package JavaXml;

import java.io.File;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;

public class Dom4JForXmlReader {

public static void main(String[] args)
{
SAXReader reader = new SAXReader();
File file = new File("student.xml");
try {
Document doc = reader.read(file);
doc.accept(new MyVistor());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

static class MyVistor extends VisitorSupport
{
public void visit(Attribute node)
{
System.out.println("Attibute:---" + node.getName() + "="
+ node.getValue());
}

public void visit(Element node)
{
if (node.isTextOnly())
{
//此处读取具体内容
System.out.println("Element:---" + node.getName() + "="
+ node.getText());
}
else
{
System.out.println("--------" + node.getName() + "-------");
}
}

@Override
public void visit(ProcessingInstruction node)
{
System.out.println("PI:" + node.getTarget() + " " + node.getText());
}
}
}


写xml内容

package JavaXml;

import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Dom4JForXmlWriter {

public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
XMLWriter writer = new XMLWriter(new FileWriter("author.xml"));
Document doc = createDoc();
writer.write(doc);
writer.close();

// Pretty print the document to System.out
// 设置了打印的格式,将读出到控制台的格式进行美化
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(System.out, format);
writer.write(doc);

}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static Document createDoc()
{
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("root");
Element author1 = root.addElement("author")
.addAttribute("name", "Kree").addAttribute("location", "UK")
.addText("Kree Strachan");
Element author2 = root.addElement("author")
.addAttribute("name", "King").addAttribute("location", "US")
.addText("King McWrirter");
return doc;
}
}



<?xml version="1.0" encoding="UTF-8"?>
<root>
<author name="Kree" location="UK">Kree Strachan</author>
<author name="King" location="US">King McWrirter</author>
</root>



[b][size=medium]3、使用Jdom读取xml[/size][/b]
读取xml内容:

<?xml version="1.0" encoding="GBK"?>
<学校>
<学生>
<姓名>孟星魂</姓名>
<年龄>18</年龄>
<性别>男</性别>
</学生>
<学生>
<姓名>冷燕</姓名>
<年龄>17</年龄>
<性别>女</性别>
</学生>
</学校>



package JavaXml;

/**
* Java读取xml文件,必须要加载jdom.jar程序。
* 您必须有jdom-1.1插件,如果没有,可以在网上搜索下载。
* 加载的jdom.jar位于jdom-1.1/build/jdom.jar
* 这里我准备了一段xml代码,它在这个文档的最底部。
* 您要使用这个xml代码时,不要忘记去掉注释符号。^_^
*/
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class JdomForXmlReader
{

public static void main(String[] args)
{
FileInputStream fileInputStr = null;
try
{

fileInputStr = new FileInputStream(new File("jdomStudent.xml"));
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(fileInputStr);
Element root = doc.getRootElement(); // 得到根元素
List<?> Allstudents = root.getChildren(); // 得到根元素所有子元素的集合
Element student = null;

StringBuilder sbuilder = null;
for (int i = 0; i < Allstudents.size(); i++)
{
sbuilder = new StringBuilder(200);
student = (Element) Allstudents.get(i);
// 下面代码根据节点名称获得xml文件节点内的信息并输出。
sbuilder.append(student.getChild("姓名").getText()).append(", ");
sbuilder.append(student.getChild("年龄").getText()).append(", ");
sbuilder.append(student.getChild("性别").getText()).append(", ");
System.out.println(sbuilder.toString());
}

}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
fileInputStr.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}



附使用的架包
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值