xml文件的三种解析dom,SAX和dom4j

目录

一、XML文件

二、DOM解析

三、SAX解析

四、dom4j解析


一、XML文件

student.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 内嵌 -->
<!DOCTYPE students
	[
		<!ELEMENT students (student*)>
		<!ELEMENT student (name,age,gender)>
		<!ELEMENT name (#PCDATA)>
		<!ELEMENT age (#PCDATA)>
		<!ELEMENT gender (#PCDATA)>
		<!ATTLIST student 
			id ID #REQUIRED
			sex (male|female) #REQUIRED
			pid IDREFS #REQUIRED
		>
	]
>


<students>
	<student id="a1" sex="male" pid="a1 a2">
		<name>Tom</name>
		<age>20</age>
		<gender>male</gender>
	</student>
	<student id="a2" sex="male" pid="a1">
		<name>Bob</name>
		<age>20</age>
		<gender>male</gender>
	</student>
</students>

二、DOM解析

    /**
	 * 使用dom解析xml文件
	 * 
	 * @param path xml文件路径
	 * 
	 * @throws Exception
	 */

	public static void domParse(String path) throws Exception {
		// 1.创建解析器的工厂类
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.创建解析器对象
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		// 3.解析文件获取文档对象
		Document document = documentBuilder.parse(path);
		// 4.获取文档根节点
		Element root = document.getDocumentElement();
		System.out.println("<" + root.getNodeName() + ">");
		// 5.获取根节点下面的所有子节点
		NodeList firstList = root.getChildNodes();
		for (int i = 0; i < firstList.getLength(); i++) {
			// node对应每一个节点,一级节点,下面包含很多二级节点
			Node node = firstList.item(i);
			// System.out.println("一级节点:"+node.getNodeName());

			// 取每一个结点的属性值
			// NamedNodeMap attributes = node.getAttributes();
			// if (attributes != null && attributes.getLength() != 0) {
			// for (int j = 0; j < attributes.getLength(); j++) {
			// // 对于每个属性
			// Node item = attributes.item(j);
			// // System.out.println(item.getNodeName() +"----"+ item.getNodeType());
			// }
			// }

			System.out.println("\t<" + node.getNodeName() + " " + node.getAttributes().item(0).getNodeName() + "='"
					+ node.getAttributes().item(0).getTextContent() + "' " + node.getAttributes().item(1).getNodeName()
					+ "='" + node.getAttributes().item(1).getTextContent() + "' "
					+ node.getAttributes().item(2).getNodeName() + "='" + node.getAttributes().item(2).getTextContent()
					+ "'>");
			// 取出所有二级节点
			NodeList secondList = node.getChildNodes();
			for (int j = 0; j < secondList.getLength(); j++) {
				// 取出每一个二级节点
				Node item = secondList.item(j);
				// System.out.println("二级节点:"+item.getNodeName());
				System.out.println(
						"\t\t<" + item.getNodeName() + ">" + item.getTextContent() + "</" + item.getNodeName() + ">");
			}
			System.out.println("\t</" + node.getNodeName() + ">");
		}
		System.out.println("</" + root.getNodeName() + ">");
	}
/**
	 * 写xml格式的内容到文件
	 * 
	 * @param path
	 *            文件路径
	 * @throws Exception
	 **/
	public static void domWriter(String path) throws Exception {
		// 1.创建解析器对象工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		// 2.创建解析器对象
		DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
		// 3.构建文档对象
		Document dom = documentBuilder.newDocument();
		// 4.创建根节点
		Element root = dom.createElement("students");
			// 5.创建其他节点

			Element firstNode = dom.createElement("student");
				// 二级节点:name:Tom
				Element nameNode = dom.createElement("name");
				nameNode.setTextContent("Tom");
				// 二级节点:age:20
				Element ageNode = dom.createElement("age");
				ageNode.setTextContent("20");
				// 二级节点:gender:male
				Element genderNode = dom.createElement("gender");
				genderNode.setTextContent("male");
			Element secondNode = dom.createElement("student");
				// 二级节点:name:Bob
				Element nameNode1 = dom.createElement("name");
				nameNode1.setTextContent("Bob");
				// 二级节点:age:18
				Element ageNode1 = dom.createElement("age");
				ageNode1.setTextContent("18");
				// 二级节点:gender:female
				Element genderNode1 = dom.createElement("gender");
				genderNode1.setTextContent("female");

		// 进行结点关联
		// 关联根节点
		dom.appendChild(root);
		// 关联一级节点
		root.appendChild(firstNode);
		root.appendChild(secondNode);
		// 关联二级节点
		firstNode.appendChild(nameNode);
		firstNode.appendChild(ageNode);
		firstNode.appendChild(genderNode);

		secondNode.appendChild(nameNode1);
		secondNode.appendChild(ageNode1);
		secondNode.appendChild(genderNode1);
		
		//创建转化器对象工厂
		TransformerFactory factory = TransformerFactory.newInstance();
		//创建转化器对象
		Transformer transformer = factory.newTransformer();
		//执行转化方法
		transformer.transform(new DOMSource(dom), new StreamResult(new File(path)));
		
	}

三、SAX解析

/**
	 * SAX解析xml文件的方法
	 * 
	 * @param path
	 *            需要解析的xml文件的路径
	 * @throws Exception 
	 */
	public static void saxParse(String path) throws Exception {
		//1.构建SAX解析器工厂
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		//2.构建解析器对象
		SAXParser saxParser = saxParserFactory.newSAXParser();
		//3.调用方法解析xml文件
		//parse(文件对象(或流),自定义事件处理器)
//		saxParser.parse(new FileInputStream(path), dh);
		saxParser.parse(new File(path),new MyHandler());
	}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler {

	/**
	 * 开始读取文档
	 */
	@Override
	public void startDocument() throws SAXException {
//		System.out.println("开始读取文档:startDocument()");
	}

	/**
	 * 文档读取结束
	 */
	@Override
	public void endDocument() throws SAXException {
//		System.out.println("文档读取结束:endDocument()");
	}

	/**
	 * 开始读取元素时调用
	 * @param uri
	 * @param localName
	 * @param qName
	 * @throws SAXException
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//		System.out.println("开始读取元素:startElement()");
//		System.out.println(uri);
//		System.out.println(localName);
//		System.out.println(qName);
//		System.out.println(attributes.getIndex(qName));
		//取属性
		/*for (int i = 0; i < attributes.getLength(); i++) {
			String qName2 = attributes.getQName(i);
			String value = attributes.getValue(i);
			System.out.println(qName2+"--"+value);
		}*/
		
		System.out.print("<"+qName);
		for (int i = 0; i < attributes.getLength(); i++) {
			String qName2 = attributes.getQName(i);
			String value = attributes.getValue(i);
			System.out.print(" "+qName2+"=\""+value+"\"");
		}
		System.out.print(">");
	}

	/**
	 * 结束读取元素
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
//		System.out.println("结束读取元素:endElement()");
//		System.out.println(qName);
		System.out.println("</"+qName+">");
	}

	/**
	 * 读取到元素值时
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
//		System.out.println("读取到元素值时:characters()");
		for (int i = 0; i < ch.length; i++) {
			//元素值:[start,start+length)
			if(i>=start&&i<start+length) {
				System.out.print(ch[i]);//结果:Tom20maleBob20male
			}
		}
	}

}

四、dom4j解析

/**
	 * dom4j解析xml文件
	 * 
	 * @param path
	 *            需要解析的xml文件
	 * @throws Exception
	 */
	public static void dom4j(String path) throws Exception {
		// System.out.println(path);
		// 1.构建解析器
		SAXReader sr = new SAXReader();
		// 2.调用方法解析文件
		Document document = sr.read(new File(path));
		// 3.获取根节点
		Element root = document.getRootElement();
		System.out.println("<" + root.getName() + ">");
		// 4.获取一级节点集合,一级节点下面包含很多二级节点
		List<Element> elements = root.elements();
		for (Element element : elements) {
			System.out.print("\t" + "<" + element.getName() + " ");
			// 获取一级节点属性
			List<Attribute> attr = element.attributes();
			for (Attribute attribute : attr) {
				System.out.print(attribute.getName() + "=\"" + attribute.getText() + " ");
			}
			System.out.println(">");
			// 获取二级节点
			List<Element> e = element.elements();
			for (Element e1 : e) {
				System.out.println("\t\t" + "<" + e1.getName() + ">" + e1.getText() + "</" + e1.getName() + ">");
			}
			// 一级节点结束标签
			System.out.println("\t" + "</" + element.getName() + ">");
		}
		System.out.println("</" + root.getName() + ">");
	}
/**
	 * dom4j写数据到xml文件
	 * 
	 * @param xmlPath
	 *            xml文件路径
	 * @throws Exception
	 */
	public static void dom4jWriter(String xmlPath) throws Exception {
		// 1.创建一个document对象
		Document document = DocumentHelper.createDocument();
		// 2.创建根结点
		Element root = document.addElement("employees");
		// 3.创建一级节点
		Element firstNode1 = root.addElement("employee");
		Element firstNode2 = root.addElement("employee");

		// 创建一级标签属性
		firstNode1.setAttributeValue("status", "在职");
		firstNode2.setAttributeValue("status", "离职");
		// 4.创建二级节点
		Element idNode1 = firstNode1.addElement("id");
		Element nameNode1 = firstNode1.addElement("name");
		Element ageNode1 = firstNode1.addElement("age");
		Element depNameNode1 = firstNode1.addElement("depName");

		Element idNode2 = firstNode2.addElement("id");
		Element nameNode2 = firstNode2.addElement("name");
		Element ageNode2 = firstNode2.addElement("age");
		Element depNameNode2 = firstNode2.addElement("depName");

		// 设置二级节点的值
		idNode1.setText("A12");
		nameNode1.setText("张三");
		ageNode1.setText("18");
		depNameNode1.setText("教学部");

		idNode2.setText("A13");
		nameNode2.setText("李四");
		ageNode2.setText("23");
		depNameNode2.setText("MIS部");

		// 5.写到文件
		// 格式化对象
		OutputFormat format = OutputFormat.createPrettyPrint();

		File file = new File(xmlPath);
		if (!file.exists()) {
			file.createNewFile();
		}
		// 格式化
		// XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(file),format);
		// 非格式化
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(file));

		xmlWriter.write(document);
		xmlWriter.flush();
		xmlWriter.close();

	}

猜你喜欢

转载自blog.csdn.net/elice_/article/details/82775287