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

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

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

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

    推荐阅读
  • 羽绒被总是跑毛怎么解决(羽绒被跑毛处理方法)

    羽绒被总是跑毛怎么解决?以下内容大家不妨参考一二希望能帮到您!羽绒被总是跑毛怎么解决首先是在原来的被罩上再增加一个被罩,其实这个方法是最简单的,这样就不会再钻毛了,之后清洗的时候,也只需要清洗第一层就可以了。减少清洗的次数。所以减少清洗的次数也是非常重要的,一般的情况下,最好是一年清洗三四次就可以了,这样不仅可以保护好羽绒被,同时也不会那么脏。

  • 西葫芦为什么是苦的(西葫芦发苦是什么原因)

    我们一起去了解并探讨一下这个问题吧!西葫芦为什么是苦的苦味素含量过高:西葫芦中含有一种名叫“苦味素”的物质,它可以导致西葫芦变苦,若种植时选用的品种较差,种植出来的西葫芦其味道就会比较苦。

  • 钓鱼鱼线怎么选择(教你4个鱼线挑选小常识)

    可以用牙咬的办法测试鱼线的韧性。具体就时用牙咬一下鱼线,如果不是很用力就可以将鱼线咬变形,咬扁这就说明鱼线的韧性是很好的。拉力是重中之重,鱼线的拉力不行,其它的标准就没必要考虑了,直接弃用。“一分钱一分货”也不一定就对。市场上有许多包装精美的,以次充好的鱼线,也有比较便宜的,不是名牌的好线。鱼线的外观,手感。

  • 个性qq网名2022年除夕最新版的女生(好听的女生网名)

    凉城听暖挽梦忆笙歌,今天小编就来说说关于个性qq网名2022年除夕最新版的女生?下面更多详细答案一起来看看吧!

  • 长沙市新文化之都(文化场景和网红品牌激活夜经济)

    长沙市连续3年入选“中国城市夜经济十大影响力城市”,拥有4个国家级夜间文化和旅游消费集聚区。据最新的数据显示,长沙市夜间消费占全天消费比重达52.6%。市政府每年投入近3000万元向长沙音乐厅、梅溪湖大剧院等购买公共服务,推出惠民票价。梅溪湖大剧院演出超过500场、接待80多万观众,长沙音乐厅为市民提供了上千场次视听盛宴,提升夜经济消费品位。长沙国金中心370多家商户中,包含100家首次入湘品牌。

  • 渐变指甲油是怎样的(怎样涂渐变指甲油)

    用棉签蘸卸甲液去除指甲上的指甲油根据理想的长度用指甲刀修剪指甲然后用指甲锉磨平指甲边缘,并给指甲定型用去死皮叉去掉指甲根部的死皮,增加指甲外露的面积,让它看起更修长,我来为大家讲解一下关于渐变指甲油是怎样的?然后用指甲锉磨平指甲边缘,并给指甲定型。底油能起到保护指甲,光滑甲面的作用,方便之后上色。通常底色需要涂两层。另可分两次薄涂,也不要一次性涂上厚厚的一层。

  • 单纯什么意思(单纯词语的含义)

    下面内容希望能帮助到你,我们来一起看看吧!单纯什么意思单纯的字面意思就是简单纯一,不复杂。单纯的好处,也就是自己的精神领域是纯而静的,没有卷入勾心斗角的是非中去。但是单纯的人在社会上很容易被骗,被利用,所以说过于单纯未必是件好事。人最好的境界,不是单纯也不是精明复杂。而是居中,有一颗单纯的内心,而又有一颗玲珑智慧的心。前者愉悦精神领域,后者保证你作为人的生存能力。

  • 2008年北京奥运会圣火是谁点燃的(2008年北京奥运会圣火点燃者介绍)

    2008年北京奥运会圣火是谁点燃的2008年奥运圣火最后点燃的人是体操王子李宁,2008年第29届北京奥运会主火炬手也是最后的火炬手。李宁,壮族,男,生于1963年3月10日,奥运冠军,原中国著名体操队运动员,家乡广西壮族自治区来宾市兴宾区南泗乡人,祖籍广东省佛山市顺德区,曾祖父辈迁至广西谋生,中国著名男子体操运动员。北京奥运会火炬手:北京奥运会火炬手是“和谐之旅”的实践者。

  • 饺子怎么煮不破皮(煮饺子不破皮的技巧)

    饺子怎么煮不破皮?接下来我们就一起去研究一下吧!饺子怎么煮不破皮火候:煮速冻饺子的时候,不宜用大火,它不像是新鲜的水饺,用大火煮也不易破皮。不要过早放,否则易粘在一起,而且放入后,要充分搅拌,这样就不会因为粘在一起而破皮。

  • 舍利子为什么很珍贵(舍利子究竟是什么)

    而另一种舍利子,指的是佛教修行者去世之后留下的遗体,有时是特指骨灰或骨灰中出现的结晶。全身舍利也被称为肉身菩萨。舍利子被认为是佛教修行者通过长年修行,深受戒定慧熏修所得,是修持水平的一个见证,十分难得。此外,也有推测认为牙齿也有可能在燃烧过程中形成舍利子。以此看来,似乎舍利子就是由骨骼形成的可能性十分高。