zoukankan      html  css  js  c++  java
  • 节点遍历测试dom4j创建、修改、遍历XML

    发一下牢骚和主题无关:

        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径路获得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);
    		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();
    		// 创立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 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();
    			// 创立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.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() + "》》》》》》");
       }
    }

        
     

    文章结束给大家分享下程序员的一些笑话语录: 人在天涯钻,哪儿能不挨砖?日啖板砖三百颗,不辞长做天涯人~

  • 相关阅读:
    HDU2036 计算多边形的面积
    poj 3648 线段树成段更新
    线段树基本知识
    计算几何基本模板
    最长递增子序列问题—LIS
    poj 2503
    Python基础(5)_字符编码、文件处理
    Python基础(4)_字典、集合、bool值
    Python基础(3)_可变对象与不可变对象、列表、元祖和字典
    流程控制练习
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3035837.html
Copyright © 2011-2022 走看看