XML(一)

本文详细介绍了XML的基本概念及其应用,包括XML的历史背景、与HTML的区别、文档结构、良好的格式规范、语法及字符转义等内容,并探讨了DTD的作用及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目录
XML简介:
1.     什么是XML?有什么作用?
2.     XML的背景
3.     XMLHTML的关系
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) XMLW3C联盟发展维护;
3) XML是一种元语言,可以用来定义其它标签语言;
4) XML没有定义任何标记,它提供了一种工具定义标记以及它们之间的结构关系;
5) XML是一种用于结构化文本交换的标记语言;
6) XML代表了内容的结构也代表了内容本身;
7) XML继承自SGML(标准标记语言)SGML的前身GMLIBM1960年发明,用于描述设备无关的文本
8) XMLSGML的子语言,SGML简化而来,起初目的是为Web的结构文档提供服务。
9) W3C组织在1998210日发布XML1.0版,第二个版本发布于2000109日。
10)XML是分层的树形结构的自解释的一种可扩展的标记语言。
 
XMLHTML的关系:
事实上,HTMLXML不能够进行比较的。因为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:
<?xmlversion="1.0"standalone="no"?>
<!--必须名字都一样g-->
<!--这是一个内部调用DTD的方法-->
<!DOCTYPEg[
    <!ELEMENTg(#PCDATA)>
    ]>
<g>
</g>
注意:
studinfo(#PCDATA)有空格
文档类型名与根元素名必须一致
 
第二种,外部调用一个DTD文件
注意点:
              1standalone="no"
              2)注意dtd文件的路径
 
DTD的结构
1.     元素类型声明:
指明元素的名字和内容
<!ELEMENT 元素名字 (元素内容)>
元素内容=EMPTY || ANY || 元素内容 || #PCDATA
#PCDATA:可解析的字符数据
元素内容:指定的子元素
EMPTY:代表空元素
ANY:任何都可以
元素的出现次数可以选:
      * 零次或多次
      + 一次或多次
      ? 零次或一次
      | 可选
 
2.     属性声明
属性:由“=”分隔的成对的属性名和属性值构成,只能出现在元素标记的内部。结束标记不能带属性,一个元素可以具有多个属性
<!ATTLIST 对应的元素名属性名属性取值类型属性默认值>
                 属性取值类型
                 1CDATA:可析字符
                 2Enumerated:枚举类型,由“|”分隔的可能的属性值列表
                 3Entity:实体
                 4ID属性值:属性值不能重复
                 属性默认值:
                 注意
                       1#REQUIRED:必须提供属性值
                       2IMPLIED:可提供也可不提供
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);
       }
 
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值