香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 94|回复: 0

Java学习之路018天

[复制链接]

5

主题

6

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-29 11:56:59 | 显示全部楼层 |阅读模式
第35次(XML技术)

学习主题:XML技术

学习目标:

1 掌握XML基本语法,命名规则
2 掌握什么是Schema,什么是DTD
3 掌握DOM解析XML
对应视频:

http://www.itbaizhan.cn/course/id/85.html
对应文档:


对应作业
1. XML概念和体系(可扩展标记语言,没有预定义标签,需自行定义标签)
(1) 简述XML的特点?
1) XML数据以纯文本格式存储
2) 实现不同应用程序之间的数据通信
3) 实现不同平台的数据通信
4) 实现不同平台的数据共享
5) 使用XML将不同的程序、不通的平台联系起来
(2) 一个标准的XML文档由什么组成?
1) 文档声明
2) <books>根节点(根元素)有且仅有一个
3) <Book>是<books>的子元素
4) 属性及文本
2. XML基本语法
(1) 简述XML的基本语法?
1) 有且只有一个根元素
2) XML的文档声明必须放在文档的第一行
3) 所有标签必须成对出现
4) XML的标签严格区分大小写
5) XML必须正确嵌套
6) XML中的属性必须加引号
7) XML中一些特殊字符需要使用“实体”
8) XML中可以应用适当的注释
(2) 简述XML的命名规则?
1) 名称可以是包含字母、数字及其它字符
2) 名称不能以数字或标点符号开始
3) 名称不能以大小写字母XML开始
4) 名称不能包含空格
3. Schema技术
(1) 简述什么是DTD验证及DTD验证的局限性?
DTD用于验证XML文件是否有效
局限性:
1) DTD不遵守XML的语法
2) DTD数据类型有限
3) DTD不可扩展
4) DTD不支持命名空间
(2) 什么Schema技术?使用Schema验证XML文档的步骤是什么?
Schema是DTD的代替者,名称为XML Schema,用于描述XML文档结构,比DTD更强大,最主要的特征是XML Schema支持数据类型
1) Schema是用XML验证XML遵循XML语法
2) Schema可以用能处理XML文档的工具处理
3) Schema大大扩充了数据类型,而且还可以自定义数据类型
4) Schema支持元素的继承
5) Schema支持属性组
步骤:
1) 创建SchemaFactory工厂
2) 建立验证文件对象
3) 利用SchemaFactory工厂对象,接收验证的文件对象,生成Schema对象
4) 产生对此Schema的验证器
5) 要验证的数据(准备数据源)
6) 开始验证
4. DOM方式解析XML数据
(1) 简述解析XML文件的方式有哪些?
1) DOM解析(Java官方提供)
2) SAX解析(Java官方提供)
3) JDOM解析(第三方提供)
4) DOM4J解析(第三方提供)
(2) 简述DOM解析XML的步骤?
1) 创建一个DocumentBuilderFactory的对象
2) 创建一个DocumentBuilder对象
3) 通过DocumentBuilder的parse()方法得到Document对象
4) 通过getElementsByTagName()方法获取到节点的列表
5) 通过for循环遍历每一个节点
6) 得到每一个节点的属性和属性值
7) 得到每个节点的节点名和节点值
public class TestDOM {

        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
                //1)创建一个DocumentBuilderFactory对象
                DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
                //2)创建一个DocumentBuilder对象
                DocumentBuilder db=dbf.newDocumentBuilder();
                //3)通过DocumentBuilder的parse()方法得到Document对象
                Document doc = db.parse("book.xml");
                //4)通过getElementByTagName()方法得到节点的列表
                NodeList bookList = doc.getElementsByTagName("book");
                //5)通过for循环遍历每一个节点
                for(int i=0;i<bookList.getLength();i++){
                        //6)得到每个节点的属性和属值
                        Node book=bookList.item(i);
                        NamedNodeMap attrs = book.getAttributes();
                        //循环遍历每一个属性
                        for(int j=0;j<attrs.getLength();j++){
                                //得到每一个属性
                                Node id = attrs.item(j);
                                System.out.println(id.getNodeName()+"\t"+id.getNodeValue());
                        }
                }
                System.out.println("\n每个节点的名和节点的值");
                //7)得到每个节点的节点名和节点值
                for(int i=0;i<bookList.getLength();i++){
                        //得到每一个book节点
                        Node book = bookList.item(i);
                        NodeList subNode = book.getChildNodes();
                        System.out.println("子节点个数:"+subNode.getLength());
                        //使用for循环遍历每一个book子节点
                        for(int j=0;j<subNode.getLength();j++){
                                Node childNode = subNode.item(j);
                                short type=childNode.getNodeType();//获取节点类型
                                if(type==Node.ELEMENT_NODE){
                                        System.out.println("节点名称:"+childNode.getNodeName()+"\t"+childNode.getTextContent());
                                }
                        }
                }

        }

}
第36次(XML技术)

