这两天做了个天气的小应用,需要用到百度的天气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();
原文链接:https://www.f2er.com/xml/297677.html