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文件
原文链接: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