XML语法与解析

来源:互联网 发布:网络设计收获与体会 编辑:程序博客网 时间:2024/05/29 18:17
XML:eXtensible Markup Language 可扩展标记语言 version="1.0"
* 可扩展:所有的标签都是自定义的。  
* 功能:数据存储
* 配置文件
* 数据传输

* html与xml区别:
* html语法松散,xml语法严格
* html做页面展示,xml做数据存储
* html所有标签都是预定义的,xml所有标签都是自定义的

W3C:word wide web consortiem  万维网联盟
xml语法:
* 文档声明:
* 必须写在xml文档的第一行。
* 写法:<?xml version="1.0" ?>
* 属性:
* version:版本号 固定值 1.0
* encoding:指定文档的码表。默认值为 iso-8859-1
* standalone:指定文档是否独立  yes 或 no


* 元素:xml文档中的标签
** 文档中必须有且只能有一个根元素
* 元素需要正确闭合。<body></body> <br/>
* 元素需要正确嵌套
* 元素名称要遵守:
* 元素名称区分大小写
* 数字不能开头

* 文本:
* 转义字符:&gt;
* CDATA: 里边的数据会原样显示
*  <![CDATA[ 数据内容 ]]>

* 属性:
* 属性值必须用引号引起来。单双引号都行
* 注释:
<!-- -->
* 处理指令:现在基本不用
<?xml-stylesheet type="text/css" href="1.css"?>

xml约束:
* 约束就是xml的书写规则
* 约束的分类:
dtd:
dtd分类:
* 内部dtd:在xml内部定义dtd
* 外部dtd:在外部文件中定义dtd
* 本地dtd文件:<!DOCTYPE students SYSTEM  "student.dtd">

* 网络dtd文件:<!DOCTYPE students PUBLIC "名称空间"  "student.dtd">

        student.dtd

      <!ELEMENT students (student*) >
     <!ELEMENT student (name,age,sex)>
     <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>

   student.xml

     <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM  "student.dtd">
<students>
<student number="s0001" >
<name>zs</name>
<age>abc</age>
<sex>yao</sex>
</student>
</students>


schema:
导入xsd约束文档:
1、编写根标签
2、引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3、引入名称空间 xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"

4、引入默认的名称空间


            student.xsd

            <?xml version="1.0"?>
<xsd:schema xmlns="http://www.itheima.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itheima.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="itheima_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 


   student.xml

    <?xml version="1.0" encoding="UTF-8" ?>
<!-- 
1、编写根标签
2、引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3、引入名称空间 xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4、引入默认的名称空间
 -->


<students 
xmlns="http://www.itheima.cn/xml"
xsi:schemaLocation="http://www.itheima.cn/xml student.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<student number="itheima_1001">
<name>asfd</name>
<age>12</age>
<sex>male</sex>
</student>

</students>



XML解析:
* 解析xml可以做:
* 如果xml作为配置文件:读取
* 如果xml作为传输文件:写,读
* xml解析思想:
* DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
* 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
* 缺点:dom树非常占内存,解析速度慢。

Document
Element
Text
Attribute
Comment

* SAX:逐行读取,基于事件驱动
* 优点:不占内存,速度快
* 缺点:只能读取,不能回写

* xml常用的解析器:
* JAXP:sun公司提供的解析。支持dom和sax。
* JDOM:
* DOM4J:dom for java民间方式,但是是事实方式。非常好。  支持dom
1.导入jar包 dom4j.jar
2.创建解析器
SAXReader reader = new SAXReader();
3.解析xml 获得document对象 
Document document = reader.read(url); 

* XPATH:专门用于查询
* 定义了一种规则。
* 使用的方法:
* selectSingleNode():
* selectNodes():
使用步骤:
1、注意:要导包 jaxen...jar
2、创建解析器
SAXReader reader = new SAXReader();
3、解析xml 获得document对象 
Document document = reader.read(url);

* 解析XML:
// 1、得到某个具体的节点内容
// 2、遍历所有元素节点

XPath:
// nodename 选取此节点。
// /从根节点选取。
// //从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
// ..选取当前节点的父节点。
// @选取属性。
//      [@属性名]    属性过滤
//      [标签名]     子元素过滤

 Book.xml
<?xml version="1.0" encoding="UTF-8"?>
       <书架> 
          <书 出版社="北京"> 
            <书名>Java</书名>  
           <作者>李刚</作者>  
          <单价>10</单价>  
        <批发价>20</批发价> 
       </书>  
        <书> 

      <书名>Strut2</书名>  
       <作者李刚</作者>  
       <单价>10</单价> 
     </书> 
  </书架>


TestDom4j.java

package com.itheima.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class TestDom4j {
@Test// 1、得到某个具体的节点内容:第2本书的书名
public void test1() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
    Document document = reader.read("src/Book.xml");//把xml文档加载到document对象中
    Element root = document.getRootElement();
   /* Element bookNode = root.element("书");
    System.out.println(bookNode.getName());*/
    List list = root.elements();//得到当前节点的所有子节点
    Element secondBook = (Element) list.get(1);//得到第二本书对象
    String name = secondBook.element("书名").getText();//得到当前节点的文本内容
    System.out.println(name);
}

@Test // 2、遍历所有元素节点
public void test2() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
    Document document = reader.read("src/Book.xml");//把xml文档加载到document对象中
    Element root = document.getRootElement();
    treeWalk(root);
}


private void treeWalk(Element ele) {
System.out.println(ele.getName());//输出当前节点的名子
for (int i = 0; i < ele.nodeCount(); i++) {//ele.nodeCount()得到当前节点的所有子节点的数量
Node node = ele.node(i);//取出下标为i的节点 
if(node instanceof Element){//判断当前节点是否为标签
treeWalk((Element)node);//把node强转为标签(Element)
}else{
System.out.println(node.getText());
}
}
}

}

TestXPath.java

package com.itheima.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;


public class TestXPath {
@Test
public void test() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/Book.xml");
Node node = document.selectSingleNode("/书架/书[2]/书名");
System.out.println(node.getText());
}

@Test
public void test2() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/Book.xml");
List list = document.selectNodes("//*");
for (int i = 0; i < list.size(); i++) {
Node node = (Node)list.get(i);
System.out.println(node.getName()+"\t"+node.getText());
}
}
}


原创粉丝点击