XML(一)

学习目录
XML 简介 :
1.     什么是 XML? 有什么作用 ?
2.     XML 的背景
3.     XML HTML 的关系
4.     XML 文档的结构
5.     XML 良好的格式规范是什么 ?
6.     XML 的语法 ( 如何书写一个 XML 文档 )
7.     XML 的字符转义
8.     引用
DTD:
1.     什么是 DTD? 有什么用 ?
2.     XML 文档中调用 DTD
3.     DTD 的结构
4.     定义元素
5.     定义子元素
6.     定义属性
7.     实体声明
名域空间 :
1.     什么是名域空间 ? 有什么用 ?
解析器 :
1.     什么是解析器 ? 有什么用 ?
2.     JAVA 中解析 XML 文档 (XML 有四种解析方式 )
1)   Dom
2)   Sax
3)   Jdom
4)   Jadp
 
XML 简介 :
什么是 XML? 有什么作用 ?
是一种元标记语言 , 可以定义新的标记 , HTML 比较相似 , 但是更强大
基本作用是用来交换数据的 , 我们可以把它当作是一个文本数据库 , 也可以用做配置文件等
 
XML 背景 :
1) XML 代表扩展的标记语言 (eXtensible Markup Language);
2) XML W3C 联盟发展维护 ;
3) XML 是一种元语言,可以用来定义其它标签语言 ;
4) XML 没有定义任何标记,它提供了一种工具定义标记以及它们之间的结构关系 ;
5) XML 是一种用于结构化文本交换的标记语言 ;
6) XML 代表了内容的结构也代表了内容本身 ;
7) XML 继承自 SGML( 标准标记语言 ) SGML 的前身 GML IBM 1960 年发明,用于描述设备无关的文本
8) XML SGML 的子语言 , SGML 简化而来,起初目的是为 Web 的结构文档提供服务。
9) W3C 组织在 1998 2 10 日发布 XML1.0 版,第二个版本发布于 2000 10 9 日。
10)XML 是分层的树形结构的自解释的一种可扩展的标记语言。
 
XML HTML 的关系 :
事实上, HTML XML 不能够进行比较的。因为 XML 是一种元语言,而 HTML 是一种定义好的标记语言。 XML 是描述数据的语言, HTML 是描是数据外观的语言。
HTML 有一套确定的标记。在 W3C 标准规范中定义了 HTML 标记的含义并由部分浏览器实现了。
HTML 标记非常适合描述人类易读的可视化文本。
HTML 定义了许多表现指令用以优化在浏览器中的显示。
HTML 标记中,数据固有的结构丢失了。
HTML 没有维持数据类型信息的完整性、约束、或实体间的其它关系,而 XML 提供了这些特征。
 
XML 文档的结构 :
       XML 文档 = 序言 + 元素 + 杂项(可选)
      1 )序言
           序言 = XML 声明) + (杂项) + (文档类型声明)
           XML 声明
               <? xml 版本信息 ( 编码信息 ) ( 文档独立性信息 ) ?>
           如: <?xml version="1.0" encoding="gb2312" standalone="yes"?>
           文档类型声明
                 规定元素的结构和属性列表的取值
           如: <!DOCTYPE studinfo SYSTEM "studinfo.dtd">
      2 )元素
           空元素
                 < 空元素标签名 属性 =" 属性值 "/>
           非空元素
                 < 起始标签 > 内容 < 结束标签 >
                 内容 =( 子元素 | 字符数据 | 字符数据段 | 引用 | 处理指令 | 注释 )*
                 字符数据      
                       字符数据中,不能含有 &,<,>,',", 需要采用实体引用的方式
                 字符数据段
                       <![CDATA[ 字符数据 ]]>
                 引用
                      <!ENTITY 引用名 ".......">   
      3 )杂项
           处理指令
                 XML 为其它应用程序准备的接口。
               <? 处理指令 ?>
           注释 <!-- 注释内容 -->
           空白符指空格、回车等
例子 :
<?xml verson="1.0"?><!-- 这一句一定要求写在文件的第一行 -->
<!-- 只能有一个根元素即那一对根标签 -->
<root><!-- 根标签 -->
<!-- 根元素的内容 -->
<leaf><!-- 子元素 -->
...
<leaf>
</root>
 
