JAVA XML 解析

2010年4月28日 | 分类: IT技术 | 标签: ,

解析一段xml

<employees total="2">
	<employee>
		<name>hitangjun</name>
		<phones>
			<phone>123456789</phone>
			<phone>012345688</phone>
		</phones>
	</employee>
	<employee>
		<name>hitangjun</name>
        <phones>
          <phone>188456789</phone>
          <phone>392347777</phone>
        </phones>
	</employee>
</employees>

代码如下,注释很详细

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
 
/**
 * Parse Xml service demo.
 * @author tangjun
 * @since 2010-4-28
 */
public class ParseXml {
 
    /**
     * 解析XML文件的内容,并打印每一个节点的信息,你也可以将他设置到一个bean里进行返回。
     * @param xmlContent
     * @author tangjun
     */
    @SuppressWarnings("unchecked")
    private static void parseXML(String xmlContent) {
        //创建一个新字符串 reader。其源为一个字符串的字符流
        StringReader stringReader = new StringReader(xmlContent);
        try {
            //定义工厂,从 XML 文档获取生成 DOM 对象树的解析器
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            //从 XML 文档获取 DOM 文档实例
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            //构建输入流
            InputSource inputSource = new InputSource(stringReader);
            //给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 Document 对象
            Document doc = docBuilder.parse(inputSource);
            //直接访问文档的文档元素的子节点
            doc.getDocumentElement().normalize();
 
            //按文档顺序返回包含在文档中且具有"employee"的所有 Element 的 NodeList
            NodeList listOfResults = doc.getElementsByTagName("employee");
 
            for (int s = 0; s < listOfResults.getLength(); s++) {
                Node resultNode = listOfResults.item(s);
                //如果该节点为 Element
                if (resultNode.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println("\nemployee " + s);
                    Element resultElement = (Element) resultNode;
 
                    // name tag
                    String name = "";
                    NodeList nameList = resultElement
                            .getElementsByTagName("name");
                    if (nameList.getLength() > 0) {
                        Element nameElement = (Element) nameList.item(0);
 
                        //获取包含此节点的所有子节点的 NodeList
                        NodeList textNameList = nameElement.getChildNodes();
                        if (textNameList.getLength() > 0) {
                            name = (textNameList.item(0)).getNodeValue()
                                    .trim();
                            System.out.println("name: " + name);
                        }
                    }
 
                    // phones tag
                    NodeList phonesList = resultElement
                            .getElementsByTagName("phones");
                    if (phonesList.getLength() > 0) {
                        Element phonesElement = (Element) phonesList
                                .item(0);
                        NodeList listOfCategories = phonesElement
                                .getElementsByTagName("phone");
                        for (int i = 0; i < listOfCategories.getLength(); i++) {
                            Element categoryElement = (Element) listOfCategories
                                    .item(i);
                            NodeList textCategoryList = categoryElement
                                    .getChildNodes();
                            String phone = (textCategoryList.item(0))
                                    .getNodeValue().trim();
 
                            //输出,或者设置到bean属性
                            System.out.println("phone: " + phone);
                            //phoneList.add(phone);
                        }
                        //bean.setPhoneList(phoneList);
                    }
                }
            }
            String totalCount = doc.getDocumentElement().getAttribute("total");
            System.out.println("\n总记录数 total: " + totalCount);
        } catch (Exception err) {
            err.printStackTrace();
        } finally {
            stringReader.close();
        }
    }
 
 
    /**
     * 读取并返回文件内容
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static String readFile(String filePath){
        // 建立对象fr
        FileReader fr = null;
        try {
            fr = new FileReader(filePath);
            // 建立可容纳1024个字符的数组
            char data[] = new char[1024];
            //试图将字符读入指定的字符缓冲区。
            int num = fr.read(data);
            // 将字符列表转换成字符串
            String str = new String(data, 0, num);
            // 输出在控制台
           // System.out.println("Characters read= " + num);
            //System.out.println(str);
            return str;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                //关闭输入流
                if(null != fr){
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
 
    public static void main(String[] args) {
        //打印当前定位的目录,以便解析文件找不到的原因
       // System.out.println(System.getProperty("user.dir"));
        //开始解析,test.xml user.dir下
        ParseXml.parseXML(readFile("test.xml"));
    }
}
目前还没有任何评论.