文档章节

xml解析之 sax、dom4j解析

 江南七夜
发布于 2014/09/01 11:19
字数 553
阅读 8
收藏 0
/**
 * sax 解析xml文档指定标签的值
 */
public class Demo4 {

    public static void main(String[] args) throws ParserConfigurationException,
            SAXException, IOException {
        // 1、创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2、得到解析器
        SAXParser sp = factory.newSAXParser();
        // 3、得到读取器
        XMLReader reader = sp.getXMLReader();
        // 4、设置内容处理器
        reader.setContentHandler(new TagValueHandler());
        // 5、读取xml内容
        reader.parse("src/book.xml");
    }

}

// 获取指定标签的值
class TagValueHandler extends DefaultHandler {

    private String currentTag;// 记住当前分析到的是什么标签
    private int needNumber = 2;// 想获取第几个标签的值
    private int currentNumber;// 当前解析到第几个

    @Override
    public void startElement(String uri,
                             String localName,
                             String qName,
                             Attributes attributes) throws SAXException {
        currentTag = qName;
        if("作者".equals(currentTag)){
            currentNumber++;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if ("作者".equals(currentTag)&&currentNumber==needNumber) {
            System.out.println(new String(ch, start, length));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        currentTag = null;
    }

}

dom4j

/**
 * dom4j解析xml
 */
public class Demo5 {

    // 得到第二本书的 <书名 name="xxxxx">javaScript</书名>
    @Test
    public void read() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        Element root = document.getRootElement();
        Element book = (Element) root.elements("书").get(1);
        String value = book.element("书名").getText();
        System.out.println(value);
    }

    // 得到第二本书的 <书名 name="xxxxx">javaScript</书名> name的属性值
    @Test
    public void readAttr() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        Element root = document.getRootElement();
        Element book = (Element) root.elements("书").get(1);
        // String value = book.element("书名").attribute("name").getValue();
        String value = book.element("书名").attributeValue("name");
        System.out.println(value);
    }

    // 在第一本书添加一个售价
    @Test
    public void add() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        Element book = document.getRootElement().element("书");
        book.addElement("售价").addText("209元");
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),
                                                                "gb2312"),
                                         format);
        writer.write(document);
        writer.close();
    }

    // 在第一本书指定位置添加一个售价 更改List集合的顺序
    @Test
    public void add2() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));
        Element book = document.getRootElement().element("书");
        List list = book.elements();
        Element price = DocumentHelper.createElement("售价");
        price.setText("209元");
        list.add(2, price);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),
                                                                "gb2312"),
                                         format);
        writer.write(document);
        writer.close();
    }

    @Test
    public void delete() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));

        Element price = document.getRootElement().element("书").element("售价");
        price.getParent().remove(price);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),
                                                                "gb2312"),
                                         format);
        writer.write(document);
        writer.close();
    }

    @Test
    public void update() throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/book.xml"));

        Element book = (Element) document.getRootElement().elements("书").get(1);
        book.element("作者").setText("活立木");
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),
                                                                "gb2312"),
                                         format);
        writer.write(document);
        writer.close();
    }
}


© 著作权归作者所有

上一篇: 增强for循环
粉丝 0
博文 3
码字总数 2712
作品 0
镇江
私信 提问
JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较

JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较 1.各种方式的详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的 官方W3C标准。DOM是以层次结构组织...

_xiaotudou
2014/03/28
253
0
为什么说 SAX 比 DOM4J 解析 xml 性能低?

目前公认的XML解析器性能最好的是 DOM4J 我的疑问: DOM4J 是基于DOM文档树结构来进行解析的,来解析xml文件之前,会将整个 XML文档装载入内存形成完整的 DOM数结构,然后进行 DOM 节点的读取...

山哥
2012/05/23
4.2K
7
四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

Henrykin
2016/11/03
55
0
xml java应用(DOM、SAX、JDOM、DOM4j)简介比较

dom是解析xml的底层接口之一(另一种是sax) 而jdom和dom4j则是基于底层api的更高级封装 dom是通用的,而jdom和dom4j则是面向java语言的 DOM 是用与平台和语言无关的方式表示 XML 文档的官方 ...

liangyx
2012/12/20
197
0
XML解析(DOM、SAX、JDOM和DOM4J)

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

拷贝忍者卡卡习
2017/01/18
31
0

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
10分钟前
3
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
16分钟前
2
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
23分钟前
2
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
26分钟前
2
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部