XML 良好的格式规范是什么 ?
1) 文档声明位于文件的开头 <?xml version="1.0"?>
2) 文档中只能定义一个唯一的根元素(根元素是在文档声明之后的最外层的元素)
3) 标签必须闭合,且不能交叉,有元素的起始标签,就必须有其结束标签(空元素除外)
4) 层层嵌套,每一对标签总是出于另一对标签的内或和其处于同一层,不能交叉(根元素 chuw
5) 大小写敏感,起始标签和结束标签的名字要一致
6) 属性值必须用引号引起来
7) 注意特殊字符,使用时需要使用转义字符。
注意:
1. 第一行一定要写 <?xml version="1.0"?>
2.xml 文件是由元素和元素的内容以及属性组成的,一个 xml 文件中只能有一个根元素,标签和标签的内容加在一起叫作一个元素。 xml 是大小写敏感的,只能以字母或下划线开头。
 
XML 的语法 ( 如何书写一个 XML 文档 )
XML 文档是由标签和标签的内容组成的 , 把这个组合称为元素
非空元素
<test>( 起始标签 )
 aaa( 内容 )
</test>( 结束标签 )
 
空元素
<test values="test"/>
 
XML 的字符转义 :
字符转义是什么 ? 就是用一个字符代表一种意义
: &lt; 代表 "<" ,&gt; 代表 ">" ,&quot; 代表双引号。 &amp 代表 "&" ,&apos; 代表单引号
<!CDATA[........]>
.... 的部分不必使用转义,其中内容会直接输出。
 
引用 :
实体声明
<!ENTITY 引用名 "......">
使用实体 , 引用
& 引用名
 
例子 :
<?xml version="1.0" encoding="gb2312"?> XML 文件的声明)
<!--this is a comment hehe--> (注释)
<student> (根元素)
   <script> (子元素)
   <![CDATA[function compare(a,b){
      if(a>b)
           then {return 1}
      else{return 0}
        }]]>
   </script>
   <script value="java"/> (空元素)
   <name country="china" (属性名 = “属性值”) > 张三 </name>
</student>
XSLT, 是用于对 XML 进行文档格式转换,把一个 XML 文档转换成另一种格式的 XML 文档,但是其中内容是不变的。
 
DTD
什么是 DTD? 有什么用 ?
文档类型的定义 , 可以定义元素等
 
XML 文档中调用 DTD:
两种方法 :
第一种 , 内部调用一个 DTD:
<?xml version= "1.0" standalone= "no" ?>
<!-- 必须名字都一样 g-->
<!-- 这是一个内部调用 DTD 的方法 -->
<!DOCTYPE g[
    <!ELEMENT g (#PCDATA)>
    ]>
<g>
</g>
注意 :
studinfo (#PCDATA) 有空格
文档类型名与根元素名必须一致
 
第二种 , 外部调用一个 DTD 文件
注意点:
              1 standalone="no"
              2 )注意 dtd 文件的路径
 
DTD 的结构
1.     元素类型声明 :
指明元素的名字和内容
<!ELEMENT 元素名字 ( 元素内容 )>
元素内容 =EMPTY || ANY || 元素内容 || #PCDATA
#PCDATA: 可解析的字符数据
元素内容 : 指定的子元素
EMPTY: 代表空元素
ANY: 任何都可以
元素的出现次数可以选 :
      * 零次或多次
      + 一次或多次
      ? 零次或一次
      | 可选
 
2.     属性声明
属性:由 “=” 分隔的成对的属性名和属性值构成,只能出现在元素标记的内部。结束标记不能带属性,一个元素可以具有多个属性
<!ATTLIST 对应的元素名 属性名 属性取值类型 属性默认值 >
                 属性取值类型
                 1 CDATA :可析字符
                 2 Enumerated: 枚举类型,由 “|” 分隔的可能的属性值列表
                 3 Entity: 实体
                 4 ID 属性值 : 属性值不能重复
                 属性默认值:
                 注意
                       1 #REQUIRED: 必须提供属性值
                       2 IMPLIED :可提供也可不提供
3. FIXED: 不能修改
3.     实体声明
<!ENTITY 实体名字 “hello world!”>
& 实体名字
 
名域空间 :
什么是名域空间 ? 干什么用的 ?
解决 XML 文档中命名冲突的问题,即将 XML 文档与引用 URI 标识的名域相结合,来限定其中的元素和属性名
名域的声明 :
1.      直接定义
类比 : 名字和身份证
语法 :xmlns: 名域前缀 =”url”( 唯一性 )
2.      缺省声明
xmlns=”url”
名域的使用 :
1.      用名域限定元素
2.      用名域限定属性
 
解析器 :
什么是解析器 ? 有什么用 ?
1.      读取 XML 文档
2.      如果有 DTD, 也拿过来读 , 分析 XML 的结构内容并进行处理 ( XML 文档中得到信息 )
3.      验证 XML 是否格式良好有效
 
JAVA 中解析 XML 文档 (XML 有四种解析方式 )
java 中如何解析一个 xml 文档呢 ?
先看看 xml 的解析方式
xml 有四种解析方式 :
1.      Dom: 文档对象模型
2.      SAX: 事件机制驱动
3.      Jdom
4.      JADP
SAX:
基于事件处理模型 , 在读取 XML 文件时会触发相应的事件 , 这些事件被预先注册的事件处理器来处理
优点 : 速度快 , 占用的资源少 , 边读边解析 , 适合要求快速处理 XML 文档的场合 , :Applet
缺点 : 不能前后遍历 , 不能增删改
/**
 * 知识点 :
 * SAX 解析方式来解析 XML 文档
 * 程序目标 :
 * java 文件 :
 * MyContentHander.java: 监听器类 (SAX 解析方式是基于事件处理的方式 )
 * java 中解析一个 XML 文档 , 将里面的元素读取出来打印到终端上
 * 要求使用 SAX 解析方式
 * 流程 :
 * 1. 得到工厂对象
 * 2. 使用工厂对象创建 SAXParser
 * 3. 使用 SAXParser 对象得到一个 XMLReader 对象 , 这个对象可以解析 XML 文档
 * 4. XMLReader 对象注册监听器
 * 5. 使用 XMLReader 对象的 parse() 方法执行 XML 文件进行解析
 */
package MY.SAX;
import java.io.IOException;
 
import javax.xml.parsers.*;
 
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class SAXTest {
      
       public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
              // TODO Auto-generated method stub
              SAXParserFactory factory=SAXParserFactory.newInstance();
              SAXParser sp=factory.newSAXParser();
              XMLReader xr=sp.getXMLReader();
              InputSource is=new InputSource(new String("student.xml"));
              xr.setContentHandler(new MyContentHander());
              xr.parse(is);
//          xr.parse("student.xml");
       }
 
}
package MY.SAX;
 
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
public class MyContentHander extends DefaultHandler{
 
