Java解析xml文件

    使用dom4j来操作,直接贴代码

  

  1 package qiaokai.util;
  2 
  3 import java.io.File;
  4 import java.util.LinkedList;
  5 import java.util.List;
  6 
  7 import org.dom4j.Document;
  8 import org.dom4j.DocumentException;
  9 import org.dom4j.Element;
 10 import org.dom4j.io.SAXReader;
 11 
 12 public class XMLParser {
 13     public static final String DEFAULT_PATH = "config.xml";
 14     private LinkedList<KV> KVList;
 15     private String filePath;
 16     private String filterNode;
 17     
 18     private XMLParser(Builder b){
 19         this.filePath = b.path;
 20         this.filterNode = b.filterNode;
 21         KVList = new LinkedList<>();
 22         readConfig(filePath);
 23     }
 24     
 25     /** 得到文件的路径 */
 26     public String getFilePath(){
 27         return filePath;
 28     }
 29     /** 得到设置的过滤节点名字 */
 30     public String getFilterNode(){
 31         return filterNode;
 32     }
 33     
 34     /** 得到 key-value 的链表 */
 35     public LinkedList<KV> getKVList(){
 36         return KVList;
 37     }
 38     
 39     /** 读取xml文件,并且把内容保存到List 链表中 */
 40     private void readConfig(String filePath) {
 41         if(QiaoUtils.isStrBlack(filePath)){
 42             QiaoUtils.Log("XML文件的设置路径为空");
 43             return;
 44         }
 45         File f = new File(filePath);
 46         if(!f.exists()){
 47             QiaoUtils.Log(filePath+"\t文件不存在,请检查设置是否正确");
 48             return;
 49         }
 50         try {
 51             Document doc = new SAXReader().read(f);
 52             Element ele = doc.getRootElement();
 53             filterNode(ele, KVList,filterNode);
 54         } catch (DocumentException e) {
 55             e.printStackTrace();
 56         }
 57     }
 58     /**
 59      * 设置过滤,这样可以只得到过滤后的list KV链表
 60      * @param str
 61      */
 62     @SuppressWarnings("unchecked")
 63     private void filterNode(Element ele,final LinkedList<KV> KVlist,String str){
 64         if(ele.getName().equals(str)){
 65             traverNode(ele,KVlist);
 66             return;
 67         }
 68         if(ele.nodeCount() > 1){
 69             List<Element> el = ele.elements();
 70             for(Element e : el){
 71                 filterNode(e, KVlist, str);
 72             }
 73         }
 74     }
 75     /** 递归遍历xml */
 76     @SuppressWarnings("unchecked")
 77     private void traverNode(Element ele,final LinkedList<KV> KVlist){
 78         if(ele.nodeCount()>1){  //其子节点个数大于0
 79             List<Element> el = ele.elements();
 80             for(Element e : el){
 81                 traverNode(e,KVlist);
 82             }
 83         } else {
 84             String key = ele.getName();
 85             String value = ele.getText();
 86             QiaoUtils.Log("K: "+key+"\tV:"+value);
 87             KVlist.addLast(new KV(key,value));
 88         }
 89     }
 90     
 91     /** 使用建造者模式来构造 */
 92     public static class Builder{
 93         String path;
 94         String filterNode;
 95         public Builder setFilePath(String filePath) {
 96             path = filePath;
 97             return this;
 98         }
 99         /** 设置过滤,这样可以在一个config.xml文件里读取很多个Java类需要的配置信息 */
100         public Builder setfilterNode(String node) {
101             filterNode = node;
102             return this;
103         }
104         public XMLParser build() throws Exception{
105             if(QiaoUtils.isStrBlack(path) || QiaoUtils.isStrBlack(filterNode)){
106                 QiaoUtils.Log("检查config.xml的文件路径设置或者需要过滤的Node节点名字");
107                 throw new Exception();
108             }
109             return new XMLParser(this);
110         }
111     }
112     
113     public class KV{
114         private String key;
115         private String value;
116         public KV(String key, String value){
117             this.key = key;
118             this.value = value;
119         }
120         public String getKey() {
121             return key;
122         }
123         public void setKey(String key) {
124             this.key = key;
125         }
126         public String getValue() {
127             return value;
128         }
129         public void setValue(String value) {
130             this.value = value;
131         }
132         
133     }
134 }

    其中xml文件的格式可以类似这样

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <nywebsite>
 3   <!-- 这个是PostMail类中需要配置的信息 -->
 4   <postmail>
 5     <email>9527@qq.com</email>
 6     <password>这里输入密码</password>
 7     <hostname>smtp.qq.com</hostname>
 8   </postmail>
 9   <mrnjvideo>
10     <keywords>
11       <word>毛乌素</word>
12     </keywords>
13   </mrnjvideo>
14 </nywebsite>

    使用XMLPraser类的时候,可以这样

 1 package qiaokai.test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.LinkedList;
 5 
 6 import qiaokai.main.PostEmail;
 7 import qiaokai.util.XMLParser;
 8 import qiaokai.util.XMLParser.KV;
 9 
10 public class TestXMLParser {
11 
12     public static void main(String[] args) throws Exception {
13         XMLParser xp = new XMLParser.Builder()
14                     .setFilePath(XMLParser.DEFAULT_PATH)
15                     .setfilterNode(PostEmail.FILTER_NODE)
16                     .build();
17         LinkedList<KV> KVList = xp.getKVList();
18         ArrayList<String> keys = new ArrayList<>();
19         for(KV kv : KVList){
20             if(kv.getKey().equals("email")){
21                 String address = kv.getValue();
22             } else if (kv.getKey().equals("password")){
23                 String password = kv.getValue();
24             } else if (kv.getKey().equals("hostname")){
25                 String hostname = kv.getValue();
26             } 
27         }
28     }
29 }

 

posted @ 2016-06-23 17:20  Lowp  阅读(630)  评论(0编辑  收藏  举报