java dom操作xml文件_Java与XML:采用DOM操作XML文件

1.DOM介绍

DOM 是用与平台和语言无关的方式表示XML文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构, 然后才能做任何工作。 由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。 它还可以在任何时候在树中上下导航, 而不是像 SAX 那样是一次性的处理。 DOM使用起来也要简单得多。

2.采用DOM解析XML文件

代码实例:importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.IOException;

importjava.io.InputStream;

importjavax.xml.parsers.DocumentBuilder;

importjavax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

importorg.w3c.dom.Document;

importorg.w3c.dom.Element;

importorg.w3c.dom.Node;

importorg.w3c.dom.NodeList;

importorg.xml.sax.SAXException;

/** * @Author:胡家威

* @CreateTime:2011-9-6 下午10:12:00

* @Description:采用DOM解析XML文件

*/

publicclassDomXML {

publicvoiddomXMl(String fileName) {

try{

DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

InputStream input =newFileInputStream(fileName);

Document doc = domBuilder.parse(input);

Element root = doc.getDocumentElement();

NodeList students = root.getChildNodes();

if(students !=null) {

for(inti =0, size = students.getLength(); i 

Node student = students.item(i);

if(student.getNodeType() == Node.ELEMENT_NODE) {

String sexString = student.getAttributes().getNamedItem("性别").getNodeValue();

System.out.println(sexString);

}

for(Node node = student.getFirstChild();

node !=null; node = node.getNextSibling()) {

if(node.getNodeType() == Node.ELEMENT_NODE) {

if(node.getNodeName().equals("姓名")) {

String name = node.getFirstChild().getNodeValue();

System.out.println(name);

}

if(node.getNodeName().equals("年龄")) {

String age = node.getFirstChild().getNodeValue();

System.out.println(age);

}

if(node.getNodeName().equals("电话")) {

String tel = node.getFirstChild().getNodeValue();

System.out.println(tel);

}

}

}

}

}

}

catch(FileNotFoundException e) {

e.printStackTrace();

}

catch(ParserConfigurationException e) {

e.printStackTrace();

}

catch(SAXException e) {

e.printStackTrace();

}

catch(IOException e) {

e.printStackTrace();

}

}

publicstaticvoidmain(String[] args) {

DomXML xmlTest =newDomXML();

String fileName ="students.xml";

xmlTest.domXMl(fileName);

}

}

目录结构:在项目的根目录下面放置一个XML文件<?xmlversion ="1.0"encoding="UTF-8"?>

李华姓名>

14年龄>

6287555电话>

学生>

张三姓名>

16年龄>

8273425电话>

学生>

学生花名册>

运行结果:

李华

14

6287555

张三

16

8273425

3.使用DOM操作XML文件,进行增删查改

代码示例:importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjavax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

importjavax.xml.transform.Transformer;

importjavax.xml.transform.TransformerConfigurationException;

importjavax.xml.transform.TransformerException;

importjavax.xml.transform.TransformerFactory;

importjavax.xml.transform.dom.DOMSource;

importjavax.xml.transform.stream.StreamResult;

importjavax.xml.xpath.XPathConstants;

importjavax.xml.xpath.XPathExpressionException;

importjavax.xml.xpath.XPathFactory;

importorg.w3c.dom.Document;

importorg.w3c.dom.Element;

importorg.w3c.dom.Node;

importorg.w3c.dom.NodeList;

importorg.xml.sax.SAXException;

/**

* @Author:胡家威

* @CreateTime:2011-9-23 下午09:08:03

* @Description:DOM操作XML文件,增删查改

*/

publicclassDealXML {

publicstaticvoidmain(String[] args) {

try{

// Document-->Node

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("products.xml");

Element root = document.getDocumentElement();

// 增加一个元素节点

Element newChild = document.createElement("project");

newChild.setAttribute("id","NP001");// 添加id属性

Element nelement = document.createElement("name");// 元素节点

nelement.setTextContent("New Project");

newChild.appendChild(nelement);

Element selement = document.createElement("start-date");

selement.setTextContent("March 20 1999");

newChild.appendChild(selement);

Element eelement = document.createElement("end-date");

eelement.setTextContent("July 30 2004");

newChild.appendChild(eelement);

root.appendChild(newChild);

// 查找一个元素节点

String expression ="/projects/project[3]";

Element node = (Element) selectSingleNode(expression, root);// 转型一下

// 修改一个元素节点

node.getAttributeNode("id").setNodeValue("new "+node.getAttribute("id"));

// root.getElementsByTagName("project").item(2).setTextContent("");

expression ="/projects/project";

NodeList nodeList = selectNodes(expression, root);

nodeList.item(1).getAttributes().getNamedItem("id").setNodeValue("New Id");

// 删除一个元素节点

expression ="/projects/project[2]";

node = (Element) selectSingleNode(expression, root);

root.removeChild(root.getFirstChild());

output(root,"newProjects.xml");

}catch(SAXException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}catch(ParserConfigurationException e) {

e.printStackTrace();

}

}

publicstaticvoidoutput(Node node, String filename) {

TransformerFactory transFactory = TransformerFactory.newInstance();

try{

Transformer transformer = transFactory.newTransformer();

// 设置各种输出属性

transformer.setOutputProperty("encoding","gb2312");

transformer.setOutputProperty("indent","yes");

DOMSource source =newDOMSource();

// 将待转换输出节点赋值给DOM源模型的持有者(holder)

source.setNode(node);

StreamResult result =newStreamResult();

if(filename ==null) {

// 设置标准输出流为transformer的底层输出目标

result.setOutputStream(System.out);

}else{

result.setOutputStream(newFileOutputStream(filename));

}

// 执行转换从源模型到控制台输出流

transformer.transform(source, result);

}catch(TransformerConfigurationException e) {

e.printStackTrace();

}catch(TransformerException e) {

e.printStackTrace();

}catch(FileNotFoundException e) {

e.printStackTrace();

}

}

// 查找一个单独的节点

privatestaticNode selectSingleNode(String expression, Object source) {

try{

return(Node) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODE);

}catch(XPathExpressionException e) {

e.printStackTrace();

returnnull;

}

}

// 查找所有的节点

privatestaticNodeList selectNodes(String expression, Object source) {

try{

return(NodeList) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODESET);

}catch(XPathExpressionException e) {

e.printStackTrace();

returnnull;

}

}

}

上边是修改前的,下边的是修改了之后生成的XML文件

5953d5d4cd735cbd5f21c51be6ee7b8d.png

b159dcb8e6870a6e4fbbd409575bea03.png

原文链接:http://www.cnblogs.com/yinger/archive/2011/09/24/2188793.html

【编辑推荐】从Java的角度理解Ext的extend

详细解析Java中抽象类和接口的区别

利用JavaMail API 解析MIME

避免悲剧 JavaScript密码生成器

20个将JavaScript推到极致的网站

推荐阅读

简 介作为全球运用最广泛的语言,Java 凭借它的高效性,可移植性(跨平台),代码的健壮性以及可强大的可扩展性,深受广大应用程序开发者的喜爱. 作为一门强大的开发语言,正则表达式在其中的应用当然是必不可少的,而且正则>>>详细阅读

地址:http://www.17bianji.com/kaifa2/Java/1196.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值