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,不用惊讶。

你可能感兴趣的:(设计模式,数据结构,xml,Hibernate,框架)