xml

一、xml简介

1. 什么是xml

  • XML:Extensiable Markup Language,可扩展标记语言。和HTML有语法相似之处,也有作用上的不同:

    • 和html相似:

      • 都是由一堆标签组成的

      • 标签上都可以写属性

    • 和html不同:

      • html重点在于显示;xml重点在于配置的数据

      • html的标签都是有功能;xml的标签没有功能

      • html的标签是w3预定义好的;xml的标签是自定义的

2. xml的作用

  • 作为软件的配置文件:逐步被注解代替掉,但是没有完全代替掉

    • properties文件:简单,功能弱。JDK提供的Properties来解析

    • xml文件:麻烦,功能强。引入jar包解析

  • 作为数据传输的格式:已经被json代替了

二、==xml语法==(编写一个xml)

1. xml的语法概述

  • 一个xml里,用到的语法有:

    • 文档声明

    • 注释

    • 元素/标签

    • 属性

    • 特殊字符和CDATA区

2. xml的语法详解

  • 要求:编写一个xml,里边配置班级里同学的信息

2.1 文档声明

<?xml version="1.0" encoding="utf-8" ?>
  • 注意:

    • 文档声明必须出现在xml文档的0行0列

2.2 元素/标签

<!-- 开始标签,结束标签 -->
<students></students>
<!-- 自闭合标签 -->
<studetns/>
  • 注意:

    • 区分大小写

    • 命名要求:不能使用空格、冒号,不建议以xml开头

      • 建议:以数字、字母、下划线命名,并且不以数字开头

    • 只能有且必须有一个根标签

    • 标签一定要闭合

2.3 属性

<student id="001"></student>
  • 注意:

    • 属性必须出现在开始标签上

    • 属性值必须使用引号括起来

    • 区分大小写

    • 属性命名:建议以数字、字母、下划线命名,不以数字开头

2.4 特殊字符和CDATA区

  • 特殊字符:通常使用转义字符代替:>, &gt; <, &lt; ", &quot; ', &apos;' &, &amp;

  • CDATA区:在CDATA区里可以写任意字符,而不需要使用转义字符。

    • 语法:<![CDATA[ 在这里可以写任意内容 ]]>

3. xml编写的练习:

要求:编写一个xml,配置一些书籍的信息。每本书要求有:书名,作者,价格;编号,出版社

三、xml解析

1. 什么是xml解析

  • 使用一段代码,读取xml,得到里边配置的数据。

2. 有哪些解析方式(面试题)

2.1 常见的解析方式

  • DOM解析:把整个xml文档加载到内存中,封装形成一棵dom树。

    • 优点:可以增、删、改

    • 缺点:可能内存溢出

  • SAX解析:逐行读取,事件驱动型解析。

    • 优点:速度快,可以读取大xml文档

    • 缺点:复杂,不能增、删、改

2.2 常见的解析工具包

  • jaxp:sun公司的工具包,很少用

  • jsoup:可以解析xml,但是更多用于解析html,做网络爬虫

  • jdom:jdom组织提供的工具包

  • dom4j:dom4j组织提供的工具包,使用的多

3. xml解析实现

3.1 使用dom4j解析xml

3.1.1 基本步骤
1.读取xml,得到Document对象
2.从Document里得到根节点对象
3.遍历dom树,找需要的标签
4.得到标签上的数据:属性值、标签体
3.1.2 相关的类
  • 解析器:读取xml的,得到Document对象

    • SAXReader:使用sax方式读取xml,最终构建一棵dom树

    • DOMReader:使用dom方式读取xml,最终构建一棵dom树

SAXReader reader = new SAXReader();
Document document = reader.read(InputStream is);
  • 从Document里得到根标签:

    • document.getRootElement()

  • 从任意一标签里得到子标签

    • element.elements():获取所有的子标签,得到List

    • element.elements(String elementName):获取所有指定名称的子标签,得到List

    • element.element(String elementName):获取第一个指定名称的子标签,得到Element

  • 从标签上得到数据:

    • element.getText():得到标签里的内容

    • element.attributeValues(String attrName):获取指定名称的属性值

3.2 使用xpath简化dom4j

3.2.1 常见xpath写法(了解)
/a/b/c:  找根标签a下的b标签,b标签下的c标签。 最终找的是符合条件的c标签
//a:     全文搜索a标签

//a[1]: 全文搜索a标签,只要第1个
//a[last()]:全文搜索a标签,只要最后一个
//@id:   全文搜索id属性
//a[@id]:全文搜索含有id属性的a标签

//a[@id="a1"]:全文搜索a标签,但是只要id属性值为a1的

