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

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

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

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

    推荐阅读
  • 一次吃多少枸杞才会有效呢(每天吃点枸杞好处多多)

    每天吃点枸杞好处多多上了岁数之后,很多人都开始养生,俗话说,人到中年不得已,保温杯里泡枸杞,喝枸杞水也是很多中年人养生的第1步枸杞的吃法多种多样,既能直接嚼着吃,还能泡水喝,同样还可以炖汤熬粥喝,枸杞也是比较常用的一种养。

  • 三七粉怎样储存(三七粉如何存储)

    放在通风干燥阴凉之处避免发霉只要保证不回潮、不霉变,保质期最低2年,我来为大家讲解一下关于三七粉怎样储存?三七粉怎样储存放在通风干燥阴凉之处。三七的储存不能放冰箱,必须密封,放阴凉干燥地方。家庭贮藏三七要注意防虫蛀。一是可与白茅根饮片同贮于瓷缸内,白茅根为三七的2~3倍;二是将三七包好,与细辛共放一处。药物都需要尽快使用,否则还是会有活性药物成分流失。

  • 混凝土墙面怎么做涂料 混凝土墙面怎么做涂料好

    2、混凝土墙面不能直接上漆,需打磨平整,一般建议用石膏找平后打上腻子粉再刷漆。

  • 地读音与组词(地字意思和组词)

    天地之始地字意思,我来为大家科普一下关于地读音与组词?以下内容希望对你有帮助!

  • 南京元旦火车票退票手续费(南京铁路退票手续费)

    开车前48小时~8天期间内,改签或变更到站至距开车8天以上的其他列车,又在距开车8天前退票的,仍核收5%的退票费办理车票改签或“变更到站”时,新车票票价低于原车票的,退还差额,对差额部分核收退票费并执行现行退票费标准。上述计算的尾数以5角为单位,尾数小于2.5角的舍去、2.5角及以上且小于7.5角的计为5角、7.5角及以上的进为1元。退票费最低按2元计收。

  • 电抗器原理讲解(史上最全电抗器知识干货)

    电抗器也叫电感器,一个导体通电时就会在其所占据的一定空间范围产生磁场,所以所有能载流的电导体都有一般意义上的感性。然而通电长直导体的电感较小,所产生的磁场不强,因此实际的电抗器是导线绕成螺线管形式,称空心电抗器;有时为了让这只螺线管具有更大的电感,便在螺线管中插入铁心称铁心电抗器。1电抗器的安装要点:2电抗器的运行维护项目:3电抗器故障应处理方法:

  • 海螺怎么做的呢(水煮海螺的做法)

    我们一起去了解并探讨一下这个问题吧!海螺怎么做的呢材料:海螺,葱段,姜片,姜汁,白醋,芥末。新鲜的海螺在海水中吐净泥沙。海螺刷洗干净,冷水下锅。洗好的海螺添加刚没过的水,放入葱段、姜片。大火煮开,水开后,大海螺煮10-15分钟,中小海螺煮3-5分钟。添加一点点盐,即可出锅。

  • 德国多功能指甲剪(国产指甲钳厉害了)

    值得一提的,跟某品牌电动指甲刀相比,爱魔电动指甲剪不要太优秀。最后,爱魔电动指甲剪一共两档可调节。爱魔电动指甲剪充满一次电,可提供指甲修剪60次。爱魔指甲剪金属电镀外壳不显廉价,红色、黑色或粉色多款配色可选,百变精致,不仅适合自己使用,当礼物赠予朋友也不差,超实用的礼物。爱魔电动指甲剪闭眼式剪甲,不卡指甲,快准狠一刀切。爱魔可以让女生修完各式各样的指甲,并且修完即可直接上甲油。

  • win10禁用shift切换输入法(win10怎么禁用shift切换输入法)

    演示机型:华为MateBookX系统版本:win10win10禁用shift切换输入法共有3步,以下是华为MateBookX中禁用shift切换输入法的具体操作步骤:操作/步骤1找到输入法右键选设置在电脑屏幕右下角的任务设置栏中找到输入法,右键然后选择设置。2选择按键选项在设置页面中选择按键选项。3切换输入法按键在按键页面中将“中/英文模式切换”下方的“shift”改成“无”即可。END总结:以上就是关于win10禁用shift切换输入法的具体操作步骤,希望对大家有帮助。

  • 笔记本电脑耗电快怎么解决(笔记本耗电快怎么办)

    笔记本电脑耗电快怎么解决?以下内容希望对你有帮助!调整屏幕的亮度:屏幕的亮度也和电量的使用有很大的关系,我们可以使用笔记本键盘上的亮度调节按钮来进行调节亮度设置的低一点,自然用电就会少一些。电池本身的续航:当然,我们还要参考本来这个电脑的续航时间,如果本来的电池续航时间为3个小时的话,那么一般来说2-3小时的使用都没有问题,如果电量使用起来特别快,那么需要送修专业部门维修或更换电池。