XML的DOM解析器

xiaoxiao2026-08-11  27

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,不用惊讶。
转载请注明原文地址: https://www.6miu.com/read-5051017.html

最新回复(0)