高考考试网
当前位置: 首页 高考资讯

java中读取xml文件的方法(如何使用Java解析XML文档)

时间:2023-05-25 作者: 小编 阅读量: 1 栏目名: 高考资讯

在前面的文章中,我们介绍了XML文件的规范与使用。XPath定义了一组语法,能够从结构树中筛选出满足要求的节点。MyBatis的配置文件与映射文件均是XML文件,因此解析并读取XML文档中的内容是MyBatis展开后续工作的基础。在解析XML文件的过程,XPathParser类与XNode类是两个最为关键的类,下图给出了这两个类主要关系的类图。XPathParser存在多个重载的构造方法,它们均是根据传入的参数完成属性的初始化并构造出XML文档对应的Document对象。

在前面的文章中,我们介绍了XML文件的规范与使用。而且XML应用非常广泛,在很多的软件中,会使用XML作为配置文档。那这些配置文档是如何被解析的呢?本文我们将参考《通用源码阅读指导书——MyBatis源码详解》一书介绍如何使用Java解析XML文件。

前面的文章中我们已经说明XML表述了一种树状结构,并通过给出了XML片段的结构树。而XPath(XML Path Language,即,XML路径语言)作为一种小型的查询语言能够根据XML结构树在树中寻找节点。

XPath定义了一组语法,能够从结构树中筛选出满足要求的节点。如果读者对CSS选择器或者jQuery选择器比较熟悉的话,那掌握XPath的语法还是非常简单的,因为这些选择器的语法思路是相通的。

例如XML片段如下:

<?xmlversion="1.0"encoding="UTF-8"?><members><usertype="student"><id>1</id><name>易哥</name><shcool>SunnySchool</shcool></user><usertype="student"><id>2</id><name>莉莉</name><shcool>GardenSchool</shcool></user></members>

我们可以通过下表所示的例子来简单了解下XPath的语法。

路径表达式 含义 . 当前元素 .. 当前元素的父元素 user user元素 /user user根元素 user/id user元素的名为id的直接子元素 user//id user元素的名为id的直接或间接子元素 user/id[1] user元素的名为id的直接子元素中的第一个 user/*[1] user元素的第一个子元素 user/id[last()-1] user元素的名为id的直接子元素中的倒数第二个 //user[@type='student'] 所有type属性值为“student”的user元素 //user[id>3] 所有id子元素值大于3的的user元素

javax.xml.xpath包提供了强大的XPath解析功能,因此我们可以基于它实现XML的解析。

我们可以通过下面的代码解析该XML片段。

Stringresource="info.xml";DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderdb=dbf.newDocumentBuilder();Documentdoc=db.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(resource));XPathFactoryfactory=XPathFactory.newInstance();XPathxpath=factory.newXPath();XPathExpressioncompile=xpath.compile("/members/user[id=1]");System.out.println(compile.evaluate(doc));

得到下图所示的输出

在代码中,我们通过“/members/user[id=1]”定位出了一个user元素,该元素满足以下条件:

以上内容均参考《通用源码阅读指导书——MyBatis源码详解》一书,接下来,我们跟随本书看MyBatis如何解析配置文件。

MyBatis的配置文件与映射文件均是XML文件,因此解析并读取XML文档中的内容是MyBatis展开后续工作的基础。

MyBatis中的parsing包就是用来进行XML文件解析的包。在解析XML文件的过程,XPathParser类与XNode类是两个最为关键的类,下图给出了这两个类主要关系的类图。

通过图可以看出,XPathParser类中封装了“javax.xml.xpath.XPath”类的对象。我们已经知道XPath对象是XML解析的利器,因此XPathParser类便具有了XML解析的能力。

下面代码给出了XPathParser类的带注释的属性。

//代表要解析的整个XML文档privatefinalDocumentdocument;//是否开启验证privatebooleanvalidation;//EntityResolver,通过它可以声明寻找DTD文件的方法,例如通过本地寻找,而不是只能通过网络下载DTD文件privateEntityResolverentityResolver;//MyBatis配置文件中的properties节点的信息privatePropertiesvariables;//javax.xml.xpath.XPath工具privateXPathxpath;

