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

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的全中文注解。书籍还总结了大量的编程知识和架构经验,对提升编程和架构能力十分有用。

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

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

    推荐阅读
  • sata设置ahci还是raid(IDEAHCIRAID三种硬盘模式有什么区别)

    IDE、AHCI、RAID三种硬盘模式有什么区别IDE模式IDE是表示硬盘的传输接口。IDE模式可以通过映射通吃SATA硬盘,由于无需加载驱动程序,它的兼容性能超强,适用WinXP和Win7/8系统。AHCI模式原生支持SATA硬盘,它的优势在于它能够将NCQ技术充分发挥作用,或者说AHCI是现有的SATA硬盘主控接口中,除了复杂的磁盘阵列模式之外,最能发挥SATA硬盘性能。Win7/8系统完美支持AHCI模式,对WinXP兼容性不佳。

  • 快递面单泄露事件获利3000万(快递业泄露个人信息调查)

    11月17日,圆通速递称“疑似有加盟网点个别员工与外部不法分子勾结,利用员工账号和第三方非法工具窃取运单信息,导致信息外泄。”但圆通的回应未明确指出“内鬼”外泄快递用户信息的规模及贩卖金额等情况。张某伙同高某多次发布购买、租用快递查询系统账号的信息,并以每天1000元的价格将得到的账号信息贩卖给河南籍男子马某。记者进一步调查发现,除了圆通,市面上其他快递公司也存在“内鬼”参与贩卖快递用户信息的现象。

  • 女人必吃的暖宫水果有哪些(哪些水果宫寒女人不宜多吃)

    女人必吃的暖宫水果有哪些女士可以吃的暖宫水果比较多,比如红枣、核桃、石榴、榴莲、桃子、芒果等,都属于温性水果。如果某些女性有宫寒体质,平时在饮食方面,除了需要多吃些暖宫的食物外,比如红豆、桂圆和阿姣、牛、羊肉外,还需要多吃些温性水果,也具有暖宫效果。生果多归入寒凉的。假如确实宫寒得话那将来要少吃这种水果了。

  • 职工带薪年休假取消的规定(带薪年休假的那些事)

    春节是合家团聚的好日子。第二种情况是劳动者依据《劳动合同法》第三十八条单方解除劳动合同,一旦劳动者据此解除劳动合同行为的理由成立,则劳动者无需提前通知解除,即用人单位由于其自身原因造成未安排当年度年休假的,用人单位应当支付劳动者当年度应休未休年休假的工资报酬。

  • 求助成语填空答案(找一找下列哪个成语用错了)

    成语是汉语文化的瑰宝,也是我国传统文化中的一大特色。众人皆说,成之于语,故成语。成语有固定的结构形式,一般都是4个字,也有6个字和8个字的。因此在日程的沟通和书写中,大家都非常喜欢使用成语。“鼎力相助”是一个敬辞,指的是别人对自己的大力帮助,一般都是用在请人帮助的时候,因此“我一定鼎力相助”是一句病句。在日常沟通交流中,除了“鼎力相助”,还有许多成语非常容易被错用。

  • 霜降是秋天还是冬天(你答对了吗)

    虽然我国跨纬度比较广,但是到了霜降的世界,就算是最炎热的城市不会让人感觉到热。纬度偏南的南方地区,平均气温多在16℃左右。东北北部、内蒙东部和西北大部平均气温已在0℃以下。霜降现象出现的时间在各地都有所不同,在我国也并不是每个地方都会出现。就全年霜日而言,青藏高原上的一些地方即使在夏季也有霜雪,年霜日都在200天以上,是我国霜日最多的地方。

  • 北京车辆长期不开还用年检吗(北京车辆长期不开还用年检吗现在)

    如果驾驶的车辆不是自己名下的,既可以通过拨打机动车检测场电话的方式预约车辆年检,也可以通过“交管12123”手机APP完成“备案非本人机动车”后进行网上预约。

  • 关于李贺的资料(李贺的简介)

    河南府福昌县昌谷乡人,祖籍陇西郡。唐朝中期浪漫主义诗人,与诗仙李白、李商隐称为“唐代三李”,后世称李昌谷。诗作想象极为丰富,引用神话传说,托古寓今,后人誉为“诗鬼”。李贺是继屈原、李白之后,中国文学史上又一位颇享盛誉的浪漫主义诗人,有“太白仙才,长吉鬼才”之说。著有《昌谷集》。

  • 监控录像怎么删除(监控录像删除方法)

    以下内容大家不妨参考一二希望能帮到您!监控录像怎么删除在电脑主页面找到监控软件,鼠标右击选择“属性”选项,找到文件所在。返回电脑桌面,双击打开“我的电脑”,找到储存监控录像的文件夹。点击进入文件夹,选择自己需要删除的文件,右键选择“删除”即可。

  • 干净短句暖心家人(送给家人暖心的祝福语)

    干净短句暖心家人吉祥如意掸浮尘,花开富贵到如今,金玉满堂爱子孙,福禄寿喜满乾坤,海屋添筹古来稀,年华筵寿童颜身!晚辈祝您健康、快乐!您是我尊敬的长辈,我永远感谢您的关怀,今日为您庆寿辰,衷心祝您福满门,寿无疆!福如东海、寿比南山;日月昌明、松鹤长春;笑口常开、天伦永享。爸爸,无论您在哪儿,那里就是我们最快乐和向往的地方。外婆,生日快乐。