DOM解析XML——完整(2)

在网上search了很多DOM解析XML的代码,总觉得不好,主要原因是都有这样的代码:

document.getElementsByTagName("tagName"); 

我希望能有一个对XML标签名没有限定的处理逻辑,只需要传入XML文件的路径,即可对此XML进行解析。一直找不到,就自己手写了一个。

 

DOM解析有三点是很重要的,可能我的描述并不准确,因为我是在debug过程中分析出来的,并没有去参看DOM的文档。

 

  1. DOM将回车(换行符)和节点内容(Value)都是作为节点来解析的。
  2. 因为第一点,DOM将节点进行了分类,主要是有两类:TEXT_NODE ,ELEMENT_NODE,通过对节点的类型判断,可以很好的解析和过滤所有的节点。
  3. DOM在获取TETX_NODE类型的节点的内容时,如果是回车(换行符),解析后的内容是由一个或多个的"\n","\t"组成的字符串,而内容(Value)节点解析后的则就是其值,不含"\n","\t"。

明白了这三点就可以很容易的对XML进行解析。

此代码适用于各种XML的格式,直排,竖排,乱排。

注意:XML的排版方式不同,解析效果是不一样的,此代码适用任意的排版方式

OK,上代码:

package ryan.xiao.javaSE.OOP;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.IOException;

public class XMLDemo1 {
	public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse(new File("E:" + File.separator+ "java3" + File.separator + "XMLTest" + File.separator
				+ "test.xml"));
		NodeList nodeList = document.getChildNodes(); //只有一个元素,且是根节点
		NodeList rootNodeList = nodeList.item(0).getChildNodes();  //得到根节点下所有的第一级子节点
		fun(rootNodeList);
	}

	/**
	 * 解析方法,传递一个NodeList进去
	 * @param document
	 */
	private static void fun(NodeList nodeList) {
		for (int i = 0; i < nodeList.getLength(); i++) {
			Node nodeTemp = nodeList.item(i);
			if(nodeTemp.hasAttributes()){
				NamedNodeMap nodeAttrList = nodeTemp.getAttributes();  //获得node的属性
				for(int j = 0;j<nodeAttrList.getLength();j++){
					Node nodeAttr = nodeAttrList.item(j);
					System.out.print(nodeTemp.getNodeName()+ "节点有属性:");
					System.out.println(nodeAttr);
					System.out.println("属性值为:" + nodeAttr.getNodeValue());
				}
			}
			short typeTemp = nodeTemp.getNodeType();
			if (typeTemp == 1) { 	// 是"ELEMENT_NODE"
				if (nodeTemp.hasChildNodes()) { 	// 如果此元素节点还有子节点
					fun(nodeTemp.getChildNodes());
				} else {
					// 无子节点,表示此节点中无内容类似于:<item></item>
					System.out.println("此节点无内容" + nodeTemp.getNodeName());
				}
			} else { 	// 是换行或是内容节点
				String str = nodeTemp.getTextContent().replace("\n", "");
				str = str.replace("\t", "");
				if (!(str.equals(""))) { 	// 过滤有内容的节点
					System.out.print(nodeTemp.getParentNode().getNodeName()+ ":");
					System.out.println(nodeTemp.getNodeValue().trim());
				}
			}
		}
	}
}

 

<?xml version="1.0"?>
<info>
	<item>
		<image>assets/icons/bi.jpg</image>
	</item>
	<item>
		<image>assets/icons/ai.jpg</image>
	</item>
	<item>
		<image>assets/icons/ci.jpg</image>
	</item>
	<item>
		<image>assets/icons/fw.jpg</image>
	</item>
	<item>
		<image>assets/icons/ew.jpg</image>
	</item>
	<item>
		<image>assets/icons/air.jpg</image>
	</item>
</info>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值