/a/*:   找根标签a下所有的子标签
//*:     全文搜索所有标签
//a[@*]   全文搜索有属性的a标签
3.2.2 dom4j使用xpath
  • 步骤:导入jar包(dom4j的jar包,jaxen的jar包)

1. 读取xml文件,得到Document对象
2. 使用Document的方法,执行xpath表达式,得到结果
  • 相关的方法:

    • Document里执行xpath的方法:

      • document.selectNodes(String xpath):得到所有符合xpath的节点集合,得到List<Node>

      • document.selectSingleNode(String xpath):得到第一个符合xpath的节点对象,得到Node对象

3.3 dom4j解析和xpath解析对比

  • 如果要解析xml,得到里边配置的所有数据:建议用dom4j,层层迭代遍历所有

  • 如果要解析xml,只要里边的一部分数据:建议使用xpath,使用xpath表达式直接定位到节点,不需要层层迭代

4. 练习:

  • 解析得到书籍xml文件里所有的书籍信息

  • 使用xpath解析xml,得到所有书籍的名称。 或者是得到id为指定值的一本书的信息

四、xml约束(了解)

1. 什么是约束

  • 用来限制xml文件里可以写什么标签、属性、什么值。这样的限制,叫xml约束。

  • 约束的作用:

    • 限制xml里可以写什么,不可以写什么

    • 编写xml时给代码提示

2. 有哪些约束(面试题)

  • DTD约束:

    • 文件后缀名是:.dtd

    • DTD约束是一套独立的语法

    • DTD的数据类型较少

  • Schema约束:

    • 文件后缀名是:xsd

    • Schema约束是使用xml格式编写的

    • Schema支持更多的数据类型

    • Schema支持名称空间

3. 约束的引入(了解)

3.1 在xml里引入dtd约束

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE 根标签 SYSTEM "dtd文件名称">

3.2 在xml里引入Schema约束

<?xml version="1.0" encoding="utf-8"?>
<根标签
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="约束文件的名称空间"
    xsi:schemaLocation="约束文件的名称空间 xsd文件名称">
   
</根标签>
  • 如果一个xml里要引入多个xsd约束

<?xml version="1.0" encoding="utf-8" ?>
<根标签 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="约束1的名称空间"
    xmlns:ys2="约束2的名称空间"
    xmlns:ys3="约束3的名称空间"
    xsi:schemaLocation="约束1的名称空间
                        约束1的文件位置
                        约束2的名称空间
                        约束2的文件位置
                        约束3的名称空间
                        约束3的文件位置">
   
   <!-- abc标签是默认的名称空间里提供的标签。xmlns="" -->
   <abc></abc>
   
   <!-- 约束2里的标签 -->
   <ys2:abc></ys2:abc>
   
   <!-- 约束3里的标签 -->
   <ys3:abc></ys3:abc>
</根标签>

4. 名称空间

  • Schema约束里有名称空间;DTD约束是没有的

  • 作用:

    • 因为一个xml里可以引多个Schema约束。多个Schema约束里可能定义的相同名称的标签。

    • 在xml里,使用标签时,就必须要声明:用的是哪个约束里的标签定义

  • 名称空间相当于是一个Schema约束的唯一标识。

内容总结

  1. 能够说出xml的作用:

    • 作为软件的配置文件:逐步被注解代替了

    • 作为数据传输的格式:已经被json代替了

  2. 掌握xml的语法:区分大小写

    • 文档声明:<?xml version="1.0" encoding="utf-8" ?>

      • 要求:必须出现在0行0列

    • 注释:<!-- 注释内容 -->

    • 元素/标签:<关键字></关键字> <关键字/>

      • 有且必须有一个根标签

      • 命名:不能出现空格,冒号;不建议以xml开头;建议:以字母、数字、下划线命名,不以数字开头

    • 属性:<关键字 属性名="值" 属性名="值"></关键字>

      • 属性值必须用引号括起来

      • 命名:跟元素命名规范一样

    • 特殊字符:

      • >, &gt; <, &lt; ",&quot; ',&apos; &, &amp;

    • CDATA区:

      • <![CDATA[ 在这里可以写任意内容 ]]>

  3. 能够说出常用的解析方式:

    • dom解析:把整个xml加载到内存中,形成dom树。

      • 好处:可以增、删、改

      • 缺点:可能内存溢出

    • sax解析:逐行读取,事件驱动型解析。

      • 好处:速度快,不易内存溢出

      • 缺点:不能增、删、改

  4. 掌握 dom4j解析xml的方式

    //1.读取xml,得到Document对象
    SAXReader reader = new SAXReader();
    Document document = reader.read(xml文件的输入流对象);
    //2.从Document里得到根标签
    Element rootElement = document.getRootElement();
    //3.层层遍历得到想要的标签
    List<Element> elements = rootElement.elements();//得到所有子标签
    List<Element> elements = rootElement.elements("student");//获取所有名称为student的子标签
    Element element = rootElement.element("student");//获取第一个名称为student的子标签
    //4.获取标签上的数据:属性值, 文本
    String attrValue = element.attributeValue(String attrName);
    String text = element.getText();
  5. 掌握xpath简化dom的使用

    //1.读取xml,得到Document对象
    SAXReader reader = new SAXReader();
    Document document = reader.read(xml文件的输入流对象);

    //2.使用Document的方法,执行xpath表达式,得到结果
    List<Node> nodes = document.selectNodes(String xpath);//得到所有符合条件的节点集合
    Node node = document.selectSingleNode(String xpath);//得到第一个符合条件的节点对象
  6. 能够说出xml的两种约束方式

    • DTD约束; Schema约束

    • DTD约束有独立的语法;Schema约束使用的xml语法

    • Schema支持更多的数据类型

    • 一个xml里只能引入一个dtd约束;能引入多个Schema约束

    • Schema约束支持名称空间

  7. 把引入约束的语法,记起来备用

xml 的使用和解析 及解析工具的更多相关文章

  1. XML解析——SAX解析以及更方便的解析工具(JDOM、DOM4J)

    XML主要用于数据交换,HTML则用于显示. 相对于DOM的树形解析,SAX采用的是顺序解析,这种解析方法可以快速地读取XML数据的方式. SAX主要事件: No. 方法 类型 描述 1 public ...

  2. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

  3. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  4. (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

    自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...

  5. XML - 十分钟了解XML结构以及DOM和SAX解析方式

    引言 NOKIA 有句著名的广告语:"科技以人为本".不论什么技术都是为了满足人的生产生活须要而产生的.详细到小小的一个手机.里面蕴含的技术也是浩如烟海.是几千年来人类科技的结晶, ...

  6. 将场景导出XML或JSON或二进制而且解析还原场景

    导出unity场景的全部游戏对象信息,一种是XML一种是JSON. 本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON ...

  7. XML解析——DOM解析

    XML:可扩展性标记语言,主要用来传输和存储数据,相对于HTML的各种标签规范,XML的标签可以让用户根据语义自己进行定义,适用于web传输. JSON和XML的区别: (1).XML定义 扩展标记语 ...

  8. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  9. XML文件解析DOM解析和SAX解析

    解析一个XML文档有哪些内容解析有:dom和sax两种dom:把整个XML文档放入内存,适合XML随机访问,占用内存资源大sax:事件驱动型的XML解析方式,顺序读取,不用一次装载整个文件,遇到标签会 ...

  10. Tomcat源码分析——SERVER.XML文件的加载与解析

    前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...

随机推荐

  1. Saiku_学习_03_Saiku+Kylin构建多维分析OLAP平台

    一.技术选型 参见:Saiku+Kylin多维分析平台探索 1.saiku Saiku 作为分析平台,提供可视化的操作,能方便的对数据进行查询.分析,并提供图形化显示 2.kylin Kylin 作为 ...

  2. Java_异常_06_ Unsupported major.minor version 52.0

    二.参考资料 1.如何解决Unsupported major.minor version 52.0问题? 2.Unsupported major.minor version 52.0 3. Unsup ...

  3. BEC listen and translation exercise 43

    Reach for the stars so if you fall you land on a cloud.飞向星空吧,就算坠落,接住你的也是云彩. Anyway, exam failure can ...

  4. codeforces 598C C. Nearest vectors(极角排序)

    题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. [原]NYOJ-A*B Problem II-623

    大学生程序代写 A*B Problem II 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 ACM的C++同学有好多作业要做,最头痛莫过于线性代数了,因为每次做到矩阵相 ...

  6. C语言逗号运算符和逗号表达式

    在C语言中逗号","也是一种运算符,称为逗号运算符. 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式.其一般形式为:表达式1,表达式2 其求值过程是分别求两个表达式的 ...

  7. VBA记录当前系统时间并精确到毫秒

    想做个功能,点一次按钮,就在A1记录一次当前系统时间,要精确到毫秒的.再点一次按钮就在A2显示,以此类推! 例如:这个功能可以用来做歌词记时间! Sub ttt() ActiveCell.Select ...

  8. Marionettejs

    Marionette是牵线木偶的意思,这个库是对Backbone的一次更高层次封装.这样的封装有两个目标: 减少重复的工作,提高使用Backbonejs时的生产效率给复杂应用页面提供更多的结构,以支撑 ...

  9. POJ1995:Raising Modulo Numbers

    二进制前置技能:https://www.cnblogs.com/AKMer/p/9698694.html 题目传送门:http://poj.org/problem?id=1995 题目就是求\(\su ...

  10. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...