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

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

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

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

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

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

    推荐阅读
  • 红油保鲜方法(红油辣椒的做法)

    红油保鲜方法红油保鲜方法:将红油装入容器内之后,一定要将容器密封,避免直接和空气接触,这样才能够保证原汁原味。在阳光的照射下,会使内部的温度升高,从而产生发酵,不仅影响口感,还会缩短保质期,所以避开阳光直射,放在阴凉处保存也是方法之一。红油辣椒的做法:辣椒面放入耐热的盆中,加少许的花椒面,一个八角,少许的芝麻。锅内加油,烧到5成热,加入少许的油入盆中,使劲搅均匀。盖上盖,静置24小时左右,即成。

  • 恭王府福字来历(恭王府福字来历是怎样)

    恭王府福字来历位于北京恭王府花园的一块石碑,花园一进门有一个“福”字碑,这个碑上的福字是康熙御笔。康熙帝效仿古人为祖母请福续寿,在沐浴斋戒了三天之后,一气呵成了这幅绝世的珍品,还加盖了“康熙御笔之宝”印玺,意思是“鸿运当头、福星高照,镇天下所有妖邪”。孝庄皇太后收到这份大礼后不久,就恢复了健康。她特意让工匠将这个福字刻为石碑,成了皇家的宝贝。所以这个福字被称为“天下第一福”。

  • 长恨此身非我有何时忘却营营这句话是什么意思(长恨此身非我有何时忘却营营出处)

    长恨此身非我有何时忘却营营这句话是什么意思?家童鼻息已雷鸣。轻轻地敲了敲门,里面全不回应,只好独自倚着藜杖倾听江水奔流的吼声。经常愤恨这个躯体不属于我自己,什么时候能忘却为功名利禄而奔竞钻营!趁着这夜深、风静、江波坦平,驾起小船从此消逝,泛游江河湖海寄托余生。

  • 军绿色搭配的高级穿法(我就服这三种)

    军绿色大衣+白色毛衣+黑色小脚裤+黑色帆布鞋,配色简单大方,小脚裤开叉的设计很有个性,灰色贝雷帽和帆布包,增添了学院文艺气质!军绿色配黑色,军绿色遇到同样低调的黑色,比较显瘦也更显气质!军绿色波点连衣裙+黑色打底裤袜+黑色鞋子,气质古典优雅。有些沉闷的军绿色搭配青春气息的牛仔蓝,气质立刻变得休闲活泼起来,而且十分减龄。短款军绿色外套+牛仔小脚裤+黑色短靴,青春休闲中不失优雅。

  • 春运火车票明起开售(春运火车票明日开售)

    旅客可通过12306铁路官网和12306手机客户端以及拨打订票电话等方式购买车票。值得注意的是,大家使用的加速包并不能拥有优先购票权,无论是哪款购票软件都要在铁路12306购票系统排队。12306提醒,如遇所需车次、席别无票,可在线排队候补。在进站口对乘车旅客进行100%北京健康宝健康码查验,绿码通行,红码和黄码劝返。目前,在购票时除了12306网站和12306手机客户端可以进行手机号预留登记外,火车站的自助售取票机上也可以进行手机号预留登记。

  • 用自己的话说甲骨文(甲骨文我萌起来)

    甲骨文我萌起来图为赵无极《有月亮的风景》画家从甲骨文、中国青铜铭文中汲取充满幻想玄妙氛围的点与线的作品你看出来了么?一说起甲骨文总会联想到那些晦涩难懂的古文像这样:或者这样:而上述这些似乎也只有专家们才能看得懂!其。

  • 不锈钢生锈了如何处理(不锈钢生锈后怎么处理才不生锈)

    2、百洁布用水打湿,沾取蚊香灰在生锈发黄的位置反复擦拭,可以反复沾取清水和香灰。

  • 轮胎侧边划伤还可以使用吗(学会判断轮胎刮擦的严重程度)

    最多保证车子不和人家碰撞之外,其他的事情却是无法保证的,比如轮子敢说从来都不会在靠边停车的时候与“道牙子”亲密接触?所以呢,不少车子的轮胎侧面,多多少少都会遭遇和“道牙子”相擦而导致刮伤的事情。他们虽然看不见,但却时时刻刻在为车主的行车安全接近全力的工作。成了这片橡胶的“骨架”。在轮胎行业里,橡胶的骨架不是帆布,而是比帆布更强的东西。因为后轮爆胎一般不会导致方向的失控。

  • 东北角是什么位(东北角的具体方位)

    下面内容希望能帮助到你,我们来一起看看吧!东北角是什么位东北角属艮位,在八卦之中,艮是山石的根本,它在风水学中,也主管着我们的财运和事业运。而且在家居风水中,艮位主要影响着的是小孩子的运势,如果家中有小孩子存在,您要注意好东北角的风水了,不然很容易影响小孩子的寿运和学业。

  • 长期用激素雾化的危害(当心造成家庭污染)

    法国食品、环境、职业健康与安全署:使用精油雾化器可能引起过敏法国食品、环境、职业健康与安全署近日发布提醒称,精油香薰机、雾化器等精油扩散器可能成为家庭污染源。然而,该报告称,大多数人症状“并不严重,当人们不再接触这些化学物质后,症状迅速减轻”。之前,该机构曾建议孕妇和哺乳期妇女以及患有呼吸系统疾病的人避免使用精油类芳香剂。该机构强调,精油扩散器“排放的挥发性有机化合物可能是家庭污染源”。