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
代码语言:javascript复制 <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、解析操作
代码语言:javascript复制 public static void main(String[] args) {
String xmlPath = "./tool-jdk8/src/main/java/com/xxx/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);
}
}
执行操作之后,我们可看到如下信息:
代码语言:javascript复制<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 新增元素
代码语言:javascript复制Element sex1 = p1. addElement("content");
注意⚠️:这个操作与之前所说的操作和方法不一样,之前用jip时需要先创建,但现在不需要创建,直接在下面添加元素。
2.5 新增元素的文本
代码语言:javascript复制sex1.setText("测试");
2.6 回写到xml
「方法一」
代码语言:javascript复制OutputFormat format = outputFormat.createPrettyPrint();
注意⚠️:可以有缩进的效果。这个方法是静态的,直接用outputFormat.createPrettyPrint进行格式化。
「方法二」
代码语言:javascript复制OutputFormat format =outputFormat.createCompactFormat();
这个方法有压缩的效果,一般运用在计算机里,企业用第一种方法。
代码语言:javascript复制XMLWriter xmlwriter = new XMLWriter(new Fileoutputstream("src/p1.xml"),format);
xmlWriter.write(document);
把内存中的数写入到文件里去,括号里传入document,这样就把文档传入到xml文件里去。
代码语言:javascript复制xmlWriter.close();
关流,注意流一旦打开就要关闭
3 dom4j结合XPath解析XML
3.1 引入jaxen依赖
同样,依赖第三方jar时,我们需要引入依赖包。
代码语言:javascript复制<!-- 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、获取元素解析
代码语言:javascript复制public static void main(String[] args) {
String xmlPath = "./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml";
SAXReader saxReader=new SAXReader();
try {
Document document= saxReader.read(new File(xmlPath));
// 拿到第一个用户的姓名
System.out.println("1.------>使用绝对路径方式来查找元素");
Element element = (Element) document.selectSingleNode("/persons/person/name");
String nameEle = element.getText();
System.out.println(nameEle);
System.out.println("2.------>使用相对路径查找元素");
// element是当前获取的name元素
Element name = (Element) element.selectSingleNode("../name");
System.out.println("第一个用户的姓名为" name.getText());
System.out.println("3.------>使用全局搜索的方式");
//获取所有的id元素的文本
List<Node> idNodeList = document.selectNodes("//sid");
for (Node node : idNodeList) {
Element idElement=(Element) node;
System.out.println(idElement.getText());
}
System.out.println("4.------>谓语形式");
//获取id=10002的用户信息
Element idElement = (Element) document.selectSingleNode("//person[@sid='002']");
List<Element> elements = idElement.elements();
for (Element element1 : elements) {
System.out.println(element1.getName() "=" element1.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
「解析后的结果」
代码语言:javascript复制1.------>使用绝对路径方式来查找元素
张小帅
2.------>使用相对路径查找元素
第一个用户的姓名为张小帅
3.------>使用全局搜索的方式
4.------>谓语形式
name=刘晓萌
sex=女
age=21