码迷,mamicode.com
首页 > 其他好文 > 详细

XML入门

时间:2021-01-07 11:41:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ntb   entity   focus   tno   存在   pre   get   nodelist   cto   

第二章 XML简介

XML是可扩展标记语言,使用一系列简单的标记来描述结构化数据

XML的特点

  1. XML与操作系统、编程语言的开发平台都无关。

  2. 规范统一、实现不同系统之间的数据交互。

 

XML的文档结构

1. XML声明

<?xml version="1.0" encoding="UTF-8"?> 文档总是以XML声明开始,

组成: 固定部分
  1. version文档符合XML1.0规范。

  2. encoding:文档字符编码,默认为UTF-8

2. 标签

标签一般成对存在,XML标签必须正确结束并正确地嵌套,缺少结束标签 或者标签不对应都是错误的

3.元素

由开始标签<+元素内容+>结束标签组成

元素的命名规则:

名称可以包含字母 数字或其他字符.
名称中不能以数字或者符号开始.
名称中不能以字符"xml"(或XML.Xml)开始
名称中不能包含空格.

简易版:

  1. 不要用数字开头

  2. 不要包含除了-和_其他的符号

  3. 不要使用中文

元素可以为空!

4.根元素 有且仅有一个根元素

特点

根元素是一个完全包括文档中其他的所有元素的元素。
根元素的起始标签在所有元素前,结束标签在所有标签后

 

5.属性

语法:<元素名 属性名="属性值">

 

温馨提示:

  1. 一个元素可以有多个属性,多个属性之间用空格隔开 <元素名 属性名="属性值" 属性名="属性值"/>

  2. 属性值中不能直接包含<、"、&;

  3. 属性可以加在任何一个元素的起始标签商,但不能加在结束标签中。

6.XML中的特殊字符的处理

1.实体符号

特殊字符实体名称 前面加上&
< lt;
> gt;
& amp;
" quot;
apos;

2.CDATA

语法:<![CDATA[要显示的字符]]>

<![CDATA[
&
]]>

不能在属性中使用,属性中需要用实体符号

7.XML中的注释

<!---->

8.格式良好的XML文档

规则:

  1. 有XML声明语句。

  2. 有且仅有一个根元素。

  3. 标签大小写敏感。

  4. 属性值用双引号包裹。

  5. 标签成双成对。

  6. 元素正确嵌入。

    XML的应用场景即作用

1.数据存储 可以实现数据的持久换存储。
2.数据交换 交换方便
3.数据配置 许多应用的配置信息存储在XML文件中。

json容易读取

 

XML解析技术

1.DOM

基于XML的树结构完成解析,会根据读取的文档,构建一个驻留内存的树结构,非常方便于各种操作,支持删除 修改 重新排列等多个功能 适用于多次访问XML文档 缺点消耗资源

2.SAX

通过事件处理器完成对文档的解析,不用事先调入整个文档 。 优点占用资源少,内存消耗少

适用于解析数据量较大的XML文档 占用资源少

3.JDOM

针对Java的特定文档模型,简化了与XML的交互。 仅使用具体类,而不使用接口。 简化了API,但也限制了灵活性。 优势 适用20%的经历解决80%的Java/HTML问题

4.DOM4J

性能优异、功能强大和易用,开源库。 大量使用接口,面向接口编程 使用集合框架

 

DOM和SAX不针对特定语言,只是定义了一些接口,以及部分缺省实现(使用空方法实现)

 

DOM概念

Document Object Model的简称,文档对象模型。XML文件被映射成一个树型结构。以根元素为根节点。每个节点都以对象存在。

使用的API

使用JAXP(Java API for XML Processing)

org.w3c.dom: W3C 推荐的用于使DOM解析XML文档的接口。

org.xml.sax:用于使用SAX解析XML文档的接口。

javax.xml.parsers:解析器工具,获得并配置特殊的分析器。

使用DOM解析XML文档的步骤

(1). 创建解析器工厂对象,即DocumentBuilderFactory对象

  //得到DOM解析器的工厂实例
      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

