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