方法一: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><![CDATA[20181120]]></value></column>"
+ "<column name=\"发起协调时间\"><value><![CDATA[2018-11-20 13:59:52]]></value></column>"
+ "<column name=\"异常点巡检编号\"><value><![CDATA[20180902000001]]></value></column>"
+ "<column name=\"异常类型\"><value><![CDATA[点检]]></value></column>"
+ "<column name=\"设备编号\"><value><![CDATA[2018-09-06]]></value></column>"
+ "<column name=\"设备名称\"><value><![CDATA[测试设备001]]></value></column>"
+ "<column name=\"所属部门\"><value><![CDATA[制造三厂]]></value></column>"
+ "<column name=\"所属班组\"><value><![CDATA[测试班组]]></value></column>"
+ "<column name=\"点巡检部位\"><value><![CDATA[加油机]]></value></column>"
+ "<column name=\"点巡检内容\"><value><![CDATA[是否有油]]></value></column>"
+ "<column name=\"点巡检执行人\"><value><![CDATA[张三]]></value></column>"
+ "<column name=\"执行时间\"><value><![CDATA[2018-09-02 15:04:58]]></value></column>"
+ "<column name=\"执行情况\"><value><![CDATA[异常]]></value></column>"
+ "<column name=\"异常情况描述\"><value><![CDATA[小噪音]]></value></column>"
+ "<column name=\"异常处理人\"><value><![CDATA[-8441772679217658598]]></value></column>"
+ "<column name=\"暂缓处理说明\"><value><![CDATA[ji]]></value></column>"
+ "<column name=\"处理方式\"><value><![CDATA[暂缓处理]]></value></column>"
+ "<column name=\"暂缓处理时间\"><value><![CDATA[2018-11-22 14:08:00]]></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><![CDATA[20181120]]></value></column>
<column name="发起协调时间"><value><![CDATA[2018-11-20 13:59:52]]></value></column>
<column name="异常点巡检编号"><value><![CDATA[20180902000001]]></value></column>
<column name="异常类型"><value><![CDATA[点检]]></value></column>
<column name="设备编号"><value><![CDATA[2018-09-06]]></value></column>
<column name="设备名称"><value><![CDATA[测试设备001]]></value></column>
<column name="所属部门"><value><![CDATA[制造三厂]]></value></column>
<column name="所属班组"><value><![CDATA[测试班组]]></value></column>
<column name="点巡检部位"><value><![CDATA[加油机]]></value></column>
<column name="点巡检内容"><value><![CDATA[是否有油]]></value></column>
<column name="点巡检执行人"><value><![CDATA[张三]]></value></column>
<column name="执行时间"><value><![CDATA[2018-09-02 15:04:58]]></value></column>
<column name="执行情况"><value><![CDATA[异常]]></value></column>
<column name="异常情况描述"><value><![CDATA[小噪音]]></value></column>
<column name="异常处理人"><value><![CDATA[-8441772679217658598]]></value></column>
<column name="暂缓处理说明"><value><![CDATA[ji]]></value></column>
<column name="处理方式"><value><![CDATA[暂缓处理]]></value></column>
<column name="暂缓处理时间"><value><![CDATA[2018-11-22 14:08:00]]></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只能先获取根节点,在依次递归下来,操作起来不灵活,主要针对开发者已知字符串的解析。