zoukankan      html  css  js  c++  java
  • XML文件的解析—DOM、SAX

    一、DOM 解析

    思路:获得Document对象,遍历其中节点获得需要的内容

    要点:

    Document :  DocuemntBuilderFactory --newDocumentBuilder --parse(xml文件输入流)

    根节点: getDocumentElement()

    子节点 :NodeLIst list=root.getChildNodes();  Node n=list.item(index);

    属性: element.getAttribute("id")  或者 node.getAttributes().getNamedItem("XXX").getNodeValue();

    文本:node.getTextContent();  或者 node.getNodeValue();

    部分代码:

     1         //1.  建立一个解析器工厂: 
     2             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     3             //2.  获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器
     4             DocumentBuilder db = dbf.newDocumentBuilder();
     5             //3.  将xml文件加载到内存中,得到表示整个文档的Document对象
     6             InputStream inStream=DomParser.class.getClassLoader().getResourceAsStream("book.xml");
     7             Document doc=db.parse(inStream);
     8             //4.  根据标签名获得对应的Node集合
     9             NodeList bookList=doc.getElementsByTagName("book");
    10             //5.  对集合进行遍历
    11             for(int i=0;i<bookList.getLength();i++){
    12             Book book=new Book();
    13             Element ele=(Element)bookList.item(i);//取出当前节点
    14             String id=ele.getAttribute("id");//根据属性名获得属性值
    15             book.setId(id);
    16             Node nameNode=ele.getElementsByTagName("name").item(0);//获取唯一的name节点
    17             String name=nameNode.getFirstChild().getNodeValue();//获得文本值
    18             book.setName(name);
    19             Node authorNode=ele.getElementsByTagName("author").item(0);//获取唯一的author节点
    20             String author=authorNode.getFirstChild().getNodeValue();//获得文本值
    21             book.setAuthor(author);
    22             resultMap.put(book.getId(), book);      

    二、SAX解析

    思路:获得SAXParser,调用parser 方法

    要点:

    工厂获得实例:SAXParserFactory — newSAXParser

    parser.parse(input, handler); 该方法有两个参数,前一个是文件或者输入流,后一个是事件监听器(助手类)

    新建助手类 继承 DefaultHandler ,重写需要的方法

    部分代码:

     1 SaxParser:
     2             //1.  将xml文件加载到内存中,得到表示整个文档的Document对象
     3             InputStream inStream=DomParser.class.getClassLoader().getResourceAsStream("book.xml");
     4             //2.  创建Sax解析工厂类
     5             SAXParserFactory factory=SAXParserFactory.newInstance();
     6             //3.  得的Sax解析器
     7             SAXParser parser=factory.newSAXParser();
     8             //4.  创建助手类的实例
     9             SaxHandler handler=new SaxHandler();
    10             //5.  解析文件
    11             parser.parse(inStream, handler);
    12             //6.  获得解析结果
    13             List<Book> result=handler.getResultList();
    14             for(Book b:result){
    15                 System.out.println(b);
    16             }

    事件监听器类(助手类):

    在控制台打印信息,同时将信息封装入LIst

     1 public class MyDefaultHandler extends DefaultHandler{
     2     List<Student> list=new ArrayList();
     3     Student s=null;
     4     
     5     private String value;
     6     @Override
     7     public void startDocument() throws SAXException {
     8         super.startDocument();
     9         System.out.print("文档解析开始");
    10         
    11     }
    12 
    13     @Override
    14     public void endDocument() throws SAXException {
    15         super.endDocument();
    16         System.out.println("\n文档解析结束");
    17         System.out.println(list.toString());
    18     }
    19 
    20     @Override
    21     public void startElement(String uri, String localName, String qName,
    22             Attributes attributes) throws SAXException {
    23         
    24         if("student".equals(qName)){
    25             System.out.println("\n学生信息:");
    26             s=new Student();
    27             s.setId(Integer.parseInt(attributes.getValue(0)));
    28         }
    29         if("name".equals(qName)){
    30             System.out.print("姓名:");
    31             
    32         }
    33         if("telephone".equals(qName)){
    34             System.out.print("电话:");
    35             
    36         }
    37         if("addrs".equals(qName)){
    38             System.out.print("地址:");
    39             
    40         }
    41     }
    42 
    43     @Override
    44     public void endElement(String uri, String localName, String qName)
    45             throws SAXException {
    46         System.out.print(" ");
    47         if("student".equals(qName)){
    48             list.add(s);
    50         }
    51         
    52         if("name".equals(qName)){            
    53             s.setName(value);
    54         }
    55         if("telephone".equals(qName)){            
    56             s.setTelephone(value);
    57         }
    58         if("addrs".equals(qName)){            
    59             s.setAddr(value);
    60         }
    61         
    62         
    63         
    64     }
    65 
    66     @Override
    67     public void characters(char[] ch, int start, int length)
    68             throws SAXException {
    69         value=new String(ch, start,length).trim();
    70         System.out.print(value);
    71         
    72         
    73     }
  • 相关阅读:
    【linux高级程序设计】(第八章)进程管理与程序开发 3
    【linux高级程序设计】(第八章)进程管理与程序开发 2
    【linux高级程序设计】(第八章)进程管理与程序开发 1
    【linux高级程序设计】(第七章)终端及串口编程 未完成
    【剑指offer】数值的整数次方
    【剑指offer】二进制中1的个数
    【剑指offer】替换空格
    Android 最新控件 Toolbar
    IE 扩展调用主窗体中的函数
    JAVA程序设计(12.3)---- 监听器0基础应用:五子棋
  • 原文地址:https://www.cnblogs.com/pikaqiucode/p/8253446.html
Copyright © 2011-2022 走看看