Java解析xml
1. 什么是xml ?
2. 导入依赖
本方案中使用DOM4J + xpath 解析xml文件
<!-- dom4j解析xml -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- xpath的依赖 -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
3. 案例文件
<?xml version="1.0" encoding="UTF-8"?>
<map-reduce>
<jobName type="MR">测试MR参数使用</jobName>
<jobPath>/opt/soft/cdp_job_jar/测试MR参数使用_20220505112618.jar</jobPath>
<configuration/>
<job>
<setMapperClass>xx.xxx.xxxxxx.mr.TestMR</setMapperClass>
<setOutputFormatClass>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</setOutputFormatClass>
<setMapOutputValueClass>org.apache.hadoop.io.LongWritable</setMapOutputValueClass>
<setMapOutputKeyClass>org.apache.hadoop.io.Text</setMapOutputKeyClass>
<setInputFormatClass>org.apache.hadoop.mapreduce.lib.input.TextInputFormat</setInputFormatClass>
</job>
<input>/user/hdfs/rawdata/gn-20220411.log</input>
<output>/user/hdfs/rawdata/test-mr-1</output>
</map-reduce>
4. 案例代码
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* 解析xml的四种方式
* 1. DOM(Document Object Model) (JDK已经自带jar包,不需要额外导入!)
* 2. Sax(Simple API for XML) (JDK已经自带jar包,不需要额外导入!)
* 3. DOM4J 解析 (需要导入依赖包) 推荐使用
* 4. JDOM(Java-based Document Object Model)
*
* xpath
* XPath 是一门在 XML 文档中查找信息的语言。
* 使用路径表达式来选取 XML 文档中的节点或者节点集。
* 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
*
* 路径表达式
* //节点名 选取指定节点 一般使用 selectSingleNode
* /节点名/* 选取指定节点下面的所有子节点 一般使用selectNodes
*
*/
public class 解析xml {
// 使用DOM4J 结合 xpath 解析xml文件
public static void main(String[] args) throws DocumentException {
// 1. 创建SAXReader 用于读取加载xml文件
SAXReader saxReader = new SAXReader();
// 2. saxReader 读取xml文件
Document document = saxReader.read(new File(解析xml.class.getClassLoader().getResource("testxml.xml").getPath()));
// 3. 使用xpath获取值
// 获取任务名 selectSingleNode 选取单个节点
// 通配符 //节点名
// 返回的是一个Node , 获取其中内容使用 getText方法
Node jobNameNode = document.selectSingleNode("//jobName");
String jobName = jobNameNode.getText();
System.out.println("任务名称 : " + jobName);
// 选取属性在节点对象上 使用 @属性名获取属性值
String type = jobNameNode.selectSingleNode("@type").getText();
System.out.println("任务类型 : " + type);
// 获取jar包路径
String jobPath = document.selectSingleNode("//jobPath").getText();
System.out.println("任务jar包位置: " + jobPath);
// 获取job的配置, selectNodes 获取多个节点信息, 是指选取指定节点下的子节点的内容
List<Node> jobnodes = document.selectNodes("//job/*");
for (Node jobnode : jobnodes) {
System.out.println(jobnode.getText());
}
// 获取输入参数路径
String input = document.selectSingleNode("//input").getText();
System.out.println("输入文件路径 : " + input );
// 获取输出参数路径
String output = document.selectSingleNode("//output").getText();
System.out.println("输出文件路径 : " + output);
}
}
5. 解析结果
任务名称 : 测试MR参数使用
任务类型 : MR
任务jar包位置: /opt/soft/cdp_job_jar/测试MR参数使用_20220505112618.jar
xx.xxx.xxxxxx.mr.TestMR
org.apache.hadoop.mapreduce.lib.output.TextOutputFormat
org.apache.hadoop.io.LongWritable
org.apache.hadoop.io.Text
org.apache.hadoop.mapreduce.lib.input.TextInputFormat
输入文件路径 : /user/hdfs/rawdata/gn-20220411.log
输出文件路径 : /user/hdfs/rawdata/test-mr-1
欢迎大家留言一起讨论学习!