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

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

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

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

    推荐阅读
  • 金龟婿的前世是什么(为什么会有金龟婿)

    从鱼符的制作材料上,可以初步看出所持有鱼符的官员品阶高低。除此之外,为了更好地区分身份,也方便办事,每位官员的鱼符上面还刻着字儿,比如姓名、任职部门还有官位品级,也都会一一刻上去。更有意思的是,为了防止官员造假,鱼符一般是左右两半的,左边那半鱼符通常放在皇宫内廷,作为对照和验证的依据;右边那半鱼符由官员随身携带,充当官员的“工作牌”或“身份证”。这就要提到唐朝唯一一位女皇帝武则天了。

  • 肉炒芹菜的方法(做炒芹菜的步骤)

    肉炒芹菜的方法芹菜清洗干净后切短,长短约三四厘米为宜,以个人喜好为准。有的芹菜有丝,需要剃掉后切段。新鲜的猪肉或者冷冻的猪肉解冻后切片,如果是冷冻猪肉最好是冷冻半小时左右再切,比较好切成片状,切片后切丝。锅中加入食用油,晃动锅子,让油浸润锅体,减少粘锅的可能性。将肉丝放入锅中翻炒,如果有较肥的肉,先把肥肉放入锅中煸炒,析出油脂,然后将瘦肉放入锅中。肉和芹菜都基本成熟后,放入盐和鸡精翻炒出锅即可。

  • 家中最简单的奶茶制作方法(奶茶的来源)

    奶茶烧开后,再放入适量白糖搅动,搅动至白糖充分溶解后关火,奶茶就做好了。奶茶为蒙古高原游牧民族的日常饮品,蒙古高原是游牧民族的故乡,最正宗的就是蒙古奶茶。蒙古高原和中亚地区的奶茶未改变,当今仍然是日常饮用及待客的必备饮料。奶茶兼具牛奶和茶的双重营养,是家常美食之一,风行世界。奶茶品种包括了奶茶粉,冰奶茶,热奶茶,甜奶茶,咸奶茶等。

  • 泥鳅和黄鳝的区别 泥鳅和黄鳝的区别可以一起吃吗

    泥鳅和黄鳝都是比较重要的经济水产,在各地都有饲养。

  • dnf帝国竞技场有bug果然不出所料(dnf帝国竞技场即将上线)

    需要玩家逐一解决,击杀完怪物后自动进入下回合。上述材料可在NPC贝亚特丽齐处兑换:竞技场NPC荣耀之德洛斯勋章可兑换90级散件升级90级A套史诗的设计图需求525个,周期约为35天左右异面勋章可兑换武器属强附魔宝珠:60个可兑换武器7附魔单属性强化宝珠150个可兑换武器12附魔单属性强化宝珠或10全属性强化宝珠同时需要10个或90个精炼的时空石还可限定一个月兑换一次防具袖珍罐,周期约为30天。

  • 春节几天假期可以出去旅游(是否需要就地过年)

    精准平衡疫情防控与春节团聚的关系,是对各级政府治理能力的一次考验,应做好风险评估,发挥专家作用。应做好相关预案。按照国务院联防联控机制要求,陆地边境口岸城市具体范围由相关省(区、市)根据疫情防控需要确定并及时公布。

  • 蒙娜丽莎的微笑的含义(蒙娜丽莎的微笑意思)

    蒙娜丽莎的微笑意思蒙娜丽莎的微笑喻指迷人的微笑或神秘莫测的微笑《蒙娜丽莎》(MonaLisa)是意大利文艺复兴时期画家列奥纳多·达·芬奇创作的油画,现收藏于法国卢浮宫博物馆该画作主要表现了女性的典雅和恬静的典型形象,塑。

  • 单排用什么英雄上荣耀王者(单排用什么英雄容易上分)

    我们一起去了解并探讨一下这个问题吧!单排用什么英雄上荣耀王者阿轲:阿轲其实是一位非常强势的刺客型英雄,唯一的缺点就是千万不能先手,因为阿轲属于收割型英雄,必须队友把对方打成残血,阿轲收割掉一个英雄或者助攻立刻刷新所有技能并且恢复自身已损失的生命值百分25。带有穿透性装备还有配合几件防御装,让敌方非常头疼,不知道先切掉阿轲还是切掉后排,切阿轲的话对方后排又有连绵不断的输出,不切阿轲的话就会让阿轲收割。

  • 虾仁扒油菜的做法(怎么做虾仁扒油菜)

    虾仁扒油菜的做法食材:大虾20只、油菜400克、生姜5克、大蒜2瓣、香葱2根、料酒5毫升、盐3克、食用油10毫升、白砂糖适量、鸡精适量。生姜,大蒜去皮洗净,分别切姜丝,蒜片,香葱洗净,切成小段。炒锅里倒入适量油,烧至七成热,爆香姜丝,蒜片。然后放入洗净的虾仁,快速翻炒至虾身变色,并调入料酒炒匀,放点水煮到虾熟。最后调入白砂糖,鸡精,盐调味,撒入香葱即可关火出锅,把炒好的虾仁倒入刚装好盘的油菜上就可以了。

  • 真假美猴王哪一集孙悟空已经死了(真假美猴王一集)

    下面希望有你要的答案,我们一起来看看吧!真假美猴王哪一集孙悟空已经死了真假美猴王以后,悟空对六耳猕猴说“俺老孙从来不后悔”,最后对如来彻底失望。悟空死后八戒没有再叫过假悟空猴哥,假悟空也没有叫过八戒“呆子”。