会编程的皮卡丘  

一、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     }

 

posted on 2018-01-09 20:09  会编程的皮卡丘  阅读(190)  评论(0编辑  收藏  举报