学习主题:XML技术

学习目标:

1 掌握SAX解析XML
2 掌握JDOM解析XML
3 掌握DOM4J解析XML
4 掌握XPATH解析XML
对应视频:

http://www.itbaizhan.cn/course/id/85.html
对应文档:


对应作业
5. SAX方式解析XML数据
(1) 简述什么是SAX解析方式?
SAX,全称Simple API for XML,是一种以事件驱动的XML API,SAX与DOM不同的是它边扫描边解析,自顶向下一次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点
(2) 简述SAX解析XML的步骤?
1) 创建SAXParserFactory的对象
2) 创建SAXParser对象(解析器)
3) 创建一个DefaultHandler的子类
4) 调用parse方法
public class BookDefaultHandler extends DefaultHandler {
        /**解析xml文档开始时调用*/
        @Override
        public void startDocument() throws SAXException {
                // TODO Auto-generated method stub
                super.startDocument();
                System.out.println("解析XML文档开始");
        }
        /**解析XML结束时调用*/
        @Override
        public void endDocument() throws SAXException {
                // TODO Auto-generated method stub
                super.endDocument();
                System.out.println("解析XML文档结束");
        }
        /**解析XML文档的节点开始时调用*/
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                // TODO Auto-generated method stub
                super.startElement(uri, localName, qName, attributes);
                //System.out.println("解析XML文档的节点开始时调用");
                /**判断,如果是book节点,获取节点的属性和属性值*/
                if("book".equals(qName)){
                        //获取所有属性
                        int count = attributes.getLength();//属性个数
                        //循环获取每一个属性
                        for(int i=0;i<count;i++){
                                String attName=attributes.getQName(i);
                                String attValue=attributes.getValue(i);
                                System.out.println("属性名称:"+attName+"\t属性值为:"+attValue);
                        }
                }else if(!"books".equals(qName)&&!"book".equals(qName)){
                        System.out.print("节点的名称:"+qName+"\t");
                       
                }
        }
        /**解析XML文档的节点结束时调用*/
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
                // TODO Auto-generated method stub
                super.endElement(uri, localName, qName);
                //System.out.println("解析XML文档的节点结束时调用");
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
                // TODO Auto-generated method stub
                super.characters(ch, start, length);
                String value=new String(ch,start,length);
       
                if(!"".equals(value.trim())){
                        System.out.println(value);
                }
        }
}



public class TestSAXParse {
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
                //创建SXParserFactory的对象
                SAXParserFactory spf=SAXParserFactory.newInstance();
                //创建SAXParser的对象(解析器)
                SAXParser parser=spf.newSAXParser();
                //创建一个DefaultHandler的子类
                BookDefaultHandler bdh=new BookDefaultHandler();
                //调用parse方法
                parser.parse("book.xml", bdh);
        }
}
6. JDOM解析XML数据
(1) 简述什么是JDOM?
JDOM是一种解析XML的Java工具包,它基于树形结构。利用纯Java的技术对象XML文档实现解析。所以适用于Java语言。
(2) JDOM解析XML的步骤?
1) 创建一个SAXBuilder对象
2) 调用build()方法,得到Document对象(通过IO流)
3) 获取根节点
4) 获取根节点节点的直接子节点的集合
5) 遍历集合
public class TestJDOM {

        public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException {
                //1)        创建一个SAXBuilder对象
                SAXBuilder sb = new SAXBuilder();
                //2)        调用build()方法,得到Document对象(通过IO流)
                Document doc = sb.build(new FileInputStream("book.xml"));
                //3)        获取根节点
                Element root = doc.getRootElement();
                //4)        获取根节点节点的直接子节点的集合
                List<Element> bookEle = root.getChildren();
                //5)        遍历集合
                for(int i=0;i<bookEle.size();i++){
                        Element book = bookEle.get(i);
                        //得到属性的集合
                        List<Attribute> attList = book.getAttributes();
                        //遍历属性的集合得到每一个属性
                        for (Attribute attr : attList) {
                                System.out.println(attr.getName()+"\t"+attr.getValue());
                        }
                }
                //得到每一个子节点
                System.out.println("---------------");
                for(int i=0;i<bookEle.size();i++){
                        Element book = bookEle.get(i);//得到每一个book节点
                        List<Element> sunBook = book.getChildren();
                        //遍历每一个节点,获取结点名和结点值
                        for (Element ele: sunBook) {
                                System.out.println(ele.getName()+"\t"+ele.getValue());
                        }
                        System.out.println("==============");
                }

        }

}
7. DOM4J解析XML数据
(1) 简述DOM4J技术 ?
DOM4J是一个Java的XML API,是JDOM的升级品,用来读写XML、文件
(2) DOM4J解析XML的步骤?
1)  创建SAXReader对象
2) 调用read方法
3) 获取根元素
4) 通过迭代器遍历直接节点
public class TestDOM4J {

