解析XML内容到User对象

users.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <xml-root>
 4     <conn-params>
 5         <conn-url>jdbc:mysql://192.168.101.7:3306/bbs</conn-url>
 6         <conn-driver>com.mysql.jdbc.Driver</conn-driver>
 7         <conn-username>root</conn-username>
 8         <conn-password>root</conn-password>
 9     </conn-params>
10 
11     <person xmlns:u="http://example.org/user">
12         <u:user>
13             <u:username>xzc</u:username>
14             <u:password>sdf23223</u:password>
15             <u:birthday>2012-01-23</u:birthday>
16         </u:user>
17         <u:user>
18             <u:username>误闯</u:username>
19             <u:password>wuchuang3223</u:password>
20             <u:birthday>2002-01-03</u:birthday>
21         </u:user>
22     </person>
23 </xml-root>

 

 

采用DOM api 解析XML

1. User类

 1 public class User {
 2     
 3     private String username;
 4     private String password;
 5     private String birthday;
 6     
 7     public String toString() {
 8         return "username = " + username + ", password = " + password + ", birthday = " + birthday;
 9     }

    //省略setter,getter
10 }

2. DomUtil解析类

  1 package sax.parsing.user;
  2 
  3 import java.io.FileInputStream;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 
  7 import javax.xml.parsers.DocumentBuilder;
  8 import javax.xml.parsers.DocumentBuilderFactory;
  9 import javax.xml.parsers.ParserConfigurationException;
 10 
 11 import org.w3c.dom.Document;
 12 import org.w3c.dom.Element;
 13 import org.w3c.dom.Node;
 14 import org.w3c.dom.NodeList;
 15 import org.xml.sax.InputSource;
 16 
 17 public class DomUtil {
 18     
 19     
 20     private DocumentBuilderFactory builderFactory;
 21     private DocumentBuilder builder;
 22     private Document document;
 23     
 24     public DomUtil() throws ParserConfigurationException {
 25         builderFactory = DocumentBuilderFactory.newInstance();
 26         builder = builderFactory.newDocumentBuilder();
 27     }
 28     
 29     public DocumentBuilderFactory getBuilderFactory() {
 30         return builderFactory;
 31     }
 32     public DocumentBuilder getBuilder() {
 33         return builder;
 34     }
 35     
 36     public List<User> parseXml(String filepath) throws Exception {
 37         
 38         document = builder.parse(new InputSource(new FileInputStream(filepath)));
 39         
 40         
 41         List<User> list = new ArrayList<User>();
 42         
 43         Element root = document.getDocumentElement(); //从文档根节点获取文档根元素节点root => xml 
 44         NodeList childNodes = root.getChildNodes();
 45         
 46         for (int i=0; i<childNodes.getLength(); i++) {
 47             Node node = childNodes.item(i);
 48             
 49             /*
 50              *     <person>   
 51                         <user>   
 52                             <username>xzc</username>   
 53                             <password>sdf23223</password>   
 54                             <birthday>2012-01-23</birthday>   
 55                         </user>   
 56                         <user>   
 57                             <username>误闯</username>   
 58                             <password>wuchuang3223</password>   
 59                             <birthday>2002-01-03</birthday>   
 60                         </user>   
 61                     </person> 
 62              */
 63             if ("person".equals(node.getNodeName())) {
 64                 
 65                 NodeList pChildNodes = node.getChildNodes();
 66                 
 67                 for (int t=0; t<pChildNodes.getLength(); t++) {
 68                 
 69                     Node nd = pChildNodes.item(t);
 70 
 71                     if (nd.getNodeType() == Node.ELEMENT_NODE && nd.getNodeName().equals("user")) {
 72                         
 73                         User user = new User();
 74                         
 75                         NodeList userChildNodes = nd.getChildNodes();
 76                         
 77                         for (int k=0; k<userChildNodes.getLength(); k++) {
 78                             Node userNode = userChildNodes.item(k);
 79                             String nodeName = userNode.getNodeName();
 80                             String nodeValue = userNode.getTextContent();
 81                             System.out.println("nodeType=" + userNode.getNodeType() + ", nodeName=" + nodeName + ", nodeValue=" + nodeValue);
 82                             
 83                             
 84                             if ("username".equals(nodeName)) 
 85                                 user.setUsername(nodeValue);
 86                             if ("password".equals(nodeName))
 87                                 user.setPassword(nodeValue);
 88                             if ("birthday".equals(nodeName))
 89                                 user.setBirthday(nodeValue);
 90                         }
 91                         list.add(user);
 92                     } // 若当前节点是user
 93                 }            
 94             } // 若当前元素是person的处理逻辑    
 95         }// 完成对根元素的所有子节点的判断
 96         
 97         return list;
 98     }
 99     
100     
101     public static void main(String[] args) {
102         
103         try {
104             DomUtil domUtil = new DomUtil();
105             List<User> users = domUtil.parseXml("src/sax/parsing/user/jdbc-params.xml");
106             
107             for(User user : users) {
108                 System.out.println(user);
109             }
110         } catch (ParserConfigurationException e) {
111             e.printStackTrace();
112         } catch (Exception e) {
113             // TODO Auto-generated catch block
114             e.printStackTrace();
115         }
116     }
117 }

