JAVA DOM解析xml文档

1 篇文章 0 订阅
1 篇文章 0 订阅

方法一:javax.xml解析xml文件

1,创建DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2,创建DocumentBuilder对象
3,通过documentBuilder对象的parser方法加载xml文件到当前项目下
4,获取所有XML文件内节点的集合 getElementsByTagName()方法
遍历每一个节点
5,通过item(i)方法获取节点
6,获取节点的所有属性集合 getAttributes()方法
7,遍历节点的属性 getNodeValue()
8,通过item()方法获取节点的属性
9,通过getNodeName()和getNodeValue()获取属性名和属性值
10,通过getChildNodes()获取子节点的集合
11,遍 历子节点,获取子节点属性名和属性值 (注意: 区分text 类型的node,使用判断 if(chilNod.item(k).getNodeType() == Node.ELEMENT_NODE))

代码:

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


/**
 * javax.xml解析xml文件
 * @author 尹公峰
 *
 */
public class XmlAlyals {

	public static void main(String[] args) {
		XmlAlyals.ayalisXML();
	}

	private static void ayalisXML() {
		// 创建DocumentBuilderFactory的对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			// 创建DocumentBuilder对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 通过documentBuilder对象 的parser方法加载books。xml文件到当前项目下 --对文件的解析
			Document document = db.parse("./file/myXml.xml");
			// 获取所有column节点的集合
			NodeList booklist = document.getElementsByTagName("column");
			System.out.println("一共有" + booklist.getLength() + "个集合");
			// 遍历每一个column节点
			for (int i = 0; i < booklist.getLength(); i++) {
				// 通过item(i)方法获取column节点
				Node book = booklist.item(i);
				// 获取column节点的所有属性集合
				NamedNodeMap attrs = book.getAttributes();
				System.out.print("第" + (i + 1) + "行共有" + attrs.getLength() + "个属性");
				// 遍历column的属性
				for (int j = 0; j < attrs.getLength(); j++) {
					// 通过item方法获取column节点的属性
					Node attr = attrs.item(j);
					// 获取属性名
					System.out.print("   属性名:" + attr.getNodeName());
					// 获取属性值
					System.out.println("--属性值:" + attr.getNodeValue());
					NodeList chilNod = book.getChildNodes();
					System.out.print("         第" + (i + 1) + "行共有" + chilNod.getLength() + "个子节点");
					for (int k = 0; k < chilNod.getLength(); k++) {
						Node chil = chilNod.item(k);
						// 区分text 类型node
						if (chilNod.item(k).getNodeType() == Node.ELEMENT_NODE) {
							System.out.print(" 子节点名:" + chil.getNodeName() + "  ");
							// System.out.println("
							// 子节点值:"+chilNod.item(k).getFirstChild().getNodeValue());
							String text = chilNod.item(k).getTextContent();
							if (!"".equals(text) && null != text) {
								System.out.print("子节点值:" + text);
								System.out.println("  实际子节点值:" + text.subSequence(9, text.indexOf("]")));
							} else {
								System.out.println("子节点值:" + text);
							}
						}
					}
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

方法二:org.dom4j解析xml字符串


import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * DOM4J解析XML字符串
 * 
 * @author Administrator
 *
 */

public class XmlAlyals2_log4 {

	public static void main(String[] args) {
		String data = "<formExport version=\"2.0\">" + " <summary id=\"-4911087876665687089\" name=\"formmain_5865\"/>"
				+ " <definitions/>" + "<values>"
				+ "<column name=\"协调处理单号\"><value>&lt;![CDATA[20181120]]&gt;</value></column>"
				+ "<column name=\"发起协调时间\"><value>&lt;![CDATA[2018-11-20 13:59:52]]&gt;</value></column>"
				+ "<column name=\"异常点巡检编号\"><value>&lt;![CDATA[20180902000001]]&gt;</value></column>"
				+ "<column name=\"异常类型\"><value>&lt;![CDATA[点检]]&gt;</value></column>"
				+ "<column name=\"设备编号\"><value>&lt;![CDATA[2018-09-06]]&gt;</value></column>"
				+ "<column name=\"设备名称\"><value>&lt;![CDATA[测试设备001]]&gt;</value></column>"
				+ "<column name=\"所属部门\"><value>&lt;![CDATA[制造三厂]]&gt;</value></column>"
				+ "<column name=\"所属班组\"><value>&lt;![CDATA[测试班组]]&gt;</value></column>"
				+ "<column name=\"点巡检部位\"><value>&lt;![CDATA[加油机]]&gt;</value></column>"
				+ "<column name=\"点巡检内容\"><value>&lt;![CDATA[是否有油]]&gt;</value></column>"
				+ "<column name=\"点巡检执行人\"><value>&lt;![CDATA[张三]]&gt;</value></column>"
				+ "<column name=\"执行时间\"><value>&lt;![CDATA[2018-09-02 15:04:58]]&gt;</value></column>"
				+ "<column name=\"执行情况\"><value>&lt;![CDATA[异常]]&gt;</value></column>"
				+ "<column name=\"异常情况描述\"><value>&lt;![CDATA[小噪音]]&gt;</value></column>"
				+ "<column name=\"异常处理人\"><value>&lt;![CDATA[-8441772679217658598]]&gt;</value></column>"
				+ "<column name=\"暂缓处理说明\"><value>&lt;![CDATA[ji]]&gt;</value></column>"
				+ "<column name=\"处理方式\"><value>&lt;![CDATA[暂缓处理]]&gt;</value></column>"
				+ "<column name=\"暂缓处理时间\"><value>&lt;![CDATA[2018-11-22 14:08:00]]&gt;</value></column>"
				+ "<column name=\"异常分类\"><value></value></column>" 
				+ "<column name=\"处理时间\"><value></value></column>"
				+ "<column name=\"建议处理方案\"><value></value></column>"
				+ "<column name=\"实际处理方案\"><value></value></column>" 
				+ "<column name=\"备品备件\"><value></value></column>"
				+ "<column name=\"检修负责人\"><value></value></column>"
				+ "<column name=\"验收负责人\"><value></value></column>"
				+ "<column name=\"遗留问题\"><value></value></column>" 
				+ "</values>" + " <subForms/>" + "</formExport>";
		XmlAlyals2_log4.ayalisXML(data);
	}

	private static void ayalisXML(String data) {
		try {
			// 通过documentBuilder对象 的parseText方法加载books。xml文件到当前项目下 --对字符串的解析
			Document doc = DocumentHelper.parseText(data);
			// 拿到XML的内容之后,首先我们要读取xml的根元素,再通过根元素读取子元素,再读取元素点里面的值
			/**
			 * 4.获取根元素 注意:导包的时候导入import org.dom4j.Element;
			 */
			Element root = doc.getRootElement();// 获取根节点
			System.out.println(root.getName()); // 获取根元素的名字 companys
			/**
			 * 5.通过根元素获取子元素的迭代器 导入: import java.util.Iterator;包 import
			 * org.dom4j.Attribute;包
			 */
			// Iterator<Element> it = root.elementIterator();//获取根节点下面的子节点
			Iterator<Element> lsValues = root.elementIterator("values"); // 获取根节点下的values子节点
			if (lsValues.hasNext()) { // values节点只有一个
				Element elementValues = lsValues.next();// 获取values元素
				Iterator<Element> it = elementValues.elementIterator("column"); // 获取values节点下的column子节点
				while (it.hasNext()) {
					Element e = it.next();// 获取子元素
					// 获取属性值:方法一: 通过元素对象获取元素属性值
					// String id = e.attributeValue("name"); //获取属性id的值
					// 注意在XML中拿到的所有数据都是String类型
					// System.out.println(name);
					// 获取元素的属性 方法二
					Attribute name = e.attribute("name"); // 属性
					String value_text = name.getValue(); // 属性值
					System.out.print(value_text);
					// 通过元素对象获取子元素对象
					Element nameElement = e.element("value");// 子元素的值
					// 获取元素中的文本内容
					String content = nameElement.getText();
					if (!"".equals(content) && null != content) {
						System.out.print(" :" + content); // 万科A恒大B金地C招商D
						System.out.println(" :" + content.subSequence(9, content.indexOf("]"))); // 万科A恒大B金地C招商D
					} else {
						System.out.println(" :" + content); // 万科A恒大B金地C招商D
					}
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

注xml文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<formExport version="2.0">
   <summary id="-4911087876665687089" name="formmain_5865"/>
   <definitions/>
	   <values>
	     <column name="协调处理单号"><value>&lt;![CDATA[20181120]]&gt;</value></column>
	     <column name="发起协调时间"><value>&lt;![CDATA[2018-11-20 13:59:52]]&gt;</value></column>
	     <column name="异常点巡检编号"><value>&lt;![CDATA[20180902000001]]&gt;</value></column>
	     <column name="异常类型"><value>&lt;![CDATA[点检]]&gt;</value></column>
	     <column name="设备编号"><value>&lt;![CDATA[2018-09-06]]&gt;</value></column>
	     <column name="设备名称"><value>&lt;![CDATA[测试设备001]]&gt;</value></column>
	     <column name="所属部门"><value>&lt;![CDATA[制造三厂]]&gt;</value></column>
	     <column name="所属班组"><value>&lt;![CDATA[测试班组]]&gt;</value></column>
	     <column name="点巡检部位"><value>&lt;![CDATA[加油机]]&gt;</value></column>
	     <column name="点巡检内容"><value>&lt;![CDATA[是否有油]]&gt;</value></column>
	     <column name="点巡检执行人"><value>&lt;![CDATA[张三]]&gt;</value></column>
	     <column name="执行时间"><value>&lt;![CDATA[2018-09-02 15:04:58]]&gt;</value></column>
	     <column name="执行情况"><value>&lt;![CDATA[异常]]&gt;</value></column>
	     <column name="异常情况描述"><value>&lt;![CDATA[小噪音]]&gt;</value></column>
	     <column name="异常处理人"><value>&lt;![CDATA[-8441772679217658598]]&gt;</value></column>
	     <column name="暂缓处理说明"><value>&lt;![CDATA[ji]]&gt;</value></column>
	     <column name="处理方式"><value>&lt;![CDATA[暂缓处理]]&gt;</value></column>
	     <column name="暂缓处理时间"><value>&lt;![CDATA[2018-11-22 14:08:00]]&gt;</value></column>
	     <column name="异常分类"><value></value></column>
	     <column name="处理时间"><value></value></column>
	     <column name="建议处理方案"><value></value></column>
	     <column name="实际处理方案"><value></value></column>
	     <column name="备品备件"><value></value></column>
	     <column name="检修负责人"><value></value></column>
	     <column name="验收负责人"><value></value></column>
	     <column name="遗留问题"><value></value></column>
	    </values>
    <subForms/>
 </formExport>

个人理解
1,javax.xml 更方便与解析xml文档。可以根据路径把文档解析成xml。
dom4j跟方便于解析字符串,比较有针对性。可以直接把字符串转换为xml。

2,javax.xml更加灵活,可以随意获取文档中的某个节点。针对数据量大,并且未知xml解析。
dom4j只能先获取根节点,在依次递归下来,操作起来不灵活,主要针对开发者已知字符串的解析。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值