        public static void main(String[] args) throws DocumentException {
                //1)        创建SAXReader对象
                SAXReader reader = new SAXReader();
                //2)        调用read方法
                Document doc = reader.read(new File("book.xml"));
                //3)        获取根元素
                Element root = doc.getRootElement();
                //4)        通过迭代器遍历直接节点
                for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
                        Element bookELe = iteBook.next();
                        //System.out.println(bookELe.getName());
                        //得到book的属性
                        for(Iterator<Attribute> iteAtt=bookELe.attributeIterator();iteAtt.hasNext();){
                                Attribute att = iteAtt.next();
                                System.out.println(att.getName()+"\t"+att.getValue());
                        }
                }
                System.out.println("\n------------------");
                List<Book> bookList = new ArrayList();
                for(Iterator<Element> iteBook=root.elementIterator();iteBook.hasNext();){
                        Book book = new Book();
                        Element bookEle = iteBook.next();
                        //使用for循环继续遍历
                        for(Iterator<Element> subBookEle=bookEle.elementIterator();subBookEle.hasNext();){
                                Element subEle = subBookEle.next();
                                System.out.println(subEle.getName()+"\t"+subEle.getText());
                               
                                /**添加代码:封装成book对象*/
                                String nodeName=subEle.getName();//name,author,price
                                //使用switch判断
                                switch (nodeName) {
                                case "name":
                                        book.setName(subEle.getText());
                                        break;
                                case "author":
                                        book.setAuthor(subEle.getText());
                                        break;
                                case "price":
                                        book.setPrice(Double.parseDouble(subEle.getText()));
                                        break;
                               
                                }
                        }
                        //添加到集合中
                        bookList.add(book);
                }
                //遍历集合
                System.out.println("\n遍历集合------------------");
                for (Book b : bookList) {
                        System.out.println(b.getName()+"\t"+b.getAuthor()+"\t"+b.getPrice());
                }
        }
}(3)四种解析XML技术的特点?
1)DOM解析:
形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改
2)SAX 解析: 采用事件驱动模式,对内存耗费比较小。 适用于只处理 XML 文件中的数据时
3)JDOM 解析: 仅使用具体类,而不使用接口。 API 大量使用了 Collections 类。
4)DOM4J 解析: JDOM 的一种智能分支,它合并了许多超出基本 XML 文档 表示的功能。 它使用接口和抽象基本类方法。 具有性能优异、灵活性好、功能强大和极端易用的特点。 是一个开放源码的文件
8. XPATH技术快速的获取节点
(1) 简述XPATH技术?
1) 基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径
2) 如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
3) 星号 * 表示选择所有由星号之前的路径所定位的元素
4) 方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而last()函数则表示选择集中的最后一个元素.
(2) 使用XPATH技术快速获取节点需要做哪些准备工作?
将DOM4J 的 jar 包 和 Jaxen 的 jar 包 导入到项目中去
public class TestXpath {

        public static void main(String[] args) throws DocumentException {
                //创建SAXReader对象
                SAXReader reader = new SAXReader();
                //读取XML文档
                Document doc = reader.read("book.xml");
                //得到第一个author节点
                Node node = doc.selectSingleNode("//author");
                System.out.println(node.getName()+"\t"+node.getText());
                //获取所有的author
                System.out.println("--------------");
                List<Node> list = doc.selectNodes("//author");
                for (Node n : list) {
                        System.out.println(n.getName()+"\t"+n.getText());
                       
                }
       
                //选择有ID属性的book元素
                System.out.println("=================");
                List<Attribute> attList = doc.selectNodes("//book/@id");
                for (Attribute att : attList) {
                        System.out.println(att.getName()+"\t"+att.getText());
                }
        }

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-7-4 17:32 , Processed in 0.362553 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表