您的位置:首页 > 编程语言 > Java开发

Java_xml_Dom解析实现增删改查

2013-09-27 15:23 393 查看
本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/12094775

1.Node准备

Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句

/*
* <book>AAA<name>java语法</name>BBB</book>
* 该book下的直接子节点有3个,AAA和BBB被解析为CharacterData类型的节点,<name>被解析为Element类型的节点,
*
* <book> <name>java语法</name> </book>
* 该book下的直接子节点有3个,由于在<name>之前有个换行,CharacterData类型的节点
* <book><name>java语法</name></book> 该book下的直接子节点只有1个
*/


2.Dom解析优缺点

优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

3.Dom解析xml

/**
* 解析xml文件,遍历并所有信息
*/
public static void parseXMl() {
try {
// 1.通过DocumentBuilder工厂得到对应的xml解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// 2.通过解析器得到Document对象
Document doc = builder.parse("d:/my.xml");

// 3.解析数据
/*
* <book>
* 		<name>javaWeb</name>
* 		<author>fanglx</author>
* 		<price>30.90</price>
* </book>
*/
//得到所有的book的标签的nodelist
NodeList nodeList = doc.getElementsByTagName("book");
//遍历每个book节点
for(int i=0; i<nodeList.getLength(); i++){
Node node = nodeList.item(i);	//当前遍历的book节点
//得到该book节点下的所有的直接子节点
NodeList childNodes = node.getChildNodes();
for(int j=0; j<childNodes.getLength(); j++){
Node childNode = childNodes.item(j);
//如果当前的childNode节点是一个标签,CharacterData类型的文本节点则不执行
if(childNode instanceof Element){
String fieldName = childNode.getNodeName();	//当前节点名称 比如author
String value = childNode.getTextContent();	//当前节点的text值比如fanglx
/*
* 或者下面方式得到value值
* String value = childNode.getFirstChild().getNodeName();//fanglx
*/
System.out.println(fieldName+"="+value);	//author=fanglx
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 对xml文件的更新
*/
public static void updateXMl() {
try {
// 1.通过DocumentBuilder工厂得到对应的xml解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// 2.通过解析器得到Document对象
Document doc = builder.parse("d:/my.xml");

// 3.更新数据
/*
* <book>
* 		<name>javaWeb</name>
* 		<author>fanglx</author>
* 		<price>30.90</price>
* </book>
*/
NodeList nodeList = doc.getElementsByTagName("book");
Element parentEle = (Element) nodeList.item(0);

//直接在子标签的尾部增加<num id="1001">25</num>
Element childEle = doc.createElement("num");
childEle.setAttribute("id", "1001");//设置属性
childEle.setTextContent("25");		//设置值
parentEle.appendChild(childEle);

//直接在price标签前面增加<age id="25">mm</age>
Element newChild = doc.createElement("age");
newChild.setAttribute("id", "25");	//设置属性
newChild.setTextContent("mm");		//设置值
Element refChild = (Element) parentEle.getElementsByTagName("price").item(0);
parentEle.insertBefore(newChild, refChild);

// 4.保存更新的数据
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(new File("c:/my.xml")));
} catch (Exception e) {
e.printStackTrace();
}
}

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
<book>
<name>javaWeb</name>
<author>fanglx</author>
<price>30.90</price>
</book>
</books>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: