你的位置:首页 > Java教程

[Java教程]xml语法、DTD约束xml、Schema约束xml、DOM解析xml


今日大纲

1、什么是

2、

3、DTD约束

4、Schema约束

5、DOM解析

1、什么是

1.1、

在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据。而html使用的标签html语言规定好的,每个标签都有自己特定的功能。

1.2、

  

<soft>      <A>          <A1></A1>         <A2></A2>      </A>      <B>          <B1></B1>          <B2></B2>      </B>  </soft>

2、

2.1、文档声明

来声明当前的<??> 在这个尖括号中书写标签的属性来声明当前的<??>例如:<??>在定义<?之间不能有空白的内容    ?> 它们之间也不能有空格中间书写的属性使用空格隔开。

2.2、元素(标签)

<a1>  <A1>表示2个不同的标签。<a1><b1></b1></a1><a1><b1></a1></b1><网址>www.itcast.cn</网址>标签不能以数字开始,不建议以下划线开始,同时在标签名中不要使用冒号。标签名可以是中文,但是一定指定能够识别中文的码表。但不建议书写中文。

2.3、属性

在定义标签的时候,可以在标签上书写属性,属性是由key和alue值组成。属性名书写的时候也遵守标签名的规则。属性值也不能以数字开始。属性和值之间使用=连接,属性值可以使用单引号也可以使用双引号。<user uid=”u001” name=”zhang’san”></user>另外:在><type>text</type></input>

2.4、注释

<!-- 这里书写具体的注释内容 -->在eclipse中可以使用ctrl + shift + c 给每行添加注释,也可以使用ctrl + shift + / 添加注释 ctrl + shift + \ 取消注释注释不能加在声明中及声明前。

2.5、文本和特殊字符

在编写<![CDATA[ 内容 ]]>  <![CDATA[    <itcast>      <br/>    </itcast>  ]]>对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

 

2.6、特殊指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析<??>处理指令必须以“<?”作为开头,以“?>”作为结尾,

2.7、
所有

3、DTD约束

3.1、约束介绍

  由于

3.2、DTD约束快速入门 

  第一步:先自己定义一个

<??><users>  <user>    <name>zhangsan</name>    <age>23</age>    <addr>shanghai</addr>  </user>  <user>    <name>lisi</name>    <age>24</age>    <addr>beijing</addr>  </user></users>

  第二步:书写DTD文件来约束

  DTD文件在定义的时候,扩展名就是dtd。

  在