输出结果:

nodeType=3, nodeName=#text, nodeValue= ###此处是Text节点的值(换行+3个制表符)

nodeType=1, nodeName=username, nodeValue=xzc
nodeType=3, nodeName=#text, nodeValue=

nodeType=1, nodeName=password, nodeValue=sdf23223
nodeType=3, nodeName=#text, nodeValue=

nodeType=1, nodeName=birthday, nodeValue=2012-01-23
nodeType=3, nodeName=#text, nodeValue=

nodeType=3, nodeName=#text, nodeValue=

nodeType=1, nodeName=username, nodeValue=误闯
nodeType=3, nodeName=#text, nodeValue=

nodeType=1, nodeName=password, nodeValue=wuchuang3223
nodeType=3, nodeName=#text, nodeValue=

nodeType=1, nodeName=birthday, nodeValue=2002-01-03
nodeType=3, nodeName=#text, nodeValue=

username = xzc, password = sdf23223, birthday = 2012-01-23
username = 误闯, password = wuchuang3223, birthday = 2002-01-03

 

采用SAX解析XML文件内容到User对象

 1 package sax.parsing.user;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import javax.xml.parsers.ParserConfigurationException;
 9 import javax.xml.parsers.SAXParser;
10 import javax.xml.parsers.SAXParserFactory;
11 
12 import org.xml.sax.Attributes;
13 import org.xml.sax.SAXException;
14 import org.xml.sax.helpers.DefaultHandler;
15 
16 public class SaxUtil extends DefaultHandler {
17     
18     
19     private List<User> users = new ArrayList<User>();
20     private User user;
21     private String content;
22     
23     @Override
24     public void characters(char [] ch, int start, int length) throws SAXException {
25         content = new String(ch, start, length);
26     }
27     
28     /** 
29      *  xmlns:prefix=uri
30      *  qName, prefix:localName
31      * @param uri 
32      *         The Namespace URI, or the empty string if the element has no Namespace URI 
33      *      or if Namespaceprocessing is not being performed.
34      *      如果元素没有命名空间URI、命名空间处理未被开启,则为空字符串
35      * @param localName 
36      *         The local name (without prefix), 
37      *         or the empty string if Namespace processing is not being performed.
38      *         不带前缀的本地名,如果命名空间处理未被开启,则为空字符串
39      * @param qName 
40      *         The qualified name (with prefix), 
41      *      or the empty string if qualified names are not available.
42      *      带前缀的全限定名,如果限定名不可得到,则为空串
43      * @param attributes 
44      *         The attributes attached to the element.  
45      *      If there are no attributes, it shall be an empty Attributes object.
46      *      附加在该元素上的属性,如果元素没有属性,则为空的Attributes对象
47      */
48     @Override
49     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
50         
51         if ("user".equals(localName)) {
52             user = new User();
53             System.out.println("### " + localName);
54             System.out.println("<" + qName + ">");
55         }
57     }
58     
59     @Override
60     public void endElement(String uri, String localName, String qName) throws SAXException {
61         
62         if ("username".equals(localName))
63             user.setUsername(content);
64         
65         if ("password".equals(localName))
66             user.setPassword(content);
67         
68         if ("birthday".equals(localName))
69             user.setBirthday(content);
70         
71         if ("user".equals(localName))
72             users.add(user);
73     }
74     
75     
76     
77     public List<User> getUsers() {
78         return users;
79     }
80     
81     
82     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
83         
84         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
85         parserFactory.setNamespaceAware(true); //设置启用命名空间,这样localName才可用
86         SAXParser parser = parserFactory.newSAXParser();
87         
88         SaxUtil saxUtil = new SaxUtil();
89         
90         parser.parse(new File("src/sax/parsing/user/jdbc-params.xml"), saxUtil);
91         List<User> userlist = saxUtil.getUsers();
92         
93         for (User user : userlist)
94             System.out.println(user);
95     }
96 
97 }

输出结果:

### user
<u:user>
### user
<u:user>
username = xzc, password = sdf23223, birthday = 2012-01-23
username = 误闯, password = wuchuang3223, birthday = 2002-01-03

 

该实验例子摘自: http://toreking.iteye.com/blog/1669645

posted @ 2015-01-20 21:03  asnjudy  阅读(369)  评论(0编辑  收藏  举报