欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

java_xml_dom解析实现增删节查

更新时间: 2014-01-05 02:01:33 责任编辑: Author_N1

 

Java_xml_Dom解析实现增删改查

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>

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:01:33
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/4660/
本文WWW.DOC100.NET DOC100.NET版权所有。