XML

来源:互联网 发布:怎样评判数据库好坏 编辑:程序博客网 时间:2024/06/16 01:45

XML简介

  • eXtensible Markup Language:可扩展标记型语言
    html是用于显示数据,xml也可以显示数据(不是主要功能)
    xml主要功能,为了存储数据
    xml是w3c组织发布的技术
    xml有两个版本 1.0 , 1.1(1.1版本不能向下兼容)
  • 标签定义
    一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签
    在xml中把空格和换行都当成内容来解析,
    xml中标签的名称规则
    (1)xml代码区分大小写
    (2)xml的标签不能以数字和下划线(_)开头
    (3)xml的标签不能以xml、XML、Xml等开头
    (4)xml的标签不能包含空格和冒号
    1. 注释 <!-- xml的注释 -->
      2.特殊字符要转义: < &lt; > &gt;
      <![CDATA[ 内容 ]]>

xml约束

  • 比如现在定义一个xml文件,只想要这个文件里面保存人的信息,
    xml的标签是自定义的,需要技术来规定xml中只能出现的元素,这个时候需要约束。dtd约束 和 schema约束
  • dtd入门:
    (1)看xml中有多少个元素 ,有几个元素,在dtd文件中写几个 <!ELEMENT>
    (2)判断元素是简单元素还是复杂元素
    复杂元素:有子元素的元素<!ELEMENT 元素名称 (子元素)>
    简单元素:没有子元素<!ELEMENT 元素名称 (#PCDATA)>
    (3)需要在xml文件中引入dtd文件
    *<!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径”>:使用外部的dtd文件
    *<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>

  • 使用dtd定义元素
    语法: <!ELEMENT 元素名 约束>
    简单元素:没有子元素的元素
    <!ELEMENT name (#PCDATA)>
    (#PCDATA): 约束name是字符串类型
    EMPTY : 元素为空(没有内容)
    ANY:任意
    复杂元素:
    <!ELEMENT person (name,age,sex,school)>
    <!ELEMENT 元素名称 (子元素)>
    表示子元素出现的次数:
    + : 表示一次或者多次
    ? :表示零次或者一次
    * :表示零次或者多次
    子元素直接使用 | 隔开:表示元素只能出现其中的任意一个

  • 定义属性
    语法: <!ATTLIST 元素名称
    :属性名称 属性类型 属性的约束 >
    属性类型- CDATA: 字符串
    <!ATTLIST birthday
    ID1 CDATA #REQUIRED>
    <!ATTLIST age
    ID2 (AA|BB|CC) #REQUIRED>
    ID: 值只能是字母或者下划线开头
    <!ATTLIST name
    ID3 ID #REQUIRED>
    属性的约束
    REQUIRED:属性必须存在
    IMPLIED:属性可有可无
    FIXED: 表示一个固定值 #FIXED “AAA”

XML解析

xml的解析方式:dom 和 sax

dom方式解析
根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
缺点:如果文件过大,造成内存溢出
优点:很方便实现增删改操作

sax方式解析
采用事件驱动,边读边解析
从上到下,一行一行的解析,解析到某一个对象,返回对象名称
缺点:不能实现增删改操作
优点:如果文件过大,不会造成内存溢出,方便实现查询操作

  • 不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
    • sun公司提供了针对dom和sax解析器 jaxp
    • dom4j组织,针对dom和sax解析器 dom4j
    • jdom组织,针对dom和sax解析器 jdom

jaxp的API

  • jaxp解析器在jdk的javax.xml.parsers包里面
    - 在document里面方法
    getElementsByTagName(String tagname)
    – 这个方法可以得到标签
    – 返回集合 NodeList
    createElement(String tagName)
    – 创建标签
    createTextNode(String data)
    – 创建文本
    appendChild(Node newChild)
    – 把文本添加到标签下面
    removeChild(Node oldChild)
    – 删除节点
    getParentNode()
    – 获取父节点
    getLength() 得到集合的长度
    item(int index)下标取到具体的值
    getTextContent()
    - 得到标签里面的内容
    DocumentBuilderFactory: 解析器工厂
    - 这个类也是一个抽象类,不能new
    newInstance() 获取 DocumentBuilderFactory 的实例。
    * sax:
    SAXParser:解析器类
    SAXParserFactory: 解析器工厂

使用JAXP实现查询操作

1、创建解析器工厂
DocumentBuilderFactory.newInstance();

2 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder();

3·解析xml返回document
Document document = builder.parse(“src/person.xml”);
4、得到所有的name元素
使用document.getElementsByTagName(“name”);
5、返回集合,遍历集合,得到每一个name元素
- 遍历 getLength() item()
- 得到元素里面值 使用 getTextContent()

  • 步骤
    1、创建解析器工厂
    2、根据解析器工厂创建解析器
    3、解析xml,返回document
    4、得到所有name元素
    5、使用返回集合,里面方法 item,下标获取具体的元素
    NodeList.item(下标): 集合下标从0开始
    6、得到具体的值,使用 getTextContent方法
    添加标签:      4、得到第一个p1    - 得到所有p1,使用item方法下标得到      5、创建sex标签 createElement      6、创建文本 createTextNode      7、把文本添加到sex下面 appendChild      8、把sex添加到第一个p1下面 appendChild      9、回写xm

回写代码:
TransformerFactory transformerFactory =  TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new  StreamResult(“src/person.xml”))

0 0
原创粉丝点击