       @Override
       public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
              // TODO Auto-generated method stub
              System.out.println(new String(arg0,arg1,arg2));
       }
 
       @Override
       public void endDocument() throws SAXException {
              // TODO Auto-generated method stub
              System.out.println("end");
       }
 
       @Override
       public void endElement(String arg0, String arg1, String arg2) throws SAXException {
              // TODO Auto-generated method stub
              System.out.println(arg1);
       }
 
       @Override
       public void startDocument() throws SAXException {
              // TODO Auto-generated method stub
              System.out.println("start");
       }
 
       @Override
       public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
              // TODO Auto-generated method stub
              System.out.println(arg1);
       }
      
}
 
DOM: 文档对象模型
将整个 XML 文件读到内存中 , 然后转化为一棵由各种节点组成的树
优点 : 可以前后遍历 XML, 也可以增删改任意的节点
缺点 : 占用的资源多 , 速度慢 , 不适合处理大型的 XML 文档
/**
 * 知识点 :
 * DOM 解析方式解析一个 XML 文件
 * 程序目标 :
 * XML 文件中的元素属性全部打印出来
 */
package MY.DOM;
 
import java.io.IOException;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
 
public class DomTest {
      
       public static void test(Node start){
              System.out.println("nodeName:"+start.getNodeName()
                            +" nodeValue:"+start.getNodeValue());
              for(Node child = start.getFirstChild();
              child!=null;child = child.getNextSibling()){
                     test(child);
              }
       }
       public static void test2(Node start){
              System.out.println("NodeName:"+start.getNodeName()
                            +" nodeValue:"+start.getNodeValue());
              if(start.getNodeType()==Node.ELEMENT_NODE){
                     NamedNodeMap nnm=start.getAttributes();
                     for(int i=0;i<nnm.getLength();i++){
                            Node node=nnm.item(i);
                            System.out.println("attName:"+node.getNodeName()
                                          +"attValue:"+node.getNodeValue());
                     }
              }
              for(Node child = start.getFirstChild();
              child!=null;child = child.getNextSibling()){
                     test2(child);
              }
       }
       public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
              // TODO Auto-generated method stub
              DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
              DocumentBuilder builder=dbf.newDocumentBuilder();
              Document doc=builder.parse("student.xml");
              Element e=doc.getDocumentElement();
              test2(e);
       }
 
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值