一、基础使用
DocumentHelper解析xml文件解析xml格式的字符串,需要先引入以下依赖
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<!--使用简单示例对xml元素进行解析时不需要该依赖,但是使用复杂的selectNodes方法时就一定要该依赖-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
最简单的应用示例:
public static void main(String[] args) throws Exception{
String xmlContent ="<?xml version=\"1.0\" encoding=\"UTF-8\"?><school><student><id>0001</id></student></school>";
Document document=DocumentHelper.parseText(xmlContent);//获取Document对象
Element root=document.getRootElement();//获取根结点
Element student=root.element("student");//获取子结点
Element id=student.element("id");//获取子子结点
System.out.println("id:"+id.getTextTrim());
}
二、扩展案例
2.1 循环迭代遍历子元素
public static void main(String[] args) throws Exception{
String transMessage = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
"<message>\n" +
" <body>\n" +
" <info>\n" +
" <ticket id=\"0001\" dealTime=\"20200101\" status=\"404\" message=\"成功\"/>\n" +
" <ticket id=\"0002\" dealTime=\"20200101\" status=\"404\" message=\"失败\"/>\n" +
" </info>\n" +
" </body>\n" +
"</message>";
Document document=DocumentHelper.parseText(transMessage);
Element root=document.getRootElement();
//循环迭代遍历子元素
Iterator iterator=root.element("body").element("info").elementIterator();
while(iterator.hasNext()) {
Element element=(Element) iterator.next();
System.out.print(element.attributeValue("id")+" ");
System.out.print(element.attributeValue("dealTime")+" ");
System.out.println(element.attributeValue("status")+" ");
}
}
2.2 selectNodes()方法
selectNodes是 dom4j 中 XmlDocument 或 XmlNode 的一个方法。SelectNodes 使用 XPath 来选取节点。
<?xml version='1.0' encoding='utf-8'?>
<ExInfo>
<standardInfo process="HJ">
<Field FieldName="SBLSH">0001</Field>
<Field FieldName="SXBM">002</Field>
<Field FieldName="LQRXM">测试</Field>
<Field FieldName="LQRZJLX">测试</Field>
<Field FieldName="LQRSFZJHM">测试</Field>
<Field FieldName="LQFS">测试</Field>
<Field FieldName="LQSJ">2030-11-15 00:00:00</Field>
<Field FieldName="XZQHDM">测试</Field>
<Field FieldName="BZ">测试</Field>
<Field FieldName="BYZD">测试</Field>
</standardInfo>
</ExInfo>
1、SelectNodes("ExInfo") 从当前节点的儿子节点中选择名称为 ExInfo 的节点
String transMessage="xmlStr";
Document document=DocumentHelper.parseText(transMessage);
List<Node> nodeList = document.selectNodes("ExInfo");
System.out.println(nodeList);
结果:
[org.dom4j.tree.DefaultElement@31a5c39e [Element: <ExInfo attributes: []/>]]
2、SelectNodes("/ExInfo") 从根节点的儿子节点中选择名称为 ExInfo 的节点。
String transMessage="xmlStr";
Document document=DocumentHelper.parseText(transMessage);
List<Node> nodeList = document.selectNodes("/ExInfo");
System.out.println(nodeList);
结果:
[org.dom4j.tree.DefaultElement@31a5c39e [Element: <ExInfo attributes: []/>]]
3、SelectNodes("//standardInfo") 从任意位置的节点上选择名称为 item 的节点。要重点突出这个任意位置,它不受当前节点的影响,也就是说假如当前节点是在第 100 层(有点夸张),也可以选择第一层的名称为 standardInfo的节点。
Document document=DocumentHelper.parseText(transMessage);
List<Node> nodeList = document.selectNodes("//standardInfo");
System.out.println(nodeList);
结果:
[org.dom4j.tree.DefaultElement@25bbe1b6 [Element: <standardInfo attributes: [org.dom4j.tree.DefaultAttribute@78c03f1f [Attribute: name process value "HJ"]]/>]]
4、在 SelectNodes("//Field") 的基础上,增加了一个限制,就是要求拥有 FieldName 属性。
Document document=DocumentHelper.parseText(transMessage);
String path="Field[@FieldName]";
List<Node> nodeList = document.selectNodes("//standardInfo");
for (int i = 0; i < nodeList.size(); i++) {
Node n = nodeList.get(i);
if (n instanceof Element) {
Element e = (Element) n;
List<Node> pathNodeList = n.selectNodes(path);
System.out.println(pathNodeList.size());
}
}
结果:
10
5、SelectNodes("Field") 的基础上,增加了一个限制,就是要求拥有FieldName属性并且要求属性值为SBLSH
Document document=DocumentHelper.parseText(transMessage);
String path="Field[@FieldName='SBLSH']";
List<Node> nodeList = document.selectNodes("//standardInfo");
for (int i = 0; i < nodeList.size(); i++) {
Node n = nodeList.get(i);
if (n instanceof Element) {
Element e = (Element) n;
List<Node> pathNodeList = n.selectNodes(path);
System.out.println(pathNodeList.size());
}
}
结果:
1
2.3 selectSingleNode()方法
selectSingleNode() 方法查找和 XPath 查询匹配的一个节点。
Document d = DocumentHelper.parseText(xml);
Node exFileNode = d.selectSingleNode("//ExFile");
if (exFileNode instanceof Element) {
Element exFileElement = (Element) exFileNode;
System.out.println(exFileElement.attributeValue("DeptCode"));
System.out.println(exFileElement.attributeValue("WinCode"));
System.out.println(exFileElement.attributeValue("ItemCode")):
System.out.println(exFileElement.attributeValue("Action"));
}
返回值匹配查询的一个单独的 Node。如果没有,则为 null。
本文介绍了如何使用DocumentHelper解析XML文件,包括基础使用方法和扩展案例,如循环迭代遍历子元素,详细讲解了selectNodes()和selectSingleNode()方法的应用,通过XPath选择特定节点。
6006

被折叠的 条评论
为什么被折叠?



