java读取内容XML文件

 先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类

      由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问题,怎样去解析xml文件。

      做过Android的朋友应该知道,Android中有几种解析xml文件的方法,最简单的当然是SAX(Simple API for XML),不过,这里需要注意一点,正是由于SAX太简单了,所以,它能做的事也是有很大局限性的,它只能解析而不能进行增删改操作。好了,下面具体的讲解怎样用SAX在JAVA中解析XML文件。

      首先,我先把测试用的XML文件贴出来:

 

[html][/html] view plaincopyprint?

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <EPClientDemo>
  3.     <WebService_IP>172.16.6.17</WebService_IP>
  4.     <WebService_PORT>8080</WebService_PORT>
  5.     <Dest>最高人民检查院 </Dest>
  6.     <RootPath_Receive>E:\rec</RootPath_Receive>
  7.     <Receiver>测试 </Receiver>
  8. </EPClientDemo>

首先,利用面向对象的思想,构造一个以根标签为类名的类,以方便进行相应的操作:

 

 

[java][/java] view plaincopyprint?

  1. package com.brucezhang.xmltest;
  2. //XML标签类,方便操作各个标签
  3. public class EPClientDemo {
  4.     private String WebService_IP;
  5.     private int WebService_PORT;
  6.     private String Dest;
  7.     private String RootPath_Receive;
  8.     private String Receiver;
  9.     public String getWebService_IP() {
  10.         return WebService_IP;
  11.     }
  12.     public void setWebService_IP(String webService_IP) {
  13.         WebService_IP = webService_IP;
  14.     }
  15.     public int getWebService_PORT() {
  16.         return WebService_PORT;
  17.     }
  18.     public void setWebService_PORT(int webService_PORT) {
  19.         WebService_PORT = webService_PORT;
  20.     }
  21.     public String getDest() {
  22.         return Dest;
  23.     }
  24.     public void setDest(String dest) {
  25.         Dest = dest;
  26.     }
  27.     public String getRootPath_Receive() {
  28.         return RootPath_Receive;
  29.     }
  30.     public void setRootPath_Receive(String rootPath_Receive) {
  31.         RootPath_Receive = rootPath_Receive;
  32.     }
  33.     public String getReceiver() {
  34.         return Receiver;
  35.     }
  36.     public void setReceiver(String receiver) {
  37.         Receiver = receiver;
  38.     }
  39. }

      接下来,就是编写工具类了,这个类我命名为:MyHandler_Read,这个类继承自DefaultHandler,哈哈,这里是不是太熟悉了,和Android中是一样的,然后重载我们需要的几个方法。

 

注意:这里我需要讲解一个问题,这个问题确实是使我困惑,大家看这几条语句:

 

[java][/java] view plaincopyprint?

  1. super.startElement(uri, localName, qName, attributes);
  2. super.endElement(uri, localName, qName);

      这个我也很熟悉,不过,就是熟悉的地方报错了。

 

      这个方法是解析各个标签的方法,在Android中标签的名字是 localName ,但是这里要注意了,Java中标签的名字不再是 localName了,而变成了 qName,哎,这个问题害的我调试了好长时间。

      好了,不废话了,下面贴出完整的解析类代码:

 

