解析XML的若干方法

15 篇文章 0 订阅

解析XML分为dom和sax两种方式,各有一些不同的java实现

 

一、dom:由W3C定义的接口,将整个XML文档读入内存构建成一个DOM树,再对各个节点进行操作

1)xml解析

@Override
	public void parseXml(String filename){
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try{
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(filename);
			Element root = doc.getDocumentElement();
			
			NodeList rootNodes = root.getChildNodes();
			System.out.println("root's length="+ rootNodes.getLength());
			iterateNodeList(root,rootNodes);
			
		}catch(Exception e){
			System.out.println(e);
		}
	}

	private void iterateNodeList(Node node, NodeList nodeList){
		System.out.println("=========start:"+node.getNodeName()+"============");
		int nodeListLength = nodeList.getLength();
		for(int i=0;i<nodeListLength;i++){
			Node childNode = nodeList.item(i);
			logNodeInfo(childNode,false);
			
			if(childNode.getNodeType()==Node.ELEMENT_NODE){
				NodeList childNodeList = childNode.getChildNodes();
				iterateNodeList(childNode,childNodeList);
			}
		}
		System.out.println("=========end:"+node.getNodeName()+"============");
	}

原始xml文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<house location="USA">
	<room type="owner">
		<area>
			<value>35</value>
			<unit>m2</unit>
		</area>
	</room>
	<room type="child">
		<area>
			<value>25</value>
			<unit>m2</unit>
		</area>
	</room>
	<room type="guest">
		<area>
			<value>25</value>
			<unit>m2</unit>
		</area>
	</room>
</house>

 从程序parse后的结果可以看到,node之间是有空的文本节点(Node.TEXT_NODE)分隔的,结构如下:



 

 2)xml修改

public void modifyXml(String filename) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try{
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(filename);
			Element root = doc.getDocumentElement();
			
			root.setAttribute("price", "380000$");
			
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(doc);
			
			File file = new File("./src/house-modify.xml");
			if(file.exists()) file.delete();
			file.createNewFile();
			
			FileOutputStream out = new FileOutputStream(file);
			StreamResult streamResult = new StreamResult(out);
			transformer.transform(domSource, streamResult);
			
			System.out.println("file's absolute path=" + file.getAbsolutePath());
		}catch(Exception  e){
			System.out.println(e);
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值