package com.hengtian.util; 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; public class XmlManager { public static void main(String[] args) { XmlManager xmlManager = new XmlManager(); // 初始化xml文档 Document doc = null; // 通过dom4j方法创建xml String[] arr = new String[]{"1","2","3","4","5","6","7","8","9"}; doc = xmlManager.createXml(arr); // 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路径获取doc //doc = 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); if(!inputXml.exists()){//判断文件是否存在 try { inputXml.createNewFile(); //创建文件 } catch (IOException e) { e.printStackTrace(); } } 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(String[] arr) { Document doc = DocumentHelper.createDocument(); // 创建ProcessingInstruction Map<String, String> inMap = new HashMap<String, String>(); // inMap.put("type", "text/xsl"); // inMap.put("href", "students.xsl"); //doc.addProcessingInstruction("xml-stylesheet", inMap); // 增加根节点 Element rssSourcesElement = doc.addElement("RSSsources"); // 增加注释 // studentsElement.addComment("Students Table"); for(String str : arr){ Element rssElement = rssSourcesElement.addElement("rssSource"); rssElement.addAttribute("sourceId", str); } // // 增加子节点 // 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; } public Document createXml(List<Long> arr) { Document doc = DocumentHelper.createDocument(); Map<String, String> inMap = new HashMap<String, String>(); // 增加根节点 Element rssSourcesElement = doc.addElement("Urls"); for(Long str : arr){ Element rssElement = rssSourcesElement.addElement("url"); rssElement.addAttribute("CRC32", str.toString()); } 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(); // 创建document Document 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-8 format.setEncoding("UTF-8"); XMLWriter output = new XMLWriter(new FileWriter(outputFile), format); output.write(doc); output.flush(); 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()); } } }
时间: 2024-10-02 07:58:52