1.XML解析的方式介绍
在日常开发中常见的XML解析方式有如下两种:
1.DOM解析
DOM解析要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。
1.优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作。
2.缺点:如果XML文件过大,可能会导致内存溢出。
2.SAX解析
SAX解析是一种更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以时间驱动的方式进行具体的解析,每解析一行都会触发一个事件。
1.优点:不会出现内存溢出的问题,可以处理大文件。
2.缺点:只能读,不能写。
3.常见的解析XML类库
解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。具体如下所示:
1.dom4j:比较简单的XML解析类库;
2.Jsoup:功能强大的DOM方式解析的类库,尤其对HTML的解析更加方便,所以可以使用Jsoup来爬取网页的数据。
2.使用dom4j解析XML
1.创建普通的Maven项目
打开IDEA编译器,在导航栏选择文件,接下来点击新建 ,然后选择项目。点击后出现如图所示的界面:
选择创建一个普通的Maven项目,直接点击下一步即可。接下来自定义项目的名称,位置以及工作坐标。具体如下所示:
点击完成后,IDEA便开始加载项目。
2.导入dom4j的依赖
在加载后的项目下,找到pom.xml文件,将依赖导入其中,具体依赖如下所示:
<dependencies><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.1</version></dependency></dependencies>
3.使用dom4j解析user.xml
使用dom4j解析user.xml的步骤如下所示:
在项目的resource目录下创建user.xml文件;
在下面user.xml文件中,users是根标签,根标签是全局唯一的;
在根标签下有两个user子标签,每一个user子标签都有两个属性,一个是country,另一个是source;在user标签下同样有三个子标签,分别是id,name以及password标签,具体如下所示:
1.编写user.xml文件
<?xml version="1.0" encoding="UTF-8" ?><!--文档声明
XML的文档声明是可选的,也就是可以不写,但是日常生活开发中大家都会写
XML文档声明如果写了,它必须放在XML文档的第一行第一列,必须以<?xml开头 以?>结尾,而且必须包含两个属性
一个是version,表示XML的版本
一个是encoding,表示XML的编码
--><!--
元素是XML的重要组成部分,元素也被称为标签
每个XML文件必须要有一个根标签
标签有开始标签和结束标签组成,开始标签和结束标签可以写标签,也可以是文本字符串
标签可以嵌套使用,但是不能随便嵌套
标签名必须准守命名规则和命名规范
--><!--
属性是标签的组成部分,属性只能定义在开始标签中,不能定义在结束标签中
属性定义的格式:属性名=属性值,属性值需要使用""包含起来
开始标签中可以定义多个属性,但是多个属性的属性名不能相同
属性名必须准守命名规则和命名规范
--><users><userid="10001"country="Chinese"source="Android"><id>10001</id><name>admin</name><password>111111</password></user><userid="10002"country="Chinese"source="ios"><id>10002</id><name>tony</name><password>666666</password></user></users>
2.创建解析器对象
//创建解析器对象SAXReader saxReader=newSAXReader();
3.使用解析器对象读取XML文档生成Document对象
//根据user.xml文档生成Document对象Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("users.xml"));
4.根据Document对象获取XML的元素(标签)信息
Dom4j的常用API说明:
方法操作Element getRootElement();获取XML文件的根节点String getName();返回标签的名称List < Element > elements();获取标签所有的子标签String arrtributeVallue(String name) ;获取指定属性名称的属性值String getText();获取标签的文本String elementText(String name);获取指定名称的子标签的文本,返回子标签文本的值
具体的Dom4j解析的具体测试代码如下所示:
importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importjava.util.List;publicclassDom4jParseUserXmlTest{publicstaticvoidmain(String[] args){//创建解析器对象SAXReader saxReader=newSAXReader();try{Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("users.xml"));Element rootElement = document.getRootElement();System.out.println("1.------->users.xml文件的根节点的名字是:"+rootElement.getName());System.out.println("2.------->获取根标签users的子标签列表");List<Element> usersSubElementList = rootElement.elements();for(Element userElement : usersSubElementList){System.out.println("users标签的子标签的名字是"+ userElement.getName());System.out.println("users标签的子标签的id属性值是"+ userElement.attributeValue("id"));System.out.println("users标签的子标签的country属性值是"+ userElement.attributeValue("country"));System.out.println("3.------->获取user的子标签列表");List<Element> userSubElementList = userElement.elements();for(Element userSubElement : userSubElementList){System.out.println("user标签下的子标签名为:"+userSubElement.getName());System.out.println("user标签下的子标签文本是:"+userSubElement.getText());}}//获取users标签的第一个user标签Element firstUserElement = rootElement.element("user");//第一个user标签的子标签password的文本内容String password = firstUserElement.attributeValue("password");System.out.println(password);}catch(DocumentException e){
e.printStackTrace();}}}
3.dom4j结合XPath解析XML
1.Dom4j集成XPath
在pom.xml导入Xpath对应的依赖即可,具体如下所示:
<dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version></dependency>
2.Dom4j提供基于XPath的API
方法操作Node selectSingleNode(String xpathExpression);根据XPath表达式获取单个标签(元素/节点)List < Node > selectNodes(String xpathExpression)根据XPath表达式获取多个标签(元素/节点)
3.XPath的语法
绝对路径表示方式:
以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如 /元素/子元素/子子元素……;
相对路径的表达方式:
相对于当前节点的元素继续查找的节点,不以/开头,…/表示上一个元素,**./表示当前元素**;
全文搜索路径方式:
例如//子元素,//子元素//子子元素,//子元素/子子元素。
注意:
//表示无论中间有多少层,直接获取所有子元素所有满足条件的元素
/表示只找一层
谓语(条件筛选形式)
例如 : //元素[@attr1=value]
具体对应的每一种方式的Java测试程序如下所示:
importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.Node;importorg.dom4j.io.SAXReader;importjava.util.List;publicclassDom4jXPathParseUserXmlTest{publicstaticvoidmain(String[] args){SAXReader saxReader=newSAXReader();try{Document document= saxReader.read(Dom4jXPathParseUserXmlTest.class.getClassLoader().getResource("users.xml"));//拿到第一个用户的密码System.out.println("1.------>使用绝对路径方式来查找元素");Element element =(Element) document.selectSingleNode("/users/user/password");String password = element.getText();System.out.println(password);System.out.println("2.------>使用相对路径查找元素");//element是当前获取的password元素Element name =(Element) element.selectSingleNode("../name");System.out.println("第一个用户的姓名为"+name.getText());System.out.println("3.------>使用全局搜索的方式");//获取所有的id元素的文本List<Node> idNodeList = document.selectNodes("//id");for(Node node : idNodeList){Element idElement=(Element) node;System.out.println(idElement.getText());}System.out.println("4.------>谓语形式");//获取id=10002的用户信息Element idElement =(Element) document.selectSingleNode("//user[@id='10002']");List<Element> elements = idElement.elements();for(Element element1 : elements){System.out.println(element1.getName()+"="+element1.getText());}}catch(DocumentException e){
e.printStackTrace();}}}
版权归原作者 散一世繁华,颠半世琉璃 所有, 如有侵权,请联系我们删除。