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>
正在探索学习中.........