(2).由解析器工厂对象创建解析器对象,即DocumentBuilder对象

 //从DOM工厂得到解析器
      DocumentBuilder db=dbf.newDocumentBuilder();

(3).由解析器对象对指定的XML文件进行解析,构建响应的DOM树,构建Document对象

//解析Xml文档,得到一个Document对象,及DOM树
      Document doc=db.parse("src/sj1.xml");

(4).以Document对象为起点对DOM树的节点增删改查等操作。

使用DOM解析XML时主要使用以下对象:

(1)Node对象 节点对象

主要方法

getChildNodes()返回包含所有子节点的NodeList
getFirstChild() 如果节点存在子节点,返回第一个子节点
getLastChild() 如果节点存在子节点,返回最后一个子节点
getNextSibling() 返回在DOM树中这个节点的下一个兄弟节点
getPreviousSibling() 返回在DOM树中这个节点的上一个兄弟节点
getNodeName() 返回节点的名称
getNodeValue() 返回节点的值
getNodeType() 返回节点的类型

 

(2)NodeList对象 包含了一个或者多个节点的列表。 Node数组

主要方法

getLength()返回列表的长度
item() 返回指定位置的Node对象

 

 

(3)Document对象 整个XML文档

主要方法

getElementsByTagName(String name)返回包含所有指定标签名称的标签
getDocumentElement() 返回DOM树节点的根节点
getElementsById(String name) 返回包含所有指定Id的标签
   

 

(2)Element对象 XML文档的标签元素 继承自Node,也是Node最主要的子对象

主要方法

getAttribute(String name)返回包含所有指定标签名称的标签
getDocumentElement() 返回一个代表这个DOM树节点的Element对象

 

 

 

 

 

 

使用DOM4J解析XML

常用API

Attribute属性
Branch 能够包含子节点的节点
CDATA 定义了XML CDATA区域
CharacterData 标识基于字符的节点
Comment 定义了XML注释的行为
Document 定义了XML文档
DocumentType 定义XML声明
Element 定义XML元素
ElementHandler 定义了Element对象的处理器
ElementPath 取得当前正在处理的路径层次信息
Entity 定义XML实体
Node 为dom4j中所有XML节点定义了多态行为
NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为
ProcessingInstruction 定义XML处理指令
Text 定义XML文本节点
Vistor 用于实现Vistor模式
Xpath 通过分析一个字符串提供一个XPath表达式

 

使用DOM4J操作XML数据

1.Document对象相关

 

?
       SAXReader saxReader=new SAXReader();
       Document doc = null;
       try {
           doc = saxReader.read("src/sj4.xml");
           Element rootElement = doc.getRootElement();
           Iterator<Element> iterator = rootElement.elementIterator();
           while (iterator.hasNext()){
               Element element = iterator.next();
               String name = element.attributeValue("name");
               if (name.equals("三星")){
                   System.out.println("成功!");
                   element.addAttribute("name", "Suxing");
              }
          }
?
      } catch (Exception e) {
           e.printStackTrace();
      }
?
       OutputFormat outputFormat = OutputFormat.createCompactFormat();
       outputFormat.setEncoding("utf-8");
       try {
           XMLWriter writer = new XMLWriter(new FileWriter("src/sj4.xml"));
           writer.write(doc);
           writer.close();
           System.out.println("修改成功!");
      } catch (Exception e) {
           e.printStackTrace();
      }

 

 

为什么要关闭流?

一般内存的速度比磁盘快,读取的时候会慢慢的发送

写入的时候内存是1000ms硬盘是500 一样的时间会有一部分的数据放入缓存区域,会照成一个时间差,内存继续按照1000发送,一部分直接给磁盘一部分放到缓存让磁盘慢慢提取,假设以内存的速度5秒读取完,内存5秒后就没数据传输,但是缓存还有。

 

 

XML入门

标签:ntb   entity   focus   tno   存在   pre   get   nodelist   cto   

原文地址:https://www.cnblogs.com/gaobangguo/p/14228384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!