<??><!ELEMENT users (user+) ><!ELEMENT user (name,age,addr) ><!ELEMENT name (#PCDATA) ><!ELEMENT age (#PCDATA)><!ELEMENT addr (#PCDATA)>

3.3、DTD引入方式

DTD主要用来约束<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">文档根结点 指的是当前<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">文档根结点 指的是当前<!DOCTYPE 根标签名 [具体的标签的约束]>

<??><!DOCTYPE users[  <!ELEMENT users (user+) >    <!ELEMENT user (name,age,addr) >    <!ELEMENT name (#PCDATA) >    <!ELEMENT age (#PCDATA) >    <!ELEMENT addr (#PCDATA) >  ]><users>  <user>    <name>zhangsan</name>    <age>23</age>    <addr>shanghai</addr>  </user>  <user>    <name>lisi</name>    <age>24</age>    <addr>beijing</addr>  </user></users>

3.4、DTD的语法介绍

3.4.1、元素

当定义DTD约束<!ELEMENT 标签名 约束> 约束来限定当前标签中可以有的子标签,或者当前标签中可以书写的内容在定义标签名的时候,约束中可以使用一些符号标签具体出现次数?  零次或者一次* 零次或者多次+  一次或者多次  users (user+)  表示当前的users标签下可以有一个或者多个user标签,  用来限定当前的子标签出现的顺序user (name,age,addr) user标签下只能有name age addr 子标签,并且必须按照name age addr的顺序书写| user (name|age,addr) user下可以name或者age ,但必须有addr,并且addr必须name或age后面#PCDATA    表明该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明EMPTY  表明该元素不能有任何子元素或文本,仅可以使用属性。ANY    表该元素中可以包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY><!ELEMENT age EMPTY > 当前的age标签是个空标签,它不能有文本内容。

3.4.2、属性

在<!ATTLIST 标签名 属性名 属性的类型 属性的约束>如果一个标签上有多个属性<!ATTLIST 标签名 属性名 属性的类型 属性的约束                 属性名 属性的类型 属性的约束 属性名 属性的类型 属性的约束><标签名 属性1=”” 属性2=”” 属性3=”” >

属性的类型:CDATA 属性的value值可以是文本数据(值1 | 值2 | 值3....  ) 表示当前的属性的value值只能是当前括号中的值ID 表示唯一。对当前标签上的id属性进行限定,并且同一个

属性的约束:REQUIRED 属性是必须书写的Implied 属性是可选得#fixed value 属性的value是固定的值  “值” 代表属性的默认值user name CDATA fixed “zhangsan”<user name=”zhangsan”>user name CDATA “张三”<user />

属性的类型和约束的组合:CDATA  REQUIREDCDATA  ImpliedCDATA  fixedCDATA “值” (值1 | 值2 | 值3....  ) REQUIREDID  REQUIRED

3.4.3、实体

实体用于为一段内容创建一个别名,以后在<!ENTITY …>语句用于定义一个实体。实体可以理解成Java中预先定义好的一个常量,然后

<??><!DOCTYPE users[  <!ELEMENT users (user+) >    <!ELEMENT user (name,age,addr) >    <!ELEMENT name (#PCDATA) >    <!ELEMENT age EMPTY >    <!ELEMENT addr (#PCDATA) >    <!ATTLIST user id ID #REQUIRED >  <!ENTITY abc "上海传智播客123123">]><users>  <user id="u001">    <name>zhangsan</name>    <age></age>    <addr>&abc;</addr>  </user>  <user id="u002">    <name>lisi</name>    <age/>    <addr>&abc;</addr>  </user></users>

4、Schema约束

4.1、
Schema它也来约束

4.2、Schema快速入门

  第一步:书写

<??><books>  <book>    <name>JavaWEB</name>    <author>老毕</author>    <price>182</price>  </book>  <book>    <name>SSH</name>    <author>老于</author>    <price>152</price>  </book></books>

  第二步:定义schema文件

在定义Schema文件的时候,由于这个Schema文件本身就是<schema ="http://www.w3.org/2001/  引入W3C定义的schema书写的规范targetNamespace="http://www.itcast.org/book" 给当前的Schema文件起名字(命名空间)作用是当哪个

<??><schema ="http://www.w3.org/2001/   targetNamespace="http://www.itcast.org/book"   elementFormDefault="qualified">  <element name="books">    <complexType>      <sequence>        <element name="book">          <complexType>            <sequence>              <element name="name"></element>              <element name="author"></element>              <element name="price"></element>            </sequence>          </complexType>        </element>      </sequence>    </complexType>  </element></schema>

  第三步:在

<books ="http://www.itcast.org/book"  它是schema文件中的targetNamespace 属性后面的值    xsi:schemaLocation="http://www.itcast.org/book book.xsd"  这个是在引入当前的schema文件的真实路径    ="http://www.w3.org/2001/  说明当前的>

4.3、Schema的名称空间

在定义Schema文件的时候,需要在<schema>根标签中使用targetNamespace 属性定义当前schema定义名称(只是一个分配的名字,根本没有指向任何文件),在被约束的

4.4、Schema中的标签解释

  Book2.xsd

<??><schema ="http://www.w3.org/2001/   targetNamespace="http://www.itcast2.org/book"   elementFormDefault="qualified">  <element name="books"> <!--name代表当前的-->    <complexType ><!-- complexType 当前的element声明的标签是复杂标签时 ,需要使用complexType来声明子标签-->      <sequence> <!-- 复杂标签是指有属性,或者有子标签,或者有属性有子标签的标签                 简单标签是指只有文本内容的标签                <name>zhangsan</name> 简单标签                <name id="u001"></name> 复杂标签                sequence 代表当前子标签的顺序              -->        <element name="book" maxOccurs="unbounded">          <complexType mixed="true"><!—mixed属性值为true,book元素间就可以出现字符文本数据了-->            <sequence>              <element name="name"></element>              <element name="author"></element>              <element name="price" type="integer"></element>              <any></any>            </sequence>          </complexType>        </element>      </sequence>    </complexType>  </element></schema>

  Name.xsd

<schema ="http://www.w3.org/2001/   targetNamespace="http://www.example.org/name"   elementFormDefault="qualified">  <element name="name"></element></schema>

  Book2.

<??><aa:books ="http://www.itcast2.org/book"  ="http://www.example.org/name"  ="http://www.w3.org/2001/  xsi:schemaLocation="http://www.itcast2.org/book book2.xsd             http://www.example.org/name name.xsd"  >  <aa:book>    aa:sjdlkfjlkdsjflk      <aa:name >JavaWEB</aa:name>    <aa:author >老毕</aa:author>    <aa:price>182</aa:price>    <bb:name>sdgs</bb:name>  </aa:book></aa:books>

5、DOM解析

5.1、Java中的解析技术介绍

w3c组织在定义

5.2、DOM解析

  

DOM解析是把整个

5.3、DOM获取节点、属性、文本数据

// 获取DOM标签的信息  @Test  public void get() throws Exception {    // 获取工厂实例对象    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    // 获取解析器对象    DocumentBuilder db = dbf.newDocumentBuilder();    // 解析    Document dom = db.parse("book.);    // 获取根元素:    Node node = dom.getFirstChild();    // 获取标签的名字    System.out.println(node.getNodeName());    // 获取到每个标签对象,都是一个element的实例对象    Element root = (Element) node;    // 获取books下面的所有book标签    NodeList nl = root.getElementsByTagName("book");    for (int i = 0; i < nl.getLength(); i++) {      // 获取到每个book标签对象      Element book = (Element) nl.item(i);      // NodeList book_child = book.getChildNodes();      Element name = (Element) book.getElementsByTagName("name").item(0);      Element author = (Element) book.getElementsByTagName("author")          .item(0);      Element price = (Element) book.getElementsByTagName("price")          .item(0);      // 获取name标签下的文本值      System.out.println(name.getTextContent());      // 获取标签上的属性值      System.out.println(name.getAttribute("id"));      // 获取author标签下的文本值      System.out.println(author.getTextContent());      // 获取price标签下的文本值      System.out.println(price.getTextContent());      System.out.println("-------------------");    }  }

5.4、修改
/*   * 修改dom中标签的信息   * 把books中的第二个book标签中的price的值改为100   *   */  @Test  public void update() throws Exception {    // 获取工厂实例对象    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    // 获取解析器对象    DocumentBuilder db = dbf.newDocumentBuilder();    // 解析    Document dom = db.parse("book.);    //使用dom树直接根据标签名获取对应的标签对象    Element book = (Element) dom.getElementsByTagName("book").item(1);    //获取price标签    Element price = (Element) book.getElementsByTagName("price").item(0);    price.setTextContent("100");    System.out.println(price.getTextContent());        //把修改的整个dom树重新写到文件中    TransformerFactory tff = TransformerFactory.newInstance();    //获取转换器    Transformer transformer = tff.newTransformer();    //和文件关联出去结果对象    StreamResult sr = new StreamResult("book.);    //把dom转成原始数据对象    DOMSource ds = new DOMSource(dom);    //保存数据    transformer.transform(ds, sr);  }

当要把修改后的

 TransformerFactory这个工厂负责生产一个把dom树写到文件中的对象

 Transformer 负责把一个dom写到文件中。

总结:

Java提供的dom操作方式:

第一步:需要获取到相应的工厂

第二步:根据工厂获取相应的工具或者解析器对象

第三步:根据解析器获取dom对象,再操作dom树中的节点,或者是获取到相应的工具,然后使用工具对dom树进行保存等操作