JAVA XML 解析
解析一段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")); } } |
发表评论
| Trackback
