- 0. 待解析的xml文件
- 1. dom4j方式
- 1. 使用dom4j需要导入第三方jar包
- 2. 常见方法
- 3. 代码
- 2. SAX解析xml
- 1. 说明
- 2. 代码
- 3. 源代码地址
1. dom4j方式 1. 使用dom4j需要导入第三方jar包张三 男 打篮球 李四 女 跳绳
2. 常见方法dom4j dom4j1.6.1
常见方法
1). document.getRootElement() 获取根元素
2). element.attributevalue("该标签属性名字") 获取该标签元素的属性值
3). element.getText() 获取标签内的值,不包括子元素标签内的值
1. xxx 即获取xxx
2.
xxx
kkk
即获取 xxx
4). element.getName() 获取标签名字
5). element.getStringValue() 获取标签内全部值,包括子元素标签内的值
6). element.getData() 同上
7). element.elementText("子标签名字") 获取子标签内的值
8). element.element("子标签名字") 获取子标签元素
9). element.attributevalue("该标签属性名字") 获取该标签元素的属性值
3. 代码
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String id;
private String name;
private String sex;
private String hobby;
}
public class dom4jTest {
public static void main(String[] args) throws Exception{
// 1.生成解析对象
SAXReader reader = new SAXReader();
// 2.读取文件
document read = reader.read(dom4jTest.class.getClassLoader().getResourceAsStream("User.xml"));
// 3.获取xml文件的root根元素
Element rootElement = read.getRootElement();
// 4.通过根元素获取子元素
List elements = rootElement.elements("User");
// 5.遍历获取标签内元素 并封装为对象
for (Element element : elements) {
System.out.println(User.builder()
.id(element.attributevalue("id"))
.name(element.elementText("name"))
.sex(element.elementText("sex"))
.hobby(element.elementText("hobby"))
.build());
}
}
}
结果: User(id=2021007, name=张三, sex=男, hobby=打篮球) User(id=2021020, name=李四, sex=女, hobby=跳绳)2. SAX解析xml 1. 说明
使用的是SAX解析xml文件:
1. 常用方法:
1). SAXParserFactory.newInstance() 创建SAXParser的工厂
2). saxParserFactory.newSAXParser() 生成SAXParser 对象
3). saxParser.parse('文件流', 处理的方式handle) 解析xml文件
2. Handler说明
1). handler里面常重写三个方法:
startElement:解析开始标签
endElement:解析结束标签
characters:处理标签内文本值
2). 执行流程如下:
1. 当解析的xml文件如下的时候:
------->startElement方法负责处理这个
张三-----> characters方法处理这个
------> endElement方法处理这个
2. 记得 解析过程就是,开始标签--->内容---->结束标签
3. 若解析的xml文件如下:
------->startElement方法负责处理这个
------>startElement方法负责处理这个
张三-----> characters方法处理这个
------> endElement方法处理这个
------> endElement方法处理这个
3). 各个方法内参数说明
qName 是标签名字
attributes 是该标签的属性
char[] ch 是标签内的文本值
2. 代码
public class SAX_test {
public static void main(String[] args) throws Exception {
// 1. 创建解析对象的工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 2. 设置解析xml的标准(自己点进入XMLConstants 就会懂了)
saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
// 3. 生成解析的对象
SAXParser saxParser = saxParserFactory.newSAXParser();
List userList = new ArrayList<>();
// 4. 解析xml
saxParser.parse(new ClassPathResource("User.xml").getInputStream(), new UserHandler(userList));
userList.forEach(System.out::println);
}
// 自定义解析处理器
private static class UserHandler extends DefaultHandler {
private List userList;
private User user;
private String value;
public UserHandler(List userList) {
this.userList = userList;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 起始标签处理
if ("User".equals(qName)) {
user = new User();
user.setId(attributes.getValue("id"));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// 结束标签处理
if ("User".equals(qName)) {
userList.add(user);
}
if ("name".equals(qName)) {
user.setName(value);
}
if ("sex".equals(qName)) {
user.setSex(value);
}
if ("hobby".equals(qName)) {
user.setHobby(value);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 标签内文本处理
value = new String(ch, start, length)
.trim();
}
}
}
3. 源代码地址
https://gitee.com/Lgold/learning/tree/dev/src/main/java/com/king/learning/AnalyseXml



