这两天做了个天气的小应用,需要用到百度的天气api,获取到的信息是一个xml文档。
所以就从网上查了一下相关的知识,就是关于怎么去解析出来xml文件的信息。
先放一个我自己写的例子,加了点注释,贴这里吧。
- package cn.yzy.test;
- import java.util.List;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.StringReader;
- import java.util.Iterator;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- public class MyTest {
- /**
- * DOM4J读写XML示例
- */
- public static void main(String[] args) {
- // 用变量保存一下xml文件的路径
- String path = "d:\\temp\\student.xml";
- // 创建xml的方法
- createXML(path);
- // 读取xml文件的方法
- readXML(path);
- // 把xml文件读取成String
- String xml = readFile(path);
- // 输出一下xml
- System.out.println(xml);
- // 把String的xml解析出来
- readXMLStr(xml);
- }
- /**
- * readFile 读取文件到String
- *
- * @param path
- * @return
- */
- public static String readFile(String path) {
- String txt = "";
- try {
- // 读取文件
- File file = new File(path);
- // 创建输入流
- InputStreamReader isReader = new InputStreamReader(
- new FileInputStream(file),"utf-8");
- // 缓冲区
- BufferedReader bf = new BufferedReader(isReader);
- // 循环把文本读取出来
- String lineTxt = null;
- while ((lineTxt = bf.readLine()) != null) {
- txt += lineTxt;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 最后把文本字符串返回
- return txt;
- }
- /**
- * createXML 创建XML到指定目录
- *
- * @param path
- */
- public static void createXML(String path) {
- // 读取文件,检查文件是否存在,存在就不创建文件了。
- File file = new File(path);
- if (!file.exists()) {
- try {
- // 创建xml文档,用DocumentHelper
- Document dc = DocumentHelper.createDocument();
- // 在文档里要加入元素节点
- // 添加 根节点 -> 学生信息
- Element root = dc.addElement("学生信息");
- // 在 学生信息节点 中 加入 学生
- Element stu1 = root.addElement("学生");
- // 可以设置属性,设置学生 sid 属性为 001
- stu1.addAttribute("sid","001");
- // 在学生里面加入子元素,键值对应
- Element name1 = stu1.addElement("姓名");
- name1.setText("张三");
- Element sex1 = stu1.addElement("性别");
- sex1.setText("男");
- Element stu2 = root.addElement("学生");
- stu2.addAttribute("sid","002");
- Element name2 = stu2.addElement("姓名");
- name2.setText("小红");
- Element sex2 = stu2.addElement("性别");
- sex2.setText("女");
- // xml文档生成,准备写入文件,文件路径和格式设置好。
- // 输出格式以及编码设置
- OutputFormat format = new OutputFormat("\n",true);
- format.setEncoding("utf-8");
- // 声明一个写文件的类
- XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);
- // 写文件,完成后关闭
- writer.write(dc);
- writer.close();
- System.out.println("操作成功");
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- System.out.println("文件已存在");
- }
- }
- /**
- * readXML 读取XML,从指定文件路径
- *
- * @param path
- */
- public static void readXML(String path) {
- try {
- // 输出文件是否存在
- System.out.println(new File(path).exists());
- // 新建一个读取xml文档的对象
- SAXReader reader = new SAXReader();
- // 将文件读入Document
- Document dc = reader.read(path);
- System.out.println(dc.toString());
- // 读取根节点
- Element root = dc.getRootElement();
- // 遍历根节点下,所有子节点(仅能访问到一层)
- List nodes = root.elements();
- for (Iterator it = nodes.iterator(); it.hasNext();) {
- Element ele = (Element) it.next();
- System.out.println(ele.getName() + ele.attributeValue("sid"));
- System.out.println(ele.elementText("姓名"));
- System.out.println(ele.elementText("性别"));
- }
- } catch (DocumentException e) {
- e.printStackTrace();
- }
- System.out.println("--- --- End --- ---");
- }
- /**
- * readXMLStr 从String中读取XML信息
- *
- * @param xml
- */
- public static void readXMLStr(String xml) {
- try {
- System.out.println("--- --- readXMLStr --- ---");
- // 同样是创建读取xml的类,但是读取方法参数改为:new StringReader(xml) 从字符串读取
- SAXReader reader = new SAXReader();
- Document dc = reader.read(new StringReader(xml));
- System.out.println(dc.toString());
- Element root = dc.getRootElement();
- List nodes = root.elements();
- for (Iterator it = nodes.iterator(); it.hasNext();) {
- Element ele = (Element) it.next();
- System.out.println(ele.getName() + ele.attributeValue("sid"));
- System.out.println(ele.elementText("姓名"));
- System.out.println(ele.elementText("性别"));
- }
- } catch (DocumentException e) {
- e.printStackTrace();
- }
- System.out.println("--- --- End --- ---");
- }
- }
网址:
http://www.blogjava.net/biiau/archive/2008/09/24/231005.html
部分DOM4J的解释 一.Document对象相关 1.读取XML文件,获得document对象. SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); 2.解析XML形式的文本,得到document对象. String text = "<members></members>"; Document document = DocumentHelper.parseText(text); 3.主动创建document对象. Document document = DocumentHelper.createDocument(); Element root = document.addElement("members");// 创建根节点 二.节点相关 1.获取文档的根节点. Element rootElm = document.getRootElement(); 2.取得某节点的单个子节点. Element memberElm=root.element("member");// "member"是节点名 3.取得节点的文字 String text=memberElm.getText(); 也可以用: String text=root.elementText("name"); 这个是取得根节点下的name字节点的文字. 4.取得某节点下名为"member"的所有字节点并进行遍历. List nodes = rootElm.elements("member"); for (Iterator it = nodes.iterator(); it.hasNext();) { Element elm = (Element) it.next(); // do something } 5.对某节点下的所有子节点进行遍历. for(Iterator it=root.elementIterator();it.hasNext();){ Element element = (Element) it.next(); // do something } 6.在某节点下添加子节点. Element ageElm = newMemberElm.addElement("age"); 7.设置节点文字. ageElm.setText("29"); 8.删除某节点. parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点 9.添加一个CDATA节点. Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(diary.getContent()); contentElm.getText(); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法 contentElm.clearContent(); //清除节点中的内容,CDATA亦可 三.属性相关. 1.取得某节点下的某属性 Element root=document.getRootElement(); Attribute attribute=root.attribute("size");// 属性名name 2.取得属性的文字 String text=attribute.getText(); 也可以用: String text2=root.element("name").attributeValue("firstname"); 这个是取得根节点下name字节点的属性firstname的值. 3.遍历某节点的所有属性 Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); } 4.设置某节点的属性和文字. newMemberElm.addAttribute("name","sitinspring"); 5.设置属性的文字 Attribute attribute=root.attribute("name"); attribute.setText("sitinspring"); 6.删除某属性 Attribute attribute=root.attribute("size");// 属性名name root.remove(attribute); 四.将文档写入XML文件. 1.文档中全为英文,不设置编码,直接写入的形式. XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close(); 2.文档中含有中文,设置编码格式写入的形式. OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); writer.write(document); writer.close(); 五.字符串与XML的转换 1.将字符串转化为XML String text = "<members> <member>sitinspring</member> </members>"; Document document = DocumentHelper.parseText(text); 2.将文档或节点的XML转化为字符串. SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); Element root=document.getRootElement(); String docXmlText=document.asXML(); String rootXmlText=root.asXML(); Element memberElm=root.element("member"); String memberXmlText=memberElm.asXML();