[java][/java] view plaincopyprint?

  1. package com.brucezhang.xmltest;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.xml.sax.Attributes;
  5. import org.xml.sax.SAXException;
  6. import org.xml.sax.helpers.DefaultHandler;
  7. public class MyHandler_Read extends DefaultHandler{
  8.     public List<EPClientDemo> demos;
  9.     public EPClientDemo demo;
  10.     public StringBuffer buffer=new StringBuffer();
  11.     //开始解析XML文件
  12.     @Override
  13.     public void startDocument() throws SAXException {
  14.         // TODO Auto-generated method stub
  15.         super.startDocument();
  16.         System.out.println(“————————-开始解析文档————————-“);
  17.          demos = new ArrayList<EPClientDemo>();
  18.     }
  19.     //结束解析XML文件,并打印解析结果
  20.     @Override
  21.     public void endDocument() throws SAXException {
  22.         // TODO Auto-generated method stub
  23.         super.endDocument();
  24.          String msg = “————–共” + demos.size() + “个Demo————–\n”;
  25.          for(EPClientDemo demo : demos){
  26.              msg += “WebService_IP: ” + demo.getWebService_IP() + “\n” +
  27.                      “WebService_PORT: ” + demo.getWebService_PORT()
  28.                      + “\n” + “Dest: ” + demo.getDest() +
  29.                      “\n” + “RootPath_Receive: ” + demo.getRootPath_Receive()
  30.                       + “\n” + “Receiver: ” + demo.getReceiver();
  31.          }
  32.          System.out.println(msg);
  33.          System.out.println(“————————-解析文档结束————————-“);
  34.     }
  35.     //对每个标签开始解析
  36.     @Override
  37.     public void startElement(String uri, String localName, String qName,
  38.             Attributes attributes) throws SAXException {
  39.         // TODO Auto-generated method stub
  40.         super.startElement(uri, localName, qName, attributes);
  41.         if (qName.equals(“WebService_IP”)) {
  42.             demo = new EPClientDemo();
  43.         }
  44.     }
  45.     //结束解析标签
  46.     @Override
  47.     public void endElement(String uri, String localName, String qName)
  48.             throws SAXException {
  49.         // TODO Auto-generated method stub
  50.         super.endElement(uri, localName, qName);
  51.         if (qName.equals(“EPClientDemo”)) {
  52.             demos.add(demo);
  53.         }
  54.         else if (qName.equals(“WebService_IP”)) {
  55.             demo.setWebService_IP(buffer.toString().trim());
  56.             buffer.setLength(0);
  57.         }
  58.         else if (qName.equals(“WebService_PORT”)) {
  59.             demo.setWebService_PORT(Integer.parseInt(buffer.toString().trim()));
  60.             buffer.setLength(0);
  61.         }
  62.         else if (qName.equals(“Dest”)) {
  63.             demo.setDest(buffer.toString().trim());
  64.             buffer.setLength(0);
  65.         }
  66.         else if (qName.equals(“RootPath_Receive”)) {
  67.             demo.setRootPath_Receive(buffer.toString().trim());
  68.             buffer.setLength(0);
  69.         }
  70.         else if (qName.equals(“Receiver”)) {
  71.             demo.setReceiver(buffer.toString().trim());
  72.             buffer.setLength(0);
  73.         }
  74.     }
  75.     //对标签中的内容进行操作
  76.     @Override
  77.     public void characters(char[] ch, int start, int length)
  78.             throws SAXException {
  79.         // TODO Auto-generated method stub
  80.         super.characters(ch, start, length);
  81.         buffer.append(ch,start,length);
  82.     }
  83. }

      哈哈,大部分的工作完成了,下面只需要编写主类测试代码就可以了,这里的方法都是固定的模式,所以,这个类我就不多做讲解了,直接贴出代码:

 

 

[java][/java] view plaincopyprint?

  1. package com.brucezhang.xmltest;
  2. import java.io.InputStream;
  3. import javax.xml.parsers.ParserConfigurationException;
  4. import javax.xml.parsers.SAXParser;
  5. import javax.xml.parsers.SAXParserFactory;
  6. import org.xml.sax.SAXException;
  7. public class Main_Test {
  8.     /**
  9.      * @param args
  10.      * Author:DLUTBruceZhang
  11.      */
  12.     public static void main(String[] args){
  13.         // TODO Auto-generated method stub
  14.         //对XML文件进行解析
  15.         read();
  16.     }
  17.      public static void read(){
  18.             try {
  19.                 //固定的方法调用!!!
  20.                 SAXParserFactory factory = SAXParserFactory.newInstance();
  21.                 SAXParser parser = factory.newSAXParser();
  22.                 InputStream in = MyHandler_Read.class.getClassLoader().getResourceAsStream(“my_xml.xml”);
  23.                 //开始解析
  24.                 parser.parse(in, new MyHandler_Read());
  25.             } catch (ParserConfigurationException e) {
  26.                 e.printStackTrace();
  27.             } catch (SAXException e) {
  28.                 e.printStackTrace();
  29.             } catch (Exception e) {
  30.                 e.printStackTrace();
  31.             }
  32.         }
  33. }

下面,我们来运行下编写的程序,看看结果是什么样的:

 

 

[html][/html] view plaincopyprint?

  1. ————————-开始解析文档————————-
  2. ————–共1个Demo————–
  3. WebService_IP: 172.16.6.17
  4. WebService_PORT: 8080
  5. Dest: 最高人民检查院
  6. RootPath_Receive: E:\rec
  7. Receiver: 测试
  8. ————————-解析文档结束————————-

好了,解析XML文件的方法就介绍完了

标签