有必要说明一下,上述“private Properties variables”属性存储的内容就是MyBatis配置文件中properties节点的信息。properties节点会在解析配置文件的最开始就被解析,然后相关信息会被放入“private Properties variables”属性并在解析后续节点时发挥作用,这一点我们不再展开,感兴趣的读者可以参考《通用源码阅读指导书——MyBatis源码详解》一书的“11.3 文档解析中的变量替换”章节。

XPathParser存在多个重载的构造方法,它们均是根据传入的参数完成属性的初始化并构造出XML文档对应的Document对象。除去构造方法外,便是大量提供XML文档中节点解析功能的“eval*”方法,这些方法最后都调用了如下代码所示的evaluate方法。

/***进行XML节点的解析*@paramexpression解析的语句*@paramroot解析根*@paramreturnType返回值类型*@return解析结果*/privateObjectevaluate(Stringexpression,Objectroot,QNamereturnType){try{//对指定节点root运行解析语法expression,获得returnType类型的解析结果returnxpath.evaluate(expression,root,returnType);}catch(Exceptione){thrownewBuilderException("ErrorevaluatingXPath.Cause:" e,e);}}

在evaluate方法中,使用“javax.xml.xpath.XPath”对象进行了节点的解析。因此,整个XPathParser类本质就是对“javax.xml.xpath.XPath”的封装和调用,可以把XPathParser类看作是javax.xml.xpath.XPath类的包装类。

同样地,parsing包中的XNode类可以看作是“org.w3c.dom.Node”类的包装类。“org.w3c.dom.Node”类是用来表示DOM中节点的类,而XNode类只是在“org.w3c.dom.Node”类的基础上提取和补充了几个属性。下面给出了XNode对象的属性。

//org.w3c.dom.Node表示是XML中的一个节点privatefinalNodenode;//节点名,可以从org.w3c.dom.Node中获取privatefinalStringname;//节点体,可以从org.w3c.dom.Node中获取privatefinalStringbody;//节点的属性,可以从org.w3c.dom.Node中获取privatefinalPropertiesattributes;//MyBatis配置文件中的properties信息privatefinalPropertiesvariables;//XML解析器XPathParserprivatefinalXPathParserxpathParser;

XNode对象的上述属性中,name、body、attributes这三个属性是从“org.w3c.dom.Node”对象中提取出来的,variables、xpathParser这两个属性补充的。而我们知道XPathParser类具有解析XML节点的能力,也就是说,XNode类中封装了自身了的解析器。在一个类中封装自己的解析器,这是一种非常常见的做法,如此一来这个类不需要外界的帮助便可以解析自身,即获得了自解析能力。

大家可能会有过这样的经历:新安装的电脑上没有解压软件,于是从网络或者朋友那里得到了一份解压软件。可是,拿到手的解压软件安装包却是一个压缩文件。尚未安装解压软件的你必然没法打开压缩文件获得安装包。而自解压文件(SelF-eXtracting,简称SFX)能够帮助你摆脱这个困境。自解析类也有类似的优点,它减少了对外部类的依赖,具有更高的内聚性,也更为易用。

正是得益于XNode类的自解析特性,它本身提供了一些“eval*”方法,从而能够解析自身节点内的信息。

以上内容均参考《通用源码阅读指导书——MyBatis源码详解》一书。

阅读源码确实对编程能力的提升有很大的帮助。把《通用源码阅读指导书——MyBatis源码详解》推荐给大家。这是一本以MyBatis的源码为实例讲述源码阅读方法的书籍,并且附带有示例项目源码,MyBatis的全中文注解。书籍还总结了大量的编程知识和架构经验,对提升编程和架构能力十分有用。

最后,我是高级架构师易哥,这里是架构研究所。真心希望本文能让大家有所收获。

欢迎关注我们,我会偶尔出没分享软件架构编程相关的干货知识。

    推荐阅读
  • 兰花刚栽上要浇水吗(兰花刚栽上要浇水吗)

    这样可以让根系和土壤更好的接触,有利于它适应新的环境。但如果根系受损,比如修剪烂根、分株等。一般根部会保留土球,不会对其造成损伤,所以换盆之后需要浇透水。剪根肯定会伤根,所以不宜立刻浇水,需要先进行缓苗养护,之后再补充水分。分株后不宜立刻浇水,不过一般恢复较快,所以不用等得太久。

  • 流媒体后视镜什么意思(流媒体后视镜是未来趋势还是鸡肋)

    在忙碌之中,对于从事汽车新媒体的小编来说,最幸运的莫过于每天可以接触到很多新鲜好玩的事情。电子产品的稳定性相比于传统的后视镜而言还存在较大的差距。但流媒体后视镜仍然被寄予厚望,这很大程度上是凯迪拉克CT6带动的。

  • 锦怎么读(锦应该怎么读)

    在三色以上纬丝织成的缎纹地上织出的绚丽多彩、古雅精致的花纹织物。有库锦、蜀锦、宋锦、云锦等。形容鲜明华丽的色彩:锦霞。本意是中国汉字信息指丝织品,原意为精致丝织品,多有美丽图案。也泛指比喻色彩鲜艳华美的。

  • 分层级监督未闭环(列出菜单破解同级监督难题)

    谈起乡镇纪委“菜单式”同级监督工作,江西省上栗县长平乡纪委书记表示非常支持。近日,江西省上栗县委印发的《关于推行乡镇纪委对同级党委及其成员“菜单式”监督的试行办法》受到全县各乡镇党委班子成员和乡镇纪检监察干部的关注和热议。截至目前,全县8个乡镇纪委共发出抄告单16份,开展政治谈话62人次,提醒谈话21人次,乡镇班子成员向乡镇纪委报备“三重一大”事项30余件次。江西省上栗县纪委监委有关负责人表示。

  • 寒露要怎么养生(如何在寒露季节养生)

    寒露要怎么养生早上时候空气清新,可以早点起来运动一下。寒露时节气温逐渐下降,早晚温差又比较大。记得适当随着温度增减衣服,还有要注意的是寒露季节容易出现腹泻,要注意腹部的保暖,受寒也会容易拉肚子还有呕吐的。寒露时节要保证自己的睡眠是充足的,在夜晚睡觉时最好不要吹风,每天要早睡早起,室内就要注意开窗通风,保持室内空气新鲜。

  • 网上在家兼职靠谱的有哪些(比较正规的兼职软件)

    所以你可以买一堆这样的百度网盘vip账号,然后专门用来出租!其实网上已经有大量的短期账号出租服务了,只需要在平台选好商品付款后,平台就会自动发送百度网盘会员的账号和密码给你,不需要人工管控,也属于一定程度上的躺赚。正常情况下,百度网盘超级会员收费标准是25元/月,298元/年。

  • 电饭煲做黑米饭的做法(电饭煲做黑米饭的方法)

    电饭煲做黑米饭的做法食材:黑米3两、大米3两、若羌枣4-5个、橄榄油小半匙、白砂糖少许。我们需要把黑米和大米按1:1的比例混合,搅拌均匀即可。用刀把若羌枣切碎放在盆里,然后倒入数滴橄榄油,橄榄油不要放太多几滴即可。出锅,枣香米香满屋,有枣本来就甜,口味重的还可以加点白沙糖,好吃不停口。加了白砂糖的黑米饭,色泽油亮,煊软可口。

  • 生大米可以直接炸吗(生大米能不能直接炸)

    生大米可以直接炸吗?接下来我们就一起去了解一下吧!一般我们在锅里倒入适量的油,加热之后,将大米直接倒在里面炸,直到它漂浮起来就可以捞出来了。这里注意,炸的米一点要选晚稻米或者是粳米这些口感比较硬的米,这样才比较适合炸着吃,如果用糯米的话,口感会比较差,还容易粘锅。

  • 莴笋和山药可以一起吃吗 山药能和莴笋叶一起吃吗

    山药跟莴笋一起食用可以有治疗脾胃虚弱,调理寒性体质的作用,对于你会有脾胃虚弱也是有好处的。

  • 做梦梦见砍头(做梦梦见砍头的含义)

    做梦梦见砍头梦中的斩首是生活中的某种消极模式应得到改善的象征。梦见斩首,表示会受到惩罚,吸取教训,也预示会改变自我,开始新生。梦见自己被斩首,意味着你会丢弃原来的自我,进一步完善自我。也可能表示周围环境压力太大,你内心渴望解脱。对有不良行为的人,还含有警告的寓意。梦见自己被斩首时心里异常害怕,一方面提示梦者在早期生活经历中具有较为严重的心理创伤,另一方面也提示梦者可能有不道德行为;