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. Java企业微信开发_01_接收消息服务器配置

    一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:Java微信公众平台开发_01_本地服务器映射外网 2.一个企业微信账号: 去注册:(https://work.weixin.qq.c ...

  2. Failed to install xxxx.apk on device 'emulator-5554!

    异常信息:[HelloAndroid] Performing com.example.helloandroid.HelloAndroid activity launch[HelloAndroid] U ...

  3. C++函数重载详解

    我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...

  4. 浅谈双流水线调度问题以及Jhonson算法

    引入:何为流水线问题 有\(n\)个任务,对于每个任务有\(m\)道工序,每个任务的\(m\)道工序必须在不同的m台机器上依次完成才算把这个任务完成,在前\(i-1\)道工序完成后才能去完成第\(i\ ...

  5. yum配置文件位置

    centos的yum配置文件 cat /etc/yum.conf cachedir=/var/cache/yum //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/ ...

  6. Kill掉MySQL中所有sleep的client线程 (转)

    vim killsleep.sh #It is used to kill processlist of mysql sleep #!/bin/sh while : do   n=`mysqladmin ...

  7. DevExpress源码编译总结

    独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址  链接:http://pan.b ...

  8. Spring pom配置详解(转)

    转载至http://blog.csdn.net/ithomer/article/details/9332071# 原博主注释的很详细 <project xmlns="http://ma ...

  9. koa1创建项目

    1.一定要全局安装(koa1.2和koa2都己经支持)npm install koa-generator -g 2.koa1.2 生成一个test项目,切到test目录并下载依赖 koa testcd ...

  10. 20、BLAST比对及结果介绍

    1.formatdb -i /share/nas1/huangt/project/IsoSeq/BMK170104-E545-03-a/Analysis_T01/MoveRebundant/T01/c ...