1 XML介绍和解析方式
「XML解析介绍」
XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。
2 dom4j解析XML
2.1 dom4j概述
Dom4j是一个组织,针对xml解析,提供解析器,dom4j后来独立成一个公司,他的性能比jdom更加强大。
我们如果想要使用Dom4j,需要引入dom4j提供依赖接口。在Maven项目中,导入依赖包很简单、容易。
2.2 引入dom4j依赖
首先在maven依赖仓库找到dom4j的依赖,然后将他拷贝到我们的pom.xml中。
「查找依赖包」
「导入到pom文件」
pom.xml
<dependencies> <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency> </dependencies>
2.3 使用dom4j查询xml
首先创建persons.xml,我们还是使用上章节的文件。然后创建一个Dom4jParserXmlTest.java类。
「步骤」
1、创建解析器
2、获取Document对象
3、获取根元素
4、解析操作
public static void main(String[] args) { String xmlPath = "./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml"; // 1、创建解析器 SAXReader saxReader = SAXReader.createDefault(); try { // 2、获取Document对象 Document document = saxReader.read(new File(xmlPath)); // 3、获取根元素 Element rootElement = document.getRootElement(); // 4、解析操作 System.out.println("输出全部xml:" + rootElement.asXML()); } catch (DocumentException e) { throw new RuntimeException(e); } }
执行操作之后,我们可看到如下信息:
<persons> <person sid="001" uid="QS#123"> <name>张小帅</name> <sex>男</sex> <age>28</age> </person> <person sid="002"> <name>刘晓萌</name> <sex>女</sex> <age>21</age> </person> <person sid="003"> <name>王老四</name> <sex>男</sex> <age>38</age> </person> </persons>
Dom4j的常用API说明:
方法 | 操作 | |
Element getRootElement(); | 获取XML文件的根节点 | |
String getName(); | 返回标签的名称 | |
List < Element > elements(); | 获取标签所有的子标签 | |
String arrtributeVallue(String name) ; | 获取指定属性名称的属性值 | |
String getText(); | 获取标签的文本 | |
String elementText(String name); | 获取指定名称的子标签的文本,返回子标签文本的值 |
2.4 新增元素
Elementsex1=p1. addElement("content");
注意⚠️:这个操作与之前所说的操作和方法不一样,之前用jip时需要先创建,但现在不需要创建,直接在下面添加元素。
2.5 新增元素的文本
sex1.setText("测试");
2.6 回写到xml
「方法一」
OutputFormatformat=outputFormat.createPrettyPrint();
注意⚠️:可以有缩进的效果。这个方法是静态的,直接用outputFormat.createPrettyPrint进行格式化。
「方法二」
OutputFormatformat=outputFormat.createCompactFormat();
这个方法有压缩的效果,一般运用在计算机里,企业用第一种方法。
XMLWriterxmlwriter=newXMLWriter(newFileoutputstream("src/p1.xml"),format); xmlWriter.write(document);
把内存中的数写入到文件里去,括号里传入document,这样就把文档传入到xml文件里去。
xmlWriter.close();
关流,注意流一旦打开就要关闭
3 dom4j结合XPath解析XML
3.1 引入jaxen依赖
同样,依赖第三方jar时,我们需要引入依赖包。
<!--https://mvnrepository.com/artifact/jaxen/jaxen --><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version></dependency>
3.2 使用XPath解析xml
Dom4j提供基于XPath的API
方法 | 操作 | |
Node selectSingleNode(String xpathExpression); | 根据XPath表达式获取单个标签(元素/节点) | |
List < Node > selectNodes(String xpathExpression) | 根据XPath表达式获取多个标签(元素/节点) |
「步骤」
1、获取解析器
2、获取Document对象
3、获取元素解析
publicstaticvoidmain(String[] args) { StringxmlPath="./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml"; SAXReadersaxReader=newSAXReader(); try { Documentdocument=saxReader.read(newFile(xmlPath)); // 拿到第一个用户的姓名System.out.println("1.------>使用绝对路径方式来查找元素"); Elementelement= (Element) document.selectSingleNode("/persons/person/name"); StringnameEle=element.getText(); System.out.println(nameEle); System.out.println("2.------>使用相对路径查找元素"); // element是当前获取的name元素Elementname= (Element) element.selectSingleNode("../name"); System.out.println("第一个用户的姓名为"+name.getText()); System.out.println("3.------>使用全局搜索的方式"); //获取所有的id元素的文本List<Node>idNodeList=document.selectNodes("//sid"); for (Nodenode : idNodeList) { ElementidElement=(Element) node; System.out.println(idElement.getText()); } System.out.println("4.------>谓语形式"); //获取id=10002的用户信息ElementidElement= (Element) document.selectSingleNode("//person[@sid='002']"); List<Element>elements=idElement.elements(); for (Elementelement1 : elements) { System.out.println(element1.getName()+"="+element1.getText()); } } catch (DocumentExceptione) { e.printStackTrace(); } }
「解析后的结果」
1.------>使用绝对路径方式来查找元素 张小帅 2.------>使用相对路径查找元素 第一个用户的姓名为张小帅 3.------>使用全局搜索的方式 4.------>谓语形式 name=刘晓萌 sex=女 age=21