利用DOM和SAX解析XML文档

DOM: 

(文档对象模型)  --将xml文件的节点解析成java语言中的对象

优点:可以对整个文档进行增删改查,

缺点:占用内存相对多【可以根据需要调整JVM的内存大小:例如在eclipse中可以在VM参数:加入  -Xmx64m  即限制为64m】

        【java示例代码】:

xml 文件目录:src/test.xml

内容为:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soft>
<a>
<a1 id="1">Hello</a1>
<a2 id="2">World</a2>
</a>
<b>
<b1 id="3">Hello</b1>
<b2 id="4">You</b2>
</b>
</soft>

import java.io.FileOutputStream;
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class xmlParse {
/**
* 解析xml文档

* @param args
* @throws Exception
*/
public static void parseXml() throws Exception {
// 创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得xml解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档,得到代表文档的Document
org.w3c.dom.Document doc = builder.parse("src/test.xml");

//得到标签名为a2的节点集合
NodeList nodes = doc.getElementsByTagName("a2");

//取得标签为a2的集合的第一个节点
Node node1 = nodes.item(0);

//取得节点的内容
String textContent = node1.getTextContent();
System.out.println(textContent);
}


// 递归解析文档所有节点
public static void getListNode() throws Exception, Exception {
// 创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得xml解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档,得到代表文档的Document
org.w3c.dom.Document doc = builder.parse("src/test.xml");

//获得根节点
Node rootNode = doc.getElementsByTagName("soft").item(0);
getListItem(rootNode);

//内存中更新的xml文件 输出到文件中
TransformerFactory factory2 =TransformerFactory.newInstance();
Transformer trans = factory2.newTransformer();
trans.transform(new DOMSource(doc), 
new StreamResult(new FileOutputStream("src/test.xml")));

}


private static void getListItem(Node rootNode) {

System.out.println(rootNode.getNodeName());--------------------------------------------------->>>>结果1
if (rootNode instanceof Element) {
System.out.println(rootNode.getNodeName());--------------------------------------------------->>>>结果2
if (rootNode.hasAttributes()) {
System.out.println("属性id:"+
//由于  Element  继承自 Node 可以将Node类型对象强转成 Element类型
//得到其更多的方法
((Element)rootNode).getAttribute("id"));--------------------------------------------------->>>>结果3
}
else {
//向xml文件中添加属性name
((Element)rootNode).setAttribute("name", "good");
}
}

NodeList childList = rootNode.getChildNodes();
for (int i = 0; i < childList.getLength(); i++) {
Node node =childList.item(i);
getListItem(node);
}

}
}


main方法代码:



public class Test {


/**调整JVM内存大小   在VM参数中加入  -Xmx64m  即限制为60m
* @param args
* @throws Exception 
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
///
//byte[] b= new byte[104*1024*65];//测试JVM =内存大小   默认限制为64m
//byte b2[] =new byte[1024*1024*1024];
System.out.println("this is a test");
xmlParse.parseXml();
xmlParse.getListNode();
}

}

分别单独输出结果1,2,3得到程序结果:

结果1

soft
#text
a
#text
a1
#text
#text
a2
#text
#text
#text
b
#text
b1
#text
#text
b2
#text
#text
#text

结果2

soft
a
a1
a2
b
b1
b2

结果3

属性id:
属性id:
属性id:1
属性id:2
属性id:
属性id:3
属性id:4

xml文件更新后内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<soft name="good">
<a name="good">
<a1 id="1">Hello</a1>
<a2 id="2">World</a2>
</a>
<b name="good">
<b1 id="3">Hello</b1>
<b2 id="4">You</b2>
</b>
</soft>


正在探索学习中.........


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值