8月19号 XML2

JDOM解析原理:
1.(转移项目时夹包不会移动)导入夹包Build Path-》add external archives-》jdom-2.0.jar以上
2.一起移动的方法,项目中创建一个文件夹lib,然后将jar包复制进去,之后按1中的操作进行
org.jdom2的document对象
首先也要创建一个book类:
    public class JDOMTest {
        private static ArrayList booksList = new ArrayList();
        public static void main(String[] args) {
            // 进行对books.xml文件的JDOM解析
            // 准备工作
            // 1.创建一个SAXBuilder的对象
            SAXBuilder saxBuilder = new SAXBuilder();
            InputStream in;
            try {
                // 2.创建一个输入流,将xml文件加载到输入流中
                in = new FileInputStream("src/res/books.xml");
                InputStreamReader isr = new InputStreamReader(in, "UTF-8");
                // 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
                Document document = saxBuilder.build(isr);
                // 4.通过document对象获取xml文件的根节点
                Element rootElement = document.getRootElement();
                // 5.获取根节点下的子节点的List集合
                List bookList = rootElement.getChildren();
                // 继续进行解析
                for (Element book : bookList) {
                    Book bookEntity = new Book();
                    System.out.println("======开始解析第" + (bookList.indexOf(book) + 1)
                            + "书======");
                    // 解析book的属性集合
                    List attrList = book.getAttributes();
                    // //知道节点下属性名称时,获取节点值
                    // book.getAttributeValue("id");
                    // 遍历attrList(针对不清楚book节点下属性的名字及数量)
                    for (Attribute attr : attrList) {
                        // 获取属性名
                        String attrName = attr.getName();
                        // 获取属性值
                        String attrValue = attr.getValue();
                        System.out.println("属性名:" + attrName + "----属性值:"
                                + attrValue);
                        if (attrName.equals("id")) {
                            bookEntity.setId(attrValue);
                        }
                    }
                    // 对book节点的子节点的节点名以及节点值的遍历
                    List bookChilds = book.getChildren();
                    for (Element child : bookChilds) {
                        System.out.println("节点名:" + child.getName() + "----节点值:"
                                + child.getValue());
                        if (child.getName().equals("name")) {
                            bookEntity.setName(child.getValue());
                        }
                        else if (child.getName().equals("author")) {
                            bookEntity.setAuthor(child.getValue());
                        }
                        else if (child.getName().equals("year")) {
                            bookEntity.setYear(child.getValue());
                        }
                        else if (child.getName().equals("price")) {
                            bookEntity.setPrice(child.getValue());
                        }
                        else if (child.getName().equals("language")) {
                            bookEntity.setLanguage(child.getValue());
                        }
                    }
                    System.out.println("======结束解析第" + (bookList.indexOf(book) + 1)
                            + "书======");
                    booksList.add(bookEntity);
                    bookEntity = null;
                    System.out.println(booksList.size());
                    System.out.println(booksList.get(0).getId());
                    System.out.println(booksList.get(0).getName());
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


结果:
======开始解析第1书======
属性名:id----属性值:1
节点名:name----节点值:冰与火之歌
节点名:author----节点值:乔治马丁
节点名:year----节点值:2014
节点名:price----节点值:89
======结束解析第1书======
1
1
冰与火之歌
======开始解析第2书======
属性名:id----属性值:2
节点名:name----节点值:安徒生童话
节点名:year----节点值:2004
节点名:price----节点值:77
节点名:language----节点值:English
======结束解析第2书======
2
1
冰与火之歌
DOM4J解析原理:
导入jar包:dom4j-1.6.1.jar

然后:

public class DOM4JTest {
        private static ArrayList bookList = new ArrayList();
        public static void main(String[] args) {
            // 解析books.xml文件
            // 创建SAXReader的对象reader
            SAXReader reader = new SAXReader();
            try {
                // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
                Document document = reader.read(new File("src/res/books.xml"));
                // 通过document对象获取根节点bookstore
                Element bookStore = document.getRootElement();
                // 通过element对象的elementIterator方法获取迭代器
                Iterator it = bookStore.elementIterator();
                // 遍历迭代器,获取根节点中的信息(书籍)
                while (it.hasNext()) {
                    System.out.println("=====开始遍历某一本书=====");
                    Element book = (Element) it.next();
                    // 获取book的属性名以及 属性值
                    List bookAttrs = book.attributes();
                    for (Attribute attr : bookAttrs) {
                        System.out.println("属性名:" + attr.getName() + "--属性值:"
                                + attr.getValue());
                    }
                    Iterator itt = book.elementIterator();
                    while (itt.hasNext()) {
                        Element bookChild = (Element) itt.next();
                        System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());
                    }
                    System.out.println("=====结束遍历某一本书=====");
                }
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


结果:
=====开始遍历某一本书=====
属性名:id--属性值:1
节点名:name--节点值:冰与火之歌
节点名:author--节点值:乔治马丁
节点名:year--节点值:2014
节点名:price--节点值:89
=====结束遍历某一本书=====
=====开始遍历某一本书=====
属性名:id--属性值:2
节点名:name--节点值:安徒生童话
节点名:year--节点值:2004
节点名:price--节点值:77
节点名:language--节点值:English
=====结束遍历某一本书=====
DOM和SAX
DOM优点:
形成了树结构,直观好理解,代码更易编写
解析过程中树结构保留在内存中,方便修改
缺点
当XML文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出
SAX
优点:
事件驱动模式,对内存耗费比较小
适用于只需要处理xml中数据时
缺点:
不易编码
很难同时访问同一个XML中的多处不同的数据
JDOM与DOM,DOM4J
JDOM:仅使用具体类而不是使用接口
api大量使用了collections类
DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文件的表示方法
具有性能优异,灵活性好,功能强大,极端易使用的特点
DOM《SAX     DOM4J》JDOM,xml非常大非官方的方法远好于官方方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值