测试dom4j创建、修改、遍历XML

来源:互联网 发布:java塞班游戏网站 编辑:程序博客网 时间:2024/06/10 13:36

java项目概览:

 

XmlManage.java

package com.jialin;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.dom4j.Attribute;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;/** * 测试DOM4J创建,修改,遍历XML *  * @author jialin *  */public class XmlManager {public static void main(String[] args) {XmlManager xmlManager = new XmlManager();// 初始化xml文档Document doc = null;// 通过dom4j方法创建xml// doc = xmlManager.createXml();// XML字符串// String strXMl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"// + "<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>"// + "<students><!--Students Table-->   <student stu=\"001\">"// + "<name>张三</name><age>18</age></student><student stu=\"002\">"// + "<name>李四</name><age>19</age></student></students>";// 通过字符串创建xml// doc = xmlManager.createDocumentByString(strXMl);// XMl输出路径// String outputPath = "xml/Students.xml";// 输出xml// xmlManager.saveDocument(doc, outputPath);// xml输入路径String inputPath = "xml/Students.xml";// 根据xml路径更改XML//xmlManager.ModifyXml(inputPath);// 根据xml路径获取docdoc = xmlManager.getDocument(inputPath);// 遍历XML xmlManager.traversalDocumentByElementIterator(doc);// xmlManager.traversalDocumentByVisitor(doc);//xmlManager.traversalDocumentByElements(doc);//xmlManager.traversalDocumentByselectNodes(doc, "/Students/student/name");}/** * 获取XML文件 * @param inputPath * @return */public Document getDocument(String inputPath) {// 输入文件File inputXml = new File(inputPath);SAXReader saxReader = new SAXReader();Document document = null;try {document = saxReader.read(inputXml);} catch (DocumentException e) {e.printStackTrace();}return document;}/** * 通过Dom4j方法创建xml文档 *  * @return */public Document createXml() {Document doc = DocumentHelper.createDocument();// 创建ProcessingInstructionMap<String, String> inMap = new HashMap<String, String>();inMap.put("type", "text/xsl");inMap.put("href", "students.xsl");doc.addProcessingInstruction("xml-stylesheet", inMap);// 增加根节点Element studentsElement = doc.addElement("Students");// 增加注释studentsElement.addComment("Students Table");// 增加子节点Element stuElement = studentsElement.addElement("student");// 增加属性stuElement.addAttribute("stu", "001");// 增加名称节点Element nameElement = stuElement.addElement("name");// 设置名称节点的值nameElement.setText("张三");// 增加年龄节点Element ageElement = stuElement.addElement("age");// 设置年龄节点的值ageElement.setText("18");// 同上Element anotherStuElement = studentsElement.addElement("student");anotherStuElement.addAttribute("stu", "002");Element anotherNameElement = anotherStuElement.addElement("name");anotherNameElement.setText("李四");Element anotherAgeElement = anotherStuElement.addElement("age");anotherAgeElement.setText("19");return doc;}/** * 通过字符串创建xml文档 * @param xmlStr * @return */public Document createDocumentByString(String xmlStr) {Document doc = null;try {// 通过字符串转换直接构建xml文档doc = DocumentHelper.parseText(xmlStr);} catch (DocumentException e) {e.printStackTrace();}return doc;}/** * 修改xml *  * @param inputXmlPath */public void ModifyXml(String inputXmlPath) {// 获取文件File inputXml = new File(inputXmlPath);try {SAXReader saxReader = new SAXReader();// 创建documentDocument doc = saxReader.read(inputXml);// 读取Students/student下所有具有属性stu的元素List list = doc.selectNodes("/Students/student/@stu");Iterator iter = list.iterator();while (iter.hasNext()) {Attribute attribute = (Attribute) iter.next();if (attribute.getValue().equals("001"))attribute.setValue("0001");}list = doc.selectNodes("/Students/student");iter = list.iterator();while (iter.hasNext()) {Element element = (Element) iter.next();Iterator iterator = element.elementIterator("name");while (iterator.hasNext()) {Element nameElement = (Element) iterator.next();if (nameElement.getText().equals("张三"))nameElement.setText("王五");}}String outputPath = "xml/Students-Modified.xml";saveDocument(doc, outputPath);}catch (DocumentException e) {System.out.println(e.getMessage());}}/** * 将文档输出到文件保存,可指定格式化输出,可指定字符编码。 *  * @param document * @param outputFile */public void saveDocument(Document doc, String outputPath) {// 输出文件File outputFile = new File(outputPath);try {// 美化格式OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码,不指定的话,默认为UTF-8format.setEncoding("UTF-8");XMLWriter output = new XMLWriter(new FileWriter(outputFile), format);output.write(doc);output.close();} catch (IOException e) {System.out.println(e.getMessage());}}/** * 普通方法遍历xml *  * @param doc */public void traversalDocumentByElementIterator(Document doc) {// 获取根节点Element root = doc.getRootElement();// 枚举根节点下所有子节点for (Iterator ie = root.elementIterator(); ie.hasNext();) {System.out.println("======");Element element = (Element) ie.next();System.out.println(element.getName());// 枚举属性for (Iterator ia = element.attributeIterator(); ia.hasNext();) {Attribute attribute = (Attribute) ia.next();System.out.println(attribute.getName() + ":"+ attribute.getData());}// 枚举当前节点下所有子节点for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {Element elementSon = (Element) ieson.next();System.out.println(elementSon.getName() + ":"+ elementSon.getText());}}}/** * 使用elements方法进行xml的读取,相当于条件查询,可以根据不同的节点,利用for循环查询该节点下所有的数据。 *  * @throws DocumentException */public static void traversalDocumentByElements(Document doc) {// 获取根节点Element root = doc.getRootElement();// 根据根节点,将根节点下 student中的所有数据放到list容器中。List list = root.elements("student");// 这种遍历方式,是jdk1.5以上的版本支持的遍历方式,嘿嘿试试for (Object obj : list) {Element el = (Element) obj;System.out.println("----------"+el.getName()+"-----------");// 获取name节点下所有的内容,存入listName容器中List listName = el.elements("name");// 获取age节点下所有的内容,存入age容器中List listAge = el.elements("age");for (int i=0;i<listName.size();i++) {Element elname = (Element) listName.get(i);// 获取name节点下的数据。System.out.println(elname.getName() + ": " + elname.getText());Element elage = (Element) listAge.get(i);// 获取age节点下的数据。System.out.println(elage.getName() + ": " + elage.getText());}}}/** * 使用selectNodes读取xml文件 *  * @param args * @throws DocumentException */public static void traversalDocumentByselectNodes(Document doc,String elementpath) {// 使用selectNodes获取所要查询xml的节点。List list = doc.selectNodes(elementpath);// 遍历节点,获取节点内数据。for (Iterator ie = list.iterator(); ie.hasNext();) {Element el = (Element) ie.next();System.out.println(el.getName() + ": " + el.getText());}}/** * 基于访问者模式遍历 *  * @param doc */public void traversalDocumentByVisitor(Document doc) {doc.accept(new MyVisitor());}}


MyVisitor.java

package com.jialin;import org.dom4j.Attribute;import org.dom4j.Element;import org.dom4j.ProcessingInstruction;import org.dom4j.VisitorSupport;/** * 定义自己的访问者类 */public class MyVisitor extends VisitorSupport {   /**    * 对于属性节点,打印属性的名字和值    */   public void visit(Attribute node) {       System.out.println("attribute : " + node.getName() + " = "              + node.getValue());   }   /**    * 对于处理指令节点,打印处理指令目标和数据    */   public void visit(ProcessingInstruction node) {       System.out.println("PI : " + node.getTarget() + " "              + node.getText());   }   /**    * 对于元素节点    * 如果包含文本内容,则打印元素的名字和元素的内容。如果不是,则只打印元素的名字    */   public void visit(Element node) {       if (node.isTextOnly())          System.out.println("element : " + node.getName() + " = "                 + node.getText());       else          System.out.println("《《《《《《" + node.getName() + "》》》》》》");   }}


 

 

原创粉丝点击