这两天做了个天气的小应用,需要用到百度的天气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();