DocumentHelper解析xml文件

本文介绍了如何使用DocumentHelper解析XML文件,包括基础使用方法和扩展案例,如循环迭代遍历子元素,详细讲解了selectNodes()和selectSingleNode()方法的应用,通过XPath选择特定节点。

一、基础使用

 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值