在学习XML(eXtensible Markup Language)可扩展标记语言时,我们就了解到XML文件可以用来配置文件,可以进行数据交换,能实现异构语言之间的通信,异构平台之间的交互。而实现这些功能就需要对XML进行读和写操作,下面就列出一些常见的XML解析(读)方法:DOM解析、SAX解析、DOM4J解析、JDOM解析,DOM和SAX解析是Java官方给我们的解析方式,而DOM4J和JDOM解析是其他组织提供的方式,我们需要下载相应的jar包并导进我们的项目中。
一、使用DOM方式解析和写XML文件(基于简单工厂模式的解析方式)
在解析XML之前,首先要了解一下简单工厂模式:
简单工厂模式是类的创建模式,又叫静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一个产品类的实例。通常它根据变量的不同返回不同的类的实例。简单工厂模式实质是由一个工厂类根据传入的参数,动态决定应该生成那个产品类的实例对象
构成:工厂类角色(Creator):担任这个角色的是简单工厂模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现。
抽象产品角色(Product):担任这个角色的类是简单工厂模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个接口或抽象类实现。
具体产品角色(Concrete Product):简单工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体类实现。
DOM解析是将整个XML文件加载到内存当中进行解析,又由于DOM的树型结构占用内存较多,这种解析方式在解析大文件时其性能会很低。
利用递归的方式解析XML文件并将结果输出到控制台上。
1 import org.w3c.dom.*; 2 import org.xml.sax.SAXException; 3 4 import javax.xml.parsers.DocumentBuilder; 5 import javax.xml.parsers.DocumentBuilderFactory; 6 import javax.xml.parsers.ParserConfigurationException; 7 import java.io.File; 8 import java.io.IOException; 9 10 public class Domrxml { 11 private static void parseXML(Element element){ 12 String nodeName = element.getNodeName(); 13 NodeList childNodes = element.getChildNodes(); 14 System.out.println("<"+nodeName); 15 // element元素的所有属性构成的NamedNodeMap对象,需要对其进行判断 16 NamedNodeMap attrs = element.getAttributes(); 17 // 如果该元素存在属性 18 if(null!=attrs && attrs.getLength()>0){ 19 for(int i = 0;i < attrs.getLength();i++){ 20 Attr item = (Attr) attrs.item(i); 21 String name = item.getName(); 22 String value = item.getValue(); 23 System.out.print(" "+name+"=\""+value+"\""); 24 } 25 } 26 System.out.println(">"); 27 if(null!=childNodes && childNodes.getLength()>0){ 28 for (int i = 0; i < childNodes.getLength(); i++) { 29 Node node = childNodes.item(i); 30 // 获得节点类型 31 short nodeType = node.getNodeType(); 32 // 是元素节点,继续递归 33 if(Node.ELEMENT_NODE == nodeType){ 34 parseXML((Element)node); 35 }else if (Node.TEXT_NODE == nodeType){ 36 System.out.println(node.getNodeValue()); 37 }else if(Node.COMMENT_NODE == nodeType){ 38 System.out.print("<--"); 39 Comment comment = (Comment) node; 40 // 获得注释内容 41 String commentData = comment.getData(); 42 System.out.print(commentData); 43 System.out.println("-->"); 44 } 45 } 46 System.out.println("</"+nodeName+">"); 47 } 48 } 49 50 public static void main(String[] args) { 51 // 获得dom解析器工厂(作用是用于创建具体的解析器) 52 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 53 try { 54 // 获得具体的dom解析器 55 DocumentBuilder db = dbf.newDocumentBuilder(); 56 // 利用DocumentBuilder对象的parse方法加载xml文件 57 Document parse = db.parse(new File("C:\\Users\\ztf\\Desktop\\xml\\5264.xml")); 58 // 获得文档的根元素 59 Element root = parse.getDocumentElement(); 60 parseXML(root); 61 } catch (ParserConfigurationException e) { 62 e.printStackTrace(); 63 } catch (SAXException e) { 64 e.printStackTrace(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 } 69 }