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

发一下牢骚和主题无关:

    java项目概览:

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

 

    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() + "》》》》》》");

   }

}

    
 

 

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

你可能感兴趣的:(dom4j)