解析XML文本

来源:互联网 发布:弘毅公考,知乎 编辑:程序博客网 时间:2024/05/20 10:52

标题:解析XML文本
作者:kagula
日期:2008-01-04

目的:
    以后万一用到要解析xml的需求,从这里抄一下,就是了,哈哈,主要是给自己用的(免的以后再到网上瞎找)。

环境:
  [1]所需xml-apis.jar文件,可以在struts1.2.x中找到


正文:
[1]解析指定xml文件的源码
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

public class CReadXML {

/*
入口参数:源xml文件的绝对路径
返回:一组记录行,每个记录行中含Map类对象,其中的Key为字段名称,value为字段的值!
*/
 public ArrayList readXMLFile(String path) throws Exception {

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     DocumentBuilder db = null;

     ArrayList list = new ArrayList();
     try {
      db = dbf.newDocumentBuilder();
     }

     catch (ParserConfigurationException pce) {
       pce.printStackTrace();
     }

     Document doc = null;

     try {
       doc = db.parse(path);
     }
     catch (DOMException dom) {
         dom.printStackTrace();
     }
     catch (IOException ioe) {
       ioe.printStackTrace();
     }

     Element root = doc.getDocumentElement();
     NodeList fields = root.getElementsByTagName("REC");  //取REC标签中,记录的内容
    

     for (int i = 0; i < fields.getLength(); i++) {
      Element rec = (Element) fields.item(i);
      NodeList datas = rec.getChildNodes();
      HashMap map=new HashMap();
      //取行记录.begin
      for(int j=0;j<datas.getLength();j++)
      {
       Node node=(Node)datas.item(j);
       map.put(node.getNodeName(), node.getTextContent());
      }      
      //取行记录.end
      list.add(map);
     }

     return list;

   }
}

[2]源xml文件,部份
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE TRS [
<!ELEMENT TRS (REC)>
<!ELEMENT REC (G_Rid,G_ID,G_Name,G_Email,G_Home,G_Sort,Hot,Reply,G_Type,hd_Content,G_Data,G_Rdata,G_Rname,IP_address,checked,G_Subject,ExprSubject,G_Content,tw_name,tw_Email,rowid,br)>
<!ELEMENT G_Rid (#PCDATA | br)*>
<!ELEMENT G_ID (#PCDATA | br)*>
<!ELEMENT G_Name (#PCDATA | br)*>
<!ELEMENT G_Email (#PCDATA | br)*>
<!ELEMENT G_Home (#PCDATA | br)*>
<!ELEMENT G_Sort (#PCDATA | br)*>
<!ELEMENT Hot (#PCDATA | br)*>
<!ELEMENT Reply (#PCDATA | br)*>
<!ELEMENT G_Type (#PCDATA | br)*>
<!ELEMENT hd_Content (#PCDATA | br)*>
<!ELEMENT G_Data (#PCDATA | br)*>
<!ELEMENT G_Rdata (#PCDATA | br)*>
<!ELEMENT G_Rname (#PCDATA | br)*>
<!ELEMENT IP_address (#PCDATA | br)*>
<!ELEMENT checked (#PCDATA | br)*>
<!ELEMENT G_Subject (#PCDATA | br)*>
<!ELEMENT ExprSubject (#PCDATA | br)*>
<!ELEMENT G_Content (#PCDATA | br)*>
<!ELEMENT tw_name (#PCDATA | br)*>
<!ELEMENT tw_Email (#PCDATA | br)*>
<!ELEMENT rowid (#PCDATA | br)*>
<!ELEMENT br EMPTY>
]>
<TRS>
<REC>
<G_Rid>6126</G_Rid><br/><br/>
<G_ID>6127</G_ID><br/><br/>
<G_Name>webmaster</G_Name><br/><br/>
<G_Email>nbda@zj001.net</G_Email><br/><br/>
<G_Sort>Reply</G_Sort><br/><br/>
<Hot>1</Hot><br/><br/>
<Reply>0</Reply><br/><br/>
<hd_Content>   详情请电询87297639(市档案局法规处)</hd_Content><br/><br/>
<G_Data>2004.02.27 09:54:00</G_Data><br/><br/>
<G_Rdata>2004.02.27 09:54:00</G_Rdata><br/><br/>
<G_Subject>《档案证》考前培训?</G_Subject><br/><br/>
<G_Content>我想咨询一下,我想报名双修日的档案考试培训,去哪里报名?具体课程安排如何?</G_Content><br/><br/>
<tw_name>小小</tw_name><br/><br/>
</REC>

<REC>
<G_Rid>6128</G_Rid><br/><br/>
<G_ID>6129</G_ID><br/><br/>
<G_Name>webmaster</G_Name><br/><br/>
<G_Sort>Reply</G_Sort><br/><br/>
<Hot>1</Hot><br/><br/>
<Reply>0</Reply><br/><br/>
<hd_Content>   目前没有试卷提供这项服务。</hd_Content><br/><br/>
<G_Data>2004.03.03 15:37:00</G_Data><br/><br/>
<G_Rdata>2004.03.03 15:37:00</G_Rdata><br/><br/>
<G_Subject>《档案证》考试历年的试题?</G_Subject><br/><br/>
<G_Content>    由于《档案证》考前培训放在工作日开展,而本人又不能从工作日中抽出时间去听课,以前又没有接触过这类的考试,想咨询一下哪有买或下载这类练习卷,最好是历年的测试卷,以便熟悉题型,有重点的看书,可顺利通过考试。</G_Content><br/><br/>
<tw_name>小小</tw_name><br/><br/>
</REC>

....略....

</TRS>