解析xml数据

来源:互联网 发布:网络水军公司bjiko 编辑:程序博客网 时间:2024/06/06 02:54

xml数据的解析,需要用到dom4j这个jar包。dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j-1.6.1的完整版大约11.2M,是一个名为dom4j-1.6.1.zip的压缩包,解压后除了需要导入dom4j-1.6.1.jar外,还需导入jaxen-1.1-beta-6.jar(否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常)。下载dom4j-1.6.1

1. 往xml文件写入数据

package CreateXmlFile;import java.io.FileWriter;import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class TestCreateXmlFile {public static void main(String[] args) {Document document = DocumentHelper.createDocument(); //  创建Document对象document.addComment("这是商店的一个xml文件"); //  添加注释Element root = document.addElement("store"); //  创建根节点root.addAttribute("name", "文具店");root.addAttribute("address", "北京朝阳区");Element pen = root.addElement("pen");pen.addComment("钢笔品牌/价格");Element penName = pen.addElement("penName");penName.setText("英雄");Element penPrice = pen.addElement("penPrice");penPrice.setText("1元");Element box = root.addElement("box");box.addComment("铅笔盒名字/价格");Element boxName = box.addElement("boxName");boxName.setText("小二郎");Element boxPrice = box.addElement("boxPrice");boxPrice.setText("2元");Element drink = root.addElement("drink");drink.addComment("墨水品牌/价格");Element drinkName = drink.addElement("drinkName");drinkName.setText("中华");Element drinkPrice = drink.addElement("drinkPrice");drinkPrice.setText("3元");// 写入到xml文件XMLWriter writer = null;OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8");  // 指定XML编码try {writer = new XMLWriter(new FileWriter("E:/MyEclipse/xml/store.xml"), format);writer.write(document);} catch (IOException e) {   e.printStackTrace();} finally {try {writer.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("success");}}


E:/MyEclipse/xml/store.xml :

<?xml version="1.0" encoding="utf-8"?><!--这是商店的一个xml文件--><store name="文具店" address="北京朝阳区">  <pen>    <!--钢笔品牌/价格-->    <penName>英雄</penName>    <penPrice>1元</penPrice>  </pen>  <box>    <!--铅笔盒名字/价格-->    <boxName>小二郎</boxName>    <boxPrice>2元</boxPrice>  </box>  <drink>    <!--墨水品牌/价格-->    <drinkName>中华</drinkName>    <drinkPrice>3元</drinkPrice>  </drink></store>


2. 修改数据

E:/MyEclipse/xml/book1.xml : 

<?xml version="1.0" encoding="utf-8"?><books>   <!--这是book.xml文件, 2017.10.16-->    <book show="ono">     <name>神话</name>      <price>66</price>   </book>    <book show="yes">     <name>红楼梦</name>      <price>88</price>   </book>    <book show="no">     <name>三国志</name>      <price>99</price>   </book>    <user>赵凯鹏</user> </books>

package ModifyXmlFile;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class TestModifyXmlFile {public static void main(String[] args) {SAXReader reader = new SAXReader();Document document = null;try {document = reader.read(new File("E:/MyEclipse/xml/book1.xml"));Element root = document.getRootElement();// 1、给第二个book添加子节点date//List bookList = root.selectNodes("/books/book");//Element secondBook = (Element) bookList.get(1);//Element date = secondBook.addElement("date");//date.setText("2008-08-08");//System.out.println("success1");// 2、删除date节点//List bookList = root.selectNodes("/books/book");//stop: for(int i=0; i<bookList.size(); i++){//Element father = (Element)bookList.get(i);//List childList = father.elements(); //for(int j=0; j<childList.size(); j++){//Element child = (Element) childList.get(j);//if(child.getName().equals("date")){//father.remove(child);//break stop;//}//}//  }//System.out.println("success2");// 3、修改第一个book的name为神话//List bookList = root.selectNodes("/books/book");//Element firstBook = (Element) bookList.get(0);//firstBook.element("name").setText("神话");//System.out.println("success3");// 4、给第一个book添加属性version//List bookList = root.selectNodes("/books/book");//Element firstBook = (Element) bookList.get(0);//firstBook.addAttribute("version", "v2.0");//System.out.println("success11");// 5、删除version//List bookList = root.selectNodes("/books/book");//Element firstBook = (Element) bookList.get(0);//Attribute version = firstBook.attribute("version");//firstBook.remove(version);//System.out.println("success22");// 6、修改第一个book的show为noList bookList = root.selectNodes("/books/book");Element firstBook = (Element) bookList.get(0);firstBook.setAttributeValue("show", "ono");//firstBook.attribute("show").setText("nono");;System.out.println("success33");} catch (DocumentException e) {e.printStackTrace();}// 保存修改到原文件<==>写入文件XMLWriter writer = null;OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8"); // 指定XML编码try {writer = new XMLWriter(new FileWriter("E:/MyEclipse/xml/book1.xml"), format);writer.write(document);} catch (IOException e) {e.printStackTrace();} finally {try {writer.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("end success");}}


3. 从xml文件读出数据

E:/MyEclipse/xml/book.xml :

<?xml version="1.0" encoding="UTF-8"?><!--这是文档注释1--><!--这是文档注释2--><books><!--这是元素注释3--><!--这是元素注释4--><book show="yes"><name>西游记</name><price>66</price></book><book show="yes"><name>红楼梦</name><price>88</price></book><book show="no"><name>三国志</name><price>99</price></book><user>赵凯鹏</user></books>


package ReadXmlFile;import java.io.File;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Comment;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class TestReadXmlFile {public static void main(String[] args) {//读取XML文件,获得document对象SAXReader reader = new SAXReader();      try {    reader.setEncoding("utf-8");Document document = reader.read(new File("E:/MyEclipse/xml/book.xml"));System.out.println(document.node(0).getText()); // 看文档可知, 其是文档的第一个节点System.out.println(document.node(1).getText()); // 看文档可知, 其是文档的第二个节点System.out.println("文档节点数----"+document.nodeCount());Element root = document.getRootElement();System.out.println(root.getName());System.out.println(root.node(1).getText()); // 元素中的注释(看文档可知, 其是根节点的第一个节点)System.out.println(root.node(2).getText());System.out.println("根节点节点数-----"+root.nodeCount());// 用集合遍历//List bookList = root.elements("book");List bookList = root.selectNodes("/books/book"); // 用xpath查找节点books下的book元素if(bookList.size()>0){for(int i=0; i<bookList.size(); i++){Element book = (Element) bookList.get(i);Attribute bookAttribute = book.attribute("show");System.out.println(book.getName()+" "+bookAttribute.getName()+"="+bookAttribute.getText());Element name = book.element("name");System.out.println(name.getName()+":"+name.getText());Element price = book.element("price");System.out.println(price.getName()+":"+price.getText());System.out.println("-----------------------");}}// 迭代遍历//Iterator bookIterator = root.elementIterator("book");//while(bookIterator.hasNext()){//Element book = (Element) bookIterator.next();//System.out.println(book.getName()+" "+book.attribute("show").getName()+"="+book.attributeValue("show"));////Element name = book.element("name");//System.out.println(name.getName()+":"+name.getText());//Element price = book.element("price");//System.out.println(price.getName()+":"+price.getText());//System.out.println("-----------------------");//} Element user = root.element("user");System.out.println(user.getName()+":"+user.getText());} catch (DocumentException e) {e.printStackTrace();}       }}


控制台:

这是文档注释1这是文档注释2文档节点数----3books这是元素注释3根节点节点数-----13book show=yesname:西游记price:66-----------------------book show=yesname:红楼梦price:88-----------------------book show=noname:三国志price:99-----------------------user:赵凯鹏


4. String、xml互转

package XmlToString;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class TestXmlToString {public static void main(String[] args) {// String ==> Xml, 解析XML形式的文本,得到document对象.String text = "<members>赵凯鹏</members>";                   try {Document document = DocumentHelper.parseText(text);Element root = document.getRootElement();System.out.println(root.getName()+":"+root.getText());} catch (DocumentException e) {e.printStackTrace();}                         //XML ==> String               SAXReader reader = new SAXReader();               Document document;try {document = reader.read(new File("E:/MyEclipse/xml/book1.xml"));Element root=document.getRootElement();        System.out.println(document.asXML()); // 整个xml文件的文本内容                System.out.println(root.asXML()); // 根节点文本内容                List list=root.elements("book");        Element firstBook=(Element)list.get(0);        System.out.println(firstBook.asXML()); // 第一个book的name节点} catch (DocumentException e) {e.printStackTrace();}              }}

参考:dom4j完全教程

原创粉丝点击