Java_xml_Dom解析实现增删改查

66 篇文章 1 订阅
50 篇文章 8 订阅

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>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值