首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

xml概述及dtd约束小结

2012-12-22 
xml概述及dtd约束总结Xml概述:Xml的全称是Extensible Markup Language 可扩展标记语言。它是由SGML(Standar

xml概述及dtd约束总结
Xml概述:
Xml的全称是Extensible Markup Language 可扩展标记语言。它是由SGML(Standard Gerneralized Markup language)发展而来的,允许开发者自定标签,可以将标签和内容有效的分离。
1、Xml与html的区别:
Xml用来传输和存储的数据的。它可以自定义标签.
Html:显示数据<p></p> <p><p>
所以说xml并不是用来代替html的,二者的为不同的目的而设计。
2、Xml的优势:
(1)简单易用
(2)严格的格式
---xml的基本语法
Xml是平台无关的数据交换语言,Java是平台无关的编程语言,有人为:xml与Java就是天生一对。
(3)数据逻辑与显示逻辑分离
---看似MVC模式理解
3、Xml文档的分类
(1)格式不良好(malformed)的xml文档:完全没有遵守xml文的基本规范的xml文档。
(2)格式良好(well-formed)的但无效的xml文档: 遵守xml文的基本规范,但没有使用dtd或schema定义语义约束的xml文档。
(3)有效(valid)的xml文档:遵守xml文的基本规范,并使用dtd或schema定义语义约束,而且也完全遵守了dtd或schema定义语义约束的xml文档。
4、Xml的声明
<?xml version=”1.0”?>
5、Xml元素的基本规则
   元素是xml文档的基本单元,xml文档就是一个一个层层嵌套的元素组成的。整个的xml文档从根元素开始,根元素包含若干个子元素,而每个子元素又可以包含若干个子元素,从而可以组成一个xml文档。
6、Xml标签语法:
   (1)Xml的标签分为两类:
     单标记:<商丘/>
     双标记:<中国></中国>
   (2)xml标签的要求:
   a标签名可以有字母(包括非西欧字符)、数字、下划线(_)、中划线(-)、冒号(:)和点 号(.)组成,但不能以数字、中划线和点号开头。
b标签名不能包含<、>、,、$等符号
C标签名种尽量不要出现英文的冒号(:),除非在使用命名空间。
d标签名不能以字符xml、XML等任意大小写组合开始。
e标签名不能包含空格。
f标签名区分大小写
   
     (3)xml标签嵌套子元素:xml允许深度嵌套子元素,只要保证元素之间合理的嵌套即可.而且xml元素可以嵌套多个重名的子元素,这多个子元素之间是有序的。
   第一个:xml:
<中国>
<北京>
     <海淀/>
     <朝阳></朝阳>
     <朝阳></朝阳>
</北京>
</中国>
第二个xml:
<中国>
<北京>
     <朝阳></朝阳>
     <朝阳></朝阳>
    <海淀/>
</北京>
</中国>

(4)空元素:空元素不可以接受子元素,也不可以接受字符串内容。
     第三个xml:
      <book>
        <name>redarmy</name>
        <content/>  :备注:空元素 但可以接受属性,而且可以接受多个属性
       </book>

      <book>
        <name>redarmy</name>
         <content></content> :备注它包好的是一个空格 空格也是字符
       </book>
例如空元素接受属性:
<book name=”Java建议” price=”30”/>
(5)字符数据
  <book>
     <computer>Struts2开发详解</computer>
    <computer> Struts2开发详解</computer>
  </book>
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理, 如果文本字符中包含了一些特殊的字符,例如<和&由于这些字符都有特殊的含义,因此直接在xml文档中使用该字符串将引起文档的混乱。
   <表达式>
       <比较符>1+3<6</比较符>
   </表达式>
文本字符串中包含了特殊的字符

有以下两种方法解决:
使用实体引用:用另一个特殊符号代替这些特殊符号

解决如下:
<?xml version="1.0" encoding="UTF-8"?>
  <表达式>
        <比较符>1+3&lt;6</比较符>
     </表达式>

使用CDATA标记:将整个文档定义成字符串。
在特殊标记CDATA下,所有的特殊字符,甚至是有效的元素都将被当成简单的字符串处理。实体引用也会失去作用,变成直接的文本。CDATA的语法格式如下:
<![CDATA[文本内容]]>
<?xml version="1.0" encoding="UTF-8"?>
  <表达式>
       <比较符>
  <![CDATA[
    1+3<6
   ]]>
</比较符>
  </表达式>
   备注:由于xml文档根本不会对CDATA标记内容进行任何解析,因此在 CDATA内可以放置任何内容,其中的内容永远不会出错。
(6)注释
Xml文档还可以加入解释用的字符数据,这些解释用的字符串不会被xml解析器处理。这些解释用的文本称为注释。Xml的文档注释与html完全一致。
Xml注释的语法格式如下:
<!--注释字符串 -->
Xml的注释允许包含元素和标签。
注意:
Xml的注释不能够放在标签体内。
不要把xml文档放在xml文档声明之前  xml文档的声明永远在第一行
不在注释中使用双中划线(--)
…..



(7)处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
处理指令用于给处理xml文档的应用程序提供信息,告诉处理程序应该如何处理该文档。一个完备的xml文档的处理程序,可以读取xml文档的处理指令,并根据处理指令进行相应处理,或将它传给下一个程序。
Xml处理指令的格式如下:
<?处理指令名 处理指令信息?>

(8)属性
xml属性的特征:
a、xml元素的属性必须有属性值,属性值必须用引号引起来。
b、同一个xml元素里不能有多个同名的属性
c、Xml元素里的多个属性之间没有先后顺序。
<book>
     <isbn>123456780</isbn>
     <book_name>Java讲义</book_name>
     <price>99</price>
</book>
比如说 这个book本身就有 isbn  book_name price的属性
那么 <book isbn=”” book_name=”” price=””/>

Xml文档的整体结构
必须有一个根元素(有且只有一个)
元素必须合理结束
元素之间必须合理嵌套
元素的属性必须有属性值,只要不满足上面的条件就是一个格式不良好的xml文档,只要满足上面的条件就是一个格式良好的xml文档,并且遵守了dtd或者schema就是一个有效的xml文档。

DTD约束:
1、Dtd约束包括那几个方面
定义xml的根元素、内容和结构
定义xml文档中可以接受那些元素
定义xml文档里每个元素接受的合法内容,包括是否为空,是可以是文本,可以接受那些子元素,子元素出现的顺序和子元素出现次数等。
定义xml文档中每个元素能接受那些属性
定义xml文档中每个属性的类型,能接受那些值,以及元素对属性的约束等。
定义属性的固定值和默认值
定义xml文档或dtd中可以使用的实体。
2、引入dtd的方式
内部dtd
语义约束与xml文档的内容放在同一个xml文档中。内部dtd紧跟在xml声明和处理指令之后,以<!DOCTYPE 开始,以]>结束。其语法格式如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名[
       元素描述
]>
xml文档主体部分
外部dtd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名 SYSTEM "外部的DTD的URL地址">
公用dtd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名 PUBLIC  "DTD的标识名"  "公用的DTD的URL地址">定义一个元素
<!ELEMENT 元素名(子元素,)>
       <!ELEMENT 元素名(#PCDATA)>
3、DTD的文档结构如下:
   第一行是DTD声明部分 该声明与xml文档的生命语法格式相同
   0到多个注释部分,DTD注释与xml文档的注释完全相同
   0到多个<!ELEMENT…..>定义 每个它就是一个xml元素
   0到多个<!ATTLIST…..>定义每个它就是一个xml元素的属性
   0到多个<!ENTITY…..>定义每个它就是一个实体
   0到多个<!NOTATION…..>定义 每个它定义一个符号
彼此之间完全独立,无须相互嵌套。
4、定义元素
      元素类型的定义的全称是:Element Type Defintion,简称ETD,它不但会定义每个文件中可能存在的元素,给元素的名称,而且会定义元素的具体类型。
元素类型描述主要有5种:
任意类型
   可以是以下四种的内容
语法格式:
  <!ELEMENT 元素名 ANY>
字符串值 
空元素 <br/>
<!--空元素-->
<!ELEMENT 元素名 EMPTY>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book EMPTY>
]>
包含子元素
混合类型
<!--定义字符串内容的元素-->、
<!ELEMENT 元素名 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name,price,author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
5、定义子元素
有序的子元素(,)
(,)用于分隔有序的子元素
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name,price,author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<book>
      <computer>
             <book_name>JavaWeb开发</book_name>
             <price>30.0</price>
<author>redarmychen</author>
      </computer>
   <computer>
             <book_name>CSS应用程序的开发</book_name>
<price>1000</price>
<author>redarmy_Chen</author>
</computer>
</book>
互斥的子元素
互斥的子元素表明一系列的子元素中只能出现其中之一。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name|price|author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<book>
       <computer>
             <book_name>JavaWeb开发</book_name>
       </computer> 
        <computer>
             <price>30</price>
       </computer>
   <computer>
<author>redarmy_Chen</author>
   </computer>
</book>

子元素出现的频率
  +: 一次或多次 (书+)
?: 0次或一次 (书?)
    *: 0次或多次  (书*)
注意:混合类型的频率只能安如下方式加:
<!ELEMENT computer (#PCDATA|book_name|price|author)*>
//#PCDATA以它开头的是混合类型 频率只能在最后加
组合子元素
<!ELEMENT computer (book_name|price|author)>
无序的子元素
6、定义属性
<!ATTLIST属性所属元素  属性名  属性类型[元素对属性的约束][默认值]>
元素对属性的约束|默认值是可选的对于它们的使用有如下的情况:
在没有指定”元素对属性的约束”时,必须为该属性增加默认值。
在元素对属性的约束是:#REQUIRED时,不能为该属性指定默认值。
在元素对属性的约束是:#IMPLIED时,不能为该属性指定默认值
在元素对属性的约束是:#FIXED时,必须为该属性指定默认值
#REQUIRED:必须的属性
#IMPLIED:可有可无
    #FIXED:固定值
<水果 品名=”苹果” 颜色=”绿色”>关于水果的元素</水果>
属性类型
类型说明
CDATA字符串数据 character data
(e1|e2|e3)该属性是一系列枚举值之一
IDId必须是唯一的
IDREF引用自己已经定义的id
IDREFS空格区分多个id
ENTITY是一个外部的实体
ENTITIES多个外部实体,多个外部实体之间用空格分隔
Xml:预定义的xml值



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 购物车[
  <!ELEMENT 购物车 (肉*,水果*,玩具)>
  <!ELEMENT 肉 EMPTY>
  <!ELEMENT 水果 EMPTY>
  <!ELEMENT 玩具 EMPTY>
 
  <!ATTLIST 肉 类型 (鸡肉|牛肉|狗肉) #REQUIRED>
  <!ATTLIST 水果  类型  (苹果|梨|香蕉) #IMPLIED>
  <!ATTLIST 玩具 类型  CDATA #FIXED "地雷">
 
]>

<购物车>
     <肉 类型="狗肉"/>
     <水果/>
     <玩具 类型="地雷"/>
</购物车>

7、dom的增删改查操作

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 中国[
    <!ELEMENT 中国 (北京,河南*,河北)>
    <!ELEMENT 北京 (海淀)>
    <!ELEMENT 海淀 (上地,中关村,东北旺*)>
    <!ELEMENT 河南 (郑州,安阳)>
    <!ELEMENT 郑州 (商丘)>
    <!ELEMENT 河北 (石家庄)>
   
    <!ELEMENT 上地 (#PCDATA)>
    <!ELEMENT 中关村 (#PCDATA)>
    <!ELEMENT 东北旺 (#PCDATA)>
    <!ELEMENT 商丘 (#PCDATA)>
   
    <!ELEMENT 安阳 EMPTY>
    <!ELEMENT 石家庄 EMPTY>
   
   
    <!ATTLIST 商丘 人口 CDATA #IMPLIED>
    <!ATTLIST 安阳 人口 CDATA #IMPLIED>
    <!ATTLIST 石家庄 人口 CDATA #IMPLIED>
    <!ATTLIST 商丘 id ID #REQUIRED>
   
   
]>

<中国>
<北京>
<海淀>
<上地>上地七街</上地>
<中关村>鼎好</中关村>
<东北旺>软件园</东北旺>
</海淀>
</北京>

<河南>
<郑州>
<商丘 人口="100万" id="attr">商丘中学</商丘>
</郑州>

<安阳 />
</河南>

<河北>
<石家庄 人口="2000万"/>
</河北>
</中国>

在海淀内添加含有家的东北旺元素:
public void test()throws Exception{
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder  = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src\\dom.xml"));
Element element = doc.createElement("东北旺");
element.appendChild(doc.createTextNode("家"));
Node node = doc.getElementsByTagName("海淀").item(0);
node.appendChild(element);
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src\\dom.xml"));
}
在上地前面添加东北旺:
public void test1()throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
            Documentdocument=builder.parse(new      File("src\\cn\\csdn\\node\\china.xml"));

Element element=document.createElement("东北旺");
element.appendChild(document.createTextNode("学校"));
Node node=document.getElementsByTagName("海淀").item(0);
Node sd=document.getElementsByTagName("上地").item(0);
node.insertBefore(element, sd);
//node.appendChild(element);
TransformerFactory factory1=TransformerFactory.newInstance();
Transformer trformer=factory1.newTransformer();
trformer.transform(new DOMSource(document), new StreamResult(new File("src\\cn\\csdn\\node\\china.xml")));
}

删除第一个东北旺:
public void test1()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder  = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src\\dom.xml"));
Node node = doc.getElementsByTagName("海淀").item(0);
node.removeChild(doc.getElementsByTagName("东北旺").item(2));
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src\\dom.xml"));

}
修改将东北旺中的软件园改为中关村:
public void test2()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder  = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src\\dom.xml"));
Node node1 = doc.getElementsByTagName("东北旺").item(0);
node1.setTextContent("中关村");
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src\\dom.xml"));

}


















热点排行