XML的DOM解析器

DOM(Document Object Model)是W3C指定的,它不是专门为Java或其他语言而制定的,所以有些地方不大符合Java的风格,如使用NodeList和NameNodeMap而没有使用Java的集合框架类。
DOM把XML在内存中生成一个树结构,了解其结构也就基本了解了DOM。基本结构的主要接口为:
Node <- Document
<- DocumentType
<- Element
<- Entity
<- CharacterData <- Comment
<- Text <- CDATA
所有接口都是扩展Node的,也就是说树中的任何东西都是Node,所以Node是很重要的接口。通过Node的getNodeType()和getNodeValue()分别可以得到节点的类型和节点的值。

节点类型有:
Node.DOCUMENT_NODE
Node.ELEMENT_NODE
Node.TEXT_NODE
Node.CDATA_SECTION_NODE
Node.PROCESSING_INSTRUCTION_NODE
Node.ENTITY_REFERENCE_NODE
Node.DOCUMENT_TYPE_NODE
可以通过以下方式判断
switch(node.getNodeType()){
case Node.Document_NODE:
//...
case Node.ELEMENT_NODE:
//...
}

开始解析:
URI xmlUri=new URI("xml file address");
DOMParser parser = new DOMParser();
parser.parse(xmlUri);
Document doc = parser.getDocument();
不同的解析器的构造方式不同,有的解析器会直接返回Document对象,如下:
Document doc = parser.parse(xmlUri);
Element rootElement = doc.getDocumentElement();
NodeList childrenNodes=rootElement.getChildNodes();
依次类推就可以遍历所有节点,分别处理每个节点即可。值得注意的是文本也是一个节点Text,但是属性则不是一个节点,可以通过Elemenet.getAttributes()获得。其他的也没什么了,参考一下DOM的JavaDoc就OK了。

------值得注意的细节------
1.性能与内存
DOM解析器会把所有的XML文档全部加载到内存中,如果XML文件非常庞大,那么这样的解析器会耗尽内存,导致内存益处异常;当前,很多解析器已经采用了延迟加载设计模式(类似于Hibernate的lazy策略),即只有当具体用刀某个节点数据的时候再去加载该节点,不用的就不加载,这种策略节省了内存的浪费,但是对性能有一定影响。这是有得必有失,需要根据实际情况而定采用什么策略。

2.Node的属性
因为所有节点都是继承Node的,所以任何节点都可以调用getNodeType(),getNodeValue(),getNodeName()之类的方法,但是并不是这些方法对任何节点都有效,比如说对于Element来说,getNodeValue()就无效,因为Element下的文本是Text类表示的,而不是一个String。

3.SAXException
当使用DOM解析器时,如果出现了SAXException,不用惊讶。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值