当前位置: 首页 > 图文教程 > XML家族 > XML > XML(一)

XML
XML简易教程之四
XML与HTML的结合(上)
XML与HTML的结合(下)
XML入门的常见问题(一)
XML入门的常见问题(二)
XMLHTTP资料
什么是XML
什么是 XML Web Service
XML正在接管Web服务 成为SOA的基础
怎么样在网页上读取远程xml的数据
XML教程—编写结构完整的XML文档
读写xml文件的2个小函数
XML文档的基本操作
初学者如何开发出一个高质量的J2EE系统
优化 JavaScript 代码
自动更新程序的设计框架
使Firefox对XML的处理兼容IE的节点处理方法
WML学习之四 锚和任务
WML学习之五 显示表单
WML学习之六 事件

XML(一)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 40 ::
收藏到网摘: n/a

.1、上次课程的主要知识点
 1、 RMI程序设计
2.2、本次预计讲解的知识点
 1、 了解DTD的基本语法
 2、 熟练应用XML解析:DOM、SAX、JDOM
3、具体内容
3.1、认识XML
 XML:可扩展的标记性语言,本身可以扩充标记。
 标记:在HTML中的<h1>、<h2>都属于标记,但是这些在HTML中的标记都是固定的,但是在XML中所有的标记都将由用户自己定义。
 HTML与XML都属于标记性语言,两者实际上都来源于最早的SGML语言。例如,以下使用两种风格的代码来表示一个电话本的页面:
例如:使用HTML表示:
<html>
 <head><title>html</title></head>
 <body>
  <ul>
   <li>zhangsan
   <ul>
    <li>123456
    <li>234567
    <li>345678
   </ul>
  </ul>
 </body>
</html>
 以上的程序代码已经表现出了一个电话本。但是以上的所有标记都没有明确的表示出来一个信息的具体作用。HTML只是通过标记把内容显示出来了。此时,如果使用XML则,代码形式如下:
例如:使用XML表示
<?xml version="1.0"?>
<notepad>
 <person>
  <name>zhangsan</name>
  <tels>
   <tel>123456</tel>
   <tel>234567</tel>
   <tel>345678</tel>
  </tels>
 </person>
</notepad>
 从以上的程序中可以很方便的看出那个元素表示的是姓名,那个元素表示的是电话。
 HTML中的标记主要功能是用来显示内容
 XML中的标记主要内容是用来表示数据的结构。在数据的交换或通讯上使用较多。
 在XML文件中编写也是有其严格的要求的,XML文件的组成部分:
 1、 前导区:
  • 指的是使用<?xml ?>声明的部分,例如:
<?xml version="1.0"?>
以上的代码就使用了前导区的声明,在此处必须声明XML的版本,版本现在有且只有1.0。在声明的部分还可以指定本文件的编码。
<?xml version="1.0" encoding="GBK"?>
 2、 数据区
  对于XML文件来说,数据区中的所有元素里必须存在一个根节点。
  所有的元素都必须完结。或写成空元素
  标记的名称可以是中文。
<?xml version="1.0" encoding="GBK"?>
<通讯录>
 <人员>
  <姓名>张三</姓名>
  <电话号码>
   <电话>123456</电话>
   <电话>234567</电话>
   <电话>345678</电话>
  </电话号码>
 </人员>
</通讯录>
 3、 可以在XML中引入CSS样式
demo04.css:
name{
 font-weight:bold;
 font-size:14px;
 color:#990000;
 line-height:17px;
}
tel{
 font-size:12px;
 color:#666666;
 line-height:17px;
}
demo04.xml:
<?xml version="1.0" encoding="GBK"?>
<?xml-stylesheet type="text/css" href="demo04.css"?>
<notepad>
 <person>
  <name>张三</name>
  <tels>
   <tel>123456</tel>
   <tel>234567</tel>
   <tel>345678</tel>
  </tels>
 </person>
</notepad>
 也可以为XML中的每一个标记增加若干个属性。属性必须使用“"”括起来。
<?xml version="1.0" encoding="GBK"?>
<notepad>
 <person id="001">
  <name>张三</name>
  <tels>
   <tel>123456</tel>
   <tel>234567</tel>
   <tel>345678</tel>
  </tels>
 </person>
</notepad>
 以上的id就属于person中的一个属性,对于XML文件来说,一个内容是定义成属性或是元素本身没有任何的区别,如果数据需要被显示出来的话,则一般都会定义成元素(标记),而如果不需要显示的,则一般都会将其定义成属性。
 在XML中对于以下的元素是有特殊意义的:>、<、"、'、&,如果现在要在XML元素的内容中出现以上的符号,则代码必须进行转义。进行实体参照,具体的对应列表如下:
No. 对应字符 实体参照名称
1 < &lt;
2 > &gt;
3 " &quot;
4 ' &apos;
5 & &amp;
例如:以下使用了实体参照进行数据的显示
<?xml version="1.0" encoding="GBK"?>
<notepad>
 <person id="001">
  <name>张三</name>
  <book>&lt;&lt;java基础&gt;&gt;</book>
 </person>
</notepad>
 在XML中也是支持注释操作的,存在两种注释:
  • <!-- 注释内容 -->:HTML风格的注释
  • 是直接使用CDATA标记声明的注释
CDATA注释:
<![CDATA[  注释内容  ]]>
使用注释:
<?xml version="1.0" encoding="GBK"?>
<notepad>
 <person id="001">
  <name>张三</name>
  <book>&lt;&lt;java基础&gt;&gt;</book>
  <![CDATA[
   ":"""""^&%%##$%^$@^$@#^<><><><><>@##@#@!$#@""''''&&&&
  ]]>
 </person>
</notepad>
3.2、XML解析(绝对重点)
 DOM和SAX都是一种解析的标准。
  程序 ? 解析的标准 ? XML文件
3.2.1、DOM解析
 DOM操作中所有的内容首先必须形成一张完整的DOM树,否则是无法解析的。那么就意味着,DOM解析操作中是要将全部的XML文件内容都读取进来的。
<?xml version="1.0" encoding="gb_2312" ?>
<addressbook>
 <person sex="male">
  <name>张三</name>
  <email>[email protected]</email>
 </person>
 <person sex="male">
  <name>李四</name>
  <email>[email protected]</email>
 </person>
</addressbook>
 以上的文挡如果要使用DOM解析,则会首先形成如下的DOM树:
 
 在DOM中所有的内容全都是节点,连文字本身也是一个节点。
例如:给出以下的XML文档
<?xml version="1.0"?>
<people>
 <person>zhangsan</person>
</people>
 将以上文档中的里面的内容读取出来。
 DOM操作的流程:
  1、 建立DocumentBuilderFactory
  2、 建立DocumentBuilder
  3、 建立Document
  4、 建立节点集合:NodeList
  5、 循环进行XML解析
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class DOMDemo01 {
 public static void main(String[] args) throws Exception{
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null ;
  factory = DocumentBuilderFactory.newInstance() ;
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder() ;
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.parse("e:\\demo.xml") ;
  NodeList nl = doc.getElementsByTagName("person") ;
  System.out.println(nl.item(0).getFirstChild().getNodeValue());
 }
}
 NodeList一开始找的是person节点,但是在一个XML文件之中可能同时包含多个person节点,所以里面的item(0)就表示找到第一个person节点,之后在找到第一个person节点中的第一个子节点(文本节点)再求出里面的内容。
 在以上的程序做进一步的扩展应用。
例如:修改xml文件的内容:
<?xml version="1.0"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>female</sex>
 </person>
</people>
 现在要求把姓名、年龄、性别解析出来。必须先将指定的元素从person? name ? text。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo02 {
 public static void main(String[] args) throws Exception {
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null;
  factory = DocumentBuilderFactory.newInstance();
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder();
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.parse("e:\\demo.xml");
  NodeList nl = doc.getElementsByTagName("person");
  Element per = (Element) nl.item(0); // 定位节点到person之中
  System.out.println(per.getElementsByTagName("name").item(0)
    .getFirstChild().getNodeValue());
  System.out.println(per.getElementsByTagName("age").item(0)
    .getFirstChild().getNodeValue());
  System.out.println(per.getElementsByTagName("sex").item(0)
    .getFirstChild().getNodeValue());
 }
}
 如果在一个<people>元素中包含了多个<person>节点呢?
<?xml version="1.0"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>female</sex>
 </person>
 <person>
  <name>lisi</name>
  <age>31</age>
  <sex>male</sex>
 </person>
</people>
 解析时只能采用循环的方式完成。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo03 {
 public static void main(String[] args) throws Exception {
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null;
  factory = DocumentBuilderFactory.newInstance();
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder();
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.parse("e:\\demo.xml");
  NodeList nl = doc.getElementsByTagName("person");
  for(int x=0;x<nl.getLength();x++){
   Element per = (Element) nl.item(x); // 定位节点到person之中
   System.out.println(per.getElementsByTagName("name").item(0)
     .getFirstChild().getNodeValue());
   System.out.println(per.getElementsByTagName("age").item(0)
     .getFirstChild().getNodeValue());
   System.out.println(per.getElementsByTagName("sex").item(0)
     .getFirstChild().getNodeValue());
  }
 }
}
思考:如果每一个人会有多个地址,那么该如何解析呢?XML文件如下:
<?xml version="1.0"?>
<people>
 <person>
  <name>zhangsan</name>
  <age>30</age>
  <sex>female</sex>
  <address>
   <addr>aaaaaaa</addr>
   <addr>bbbbbbb</addr>
   <addr>ccccccc</addr>
  </address>
 </person>
 <person>
  <name>lisi</name>
  <age>31</age>
  <sex>male</sex>
  <address>
   <addr>ddddddd</addr>
   <addr>eeeeeee</addr>
  </address>
 </person>
</people>
解析程序如下:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMDemo04 {
 public static void main(String[] args) throws Exception {
  // 1、建立DocumentBuilderFactory
  DocumentBuilderFactory factory = null;
  factory = DocumentBuilderFactory.newInstance();
  // 2、建立DocumentBuilder
  DocumentBuilder builder = factory.newDocumentBuilder();
  // 3、建力Document,将整个XML文档形成DOM树
  Document doc = builder.parse("e:\\demo.xml");
  NodeList nl = doc.getElementsByTagName("person");
  for(int x=0;x<nl.getLength();x++){
   Element per = (Element) nl.item(x); // 定位节点到person之中
   System.out.println(per.getElementsByTagName("name").item(0)
     .getFirstChild().getNodeValue());
   System.out.println(per.getElementsByTagName("age").item(0)
     .getFirstChild().getNodeValue());
   System.out.println(per.getElementsByTagName("sex").item(0)
     .getFirstChild().getNodeValue());
   NodeList al = per.getElementsByTagName("address") ;
   Element addr = (Element)al.item(0) ;
   NodeList ads = addr.getElementsByTagName("addr") ;
   for(int y=0;y<ads.getLength();y++){
    System.out.println("\t\t|- " + ads.item(y).getFirstChild().getNodeValue()) ;
   }
  }
 }
}
 以上全部都是DOM的基本解析操作,但是在DOM中它还可以生成一份XML文档。