使用XPath解析XML文件

XPath是什么,简单的答案是用来手写XML解析的一种方法,复杂的答复就需要咨询一下Google,这里呢只记录一下使用方法,理论就不赘述了。

比如对于如下格式的XML文件,结构和内容并不复杂,直接使用DOM来手写解析过程倒也复杂,但是使用XPath的话,解析代码会更直接、更清晰一些。

<students>
    <student>
        <name length="1">a</name>
    </student>
    <student>
        <name length="2">aa</name>
    </student>
</students>
样例代码如下,为了减少篇幅,省略了异常处理的代码,实际项目代码中可不能偷懒。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class XPathTest {

    @SuppressWarnings("unchecked")
    public static void main(final String[] args) throws Exception {
        final File xmlFile = new File("a.xml");
        final XPath xpath = XPathFactory.newInstance().newXPath();// 构建XPath解析对象
        Reader reader = null;
        reader = new BufferedReader(new FileReader(xmlFile));// 构造文件IO输入对象,下面将提供文件IO对象给解析器
        final NodeList nodes = (NodeList) xpath.evaluate("students/student", new InputSource(reader),
                        XPathConstants.NODESET);// 使用XPath解析器,直接从XML信息中提取student节点的列表
        for (int i = 0; i < nodes.getLength(); ++i) {// 遍历节点列表
            final Node node = nodes.item(i);

            final Node nameNode = (Node) xpath.evaluate("name", node, XPathConstants.NODE);// 提取特定student节点下的name节点对应的XML对象,注意这里第二个参数是node,表达式为student的子节点name

            final String name = (String) xpath.evaluate("name", node, XPathConstants.STRING);// 提取特定student节点下name节点的值,注意第三个参数是字符串类型
            System.out.println(nameNode.getNodeName() + " = " + name);

            final NamedNodeMap attrs = nameNode.getAttributes();// 提取name节点的属性列表对象
            for (int j = 0; j < attrs.getLength(); ++j) {
                final Node attr = attrs.item(j);
                System.out.println(attr.getNodeName() + " = " + attr.getNodeValue());// 访问属性的值
            }
        }
        if (reader != null) {
            reader.close();
        }
    }
}

我想对于使用Java作为日常工作语言的程序员来说,手写代码来解析XML文件应当可以说是很基本功,所以上述代码看起来应当不费劲。

日前在参加公司内部组织考试的时候,因为当时处于项目尾期,留给我准备的时间不多。等拿到考试题的时候发现题目要求解析一个XML文件,并对XML文件的格式做校验,并且不允许使用第三方库;这时有点傻眼,毕竟有好几年没有手写过XML解析代码,一下子竟完全想不起来解析器工厂如何初始化了。好在工作这么多年,心理素质还不错,没有被题目吓倒。突然想起来项目组同事前几天讨论的XPath技术,就抱着试试的想法在Java的文档中搜索类的文档,恰好找到了XPath相关的几个类,以及注释中的样例,于是考试题目顺利拿下。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小南家的青蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值