在学习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):简单工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体类实现。

View Code

     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 }
View Code

相关文章: