栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

XML常用解析方式(dom4j方式、SAX方式)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XML常用解析方式(dom4j方式、SAX方式)

文章目录
  • 0. 待解析的xml文件
  • 1. dom4j方式
    • 1. 使用dom4j需要导入第三方jar包
    • 2. 常见方法
    • 3. 代码
  • 2. SAX解析xml
    • 1. 说明
    • 2. 代码
  • 3. 源代码地址

0. 待解析的xml文件

    
        张三
        
        打篮球
    
    
        李四
        
        跳绳
    

1. dom4j方式 1. 使用dom4j需要导入第三方jar包

    dom4j
    dom4j
    1.6.1

2. 常见方法
	 	常见方法
            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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571909.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号