一、XML文档定义的形式。

 

  1、dtd(文档类型定义)。

<?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE note[
            <!ELEMENT note (to,from,heading,body)>
            <!ELEMENT to (#PCDATA) >
            <!ELEMENT from (#PCDATA) >
            <!ELEMENT heading (#PCDATA) >
            <!ELEMENT body (#PCDATA) >
      ]>
     <note>
         <to>Tove</to>
         <from>Jani</from>
         <heading>Reminder</heading>
         <body>Don't forget me this weekend</body>
    </note>

2、schema(XML模式)。

 

 1)定义XMLSchema1.xsd文件。

<?xml version="1.0" encoding="UTF-8"?>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/XMLSchema1"
 xmlns="http://www.example.org/XMLSchema1"
 elementFormDefault="qualified"><xs:element name="note">
  <xs:complexType>
     <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
     </xs:sequence>
  </xs:complexType>
 </xs:element>

 

2)定义xml文件。

 

<?xml version="1.0" encoding="UTF-8"?>
 <note
 xmlns="http://www.example.org/XMLSchema1"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.org/XMLSchema1 XMLSchema1.xsd">  <to>Tove</to>
   <from>Jani</from>
   <heading>Reminder</heading>
   <body>Don't forget me this weekend</body>
 </note>

3、两种方式的区别。

 

     XML Schema和DTD都用于文档验证,但二者还有一定的区别。

     a)Schema本身是XML,可以被XML解析器解析;

     b)XML Schema是内容开放模型,可扩展,功能性强;而DTD可扩展性差;

     c)XML Schema支持丰富的数据类型,而DTD不支持元素的数据类型,对属性的类型定义也很有限;

     d)XML Schema支持命名空间机制,而DTD不支持;

     e)XML Schema可针对不同情况对整个XML文档或文档局部进行验证;而DTD缺乏这种灵活性;

     f)XML Schema完全遵循XML规范,符合XML语法,可以和DOM结合使用,功能强大;而DTD语法本身有自身的语法和要求,难以学习。

 

 二、解析XML文档的方式。

 

  1、DOM(文档对象模型)。

 

   1)简述。

 

    在DOM方式中,程序一次性处理整个XML文档,并将它转化成DOM树。一个XML方式对应一棵DOM树,放置在内存中以供读写。DOM方式提供了对XML文档的随机访问,程序可以随时访问XML文档的任何一部分,为开发者带了不少方便,但是由于它需要将所有的数据都放到内存中,所以效率较SAX低。在JAXP中,包org.w3c.dom专门用于对DOM方式的支持。

 

   2)实例。

 

import java.io.InputStream;
 import java.util.Iterator;import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;public class ReadXml{
  public static final String TEMPLATEDEFINE_FILENAME = "/com/ewider/dais/service/reportimport/example.xml"; public static final String TEMPLATEDEFINE_TAG = "Def";
 public static void parseFile() {
   try {
    InputStream input = ReadXml.class.getResourceAsStream(TEMPLATEDEFINE_FILENAME);
    SAXReader reader = new SAXReader();
    Document doc;
    doc = reader.read(input);
    Element root = doc.getRootElement();
    Iterator itr = root.elementIterator(TEMPLATEDEFINE_TAG);
    while (itr.hasNext()) {
     Element defEle = (Element) itr.next();
     System.out.println(defEle.attributeValue("name"));
     System.out.println(defEle.getStringValue());
    }
   } catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }catch (Exception e) {   e.printStackTrace();
   }
  } 
     public static void main(String []args){
      ReadXml.parseFile();
      
     }}

xml文件实例:

<?xml version="1.0" encoding="UTF-8"?>
 <Defs> <Def name="Example">
   This is a XML Example!
  </Def>
 </Defs>  
SAX(Simple API for XML)。

1)简述。

     

    在SAX方式中,程序顺序地访问XML文档。每次读到XML的一个元素就调用回调函数,开发者在回调函数,开发者在回调函数中定义对XML数据的处理。由于SAX方式每次只读XML文件的一部分放到内存中,所以SAX处理XML文档的效率比较高,但是操作也比较复杂。在JAXP中,包org.xml.sax专门用于对SAX方式的支持。

 

    

 2)实例。

 

import java.io.File;
 import java.util.Vector;import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;public class PraseXML extends DefaultHandler
 {  private Vector<String> tagName;
  private Vector<String> tagValue;
  private int step;
  // 开始解析XML文件
   public void startDocument() throws SAXException
   {
     tagName = new Vector<String>();
     tagValue = new Vector<String>();
     step = 0;
   }  // 结束解析XML文件
   public void endDocument() throws SAXException
   {
     for (int i = 0; i < tagName.size(); i++)
     {
       if (!tagName.get(i).equals("") || tagName.get(i) != null)
       {
         System.out.println("节点名称:" + tagName.get(i));
         System.out.println("节点值:" + tagValue.get(i));
       }
     }
   } 
   public void startElement(String uri, String localName, String qName,
       Attributes attributes) throws SAXException
   {
     // 节点名称
     tagName.add(qName);
     // 循环输出属性
     for (int i = 0; i < attributes.getLength(); i++)
     {
       // 获取属性名称
       System.out.println("属性名称:" + attributes.getQName(i));
       // 获取属性值
       System.out.println("属性值:"
           + attributes.getValue(attributes.getQName(i)));
     }  }
 
   public void endElement(String uri, String localName, String qName)
       throws SAXException
   {    step = step + 1;
   } 
   public void characters(char ch[], int start, int length)
       throws SAXException
   {
     // 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内
     if (tagName.size() - 1 == tagValue.size())
     {
       tagValue.add(new String(ch, start, length));
     }
   }  public static void main(String[] args)
   {
     String filename = "MyXml.xml";
     SAXParserFactory spf = SAXParserFactory.newInstance();
     try
     {
       SAXParser saxParser = spf.newSAXParser();
       saxParser.parse(new File(filename), new PraseXML());
     }
     catch (Exception e)
     {
       e.printStackTrace();
     }
   }  public Vector getTagName()
   {
     return tagName;
   }  public void setTagName(Vector tagName)
   {
     this.tagName = tagName;
   }  public Vector getTagValue()
   {
     return tagValue;
   }  public void setTagValue(Vector tagValue)
   {
     this.tagValue = tagValue;
   }}
 
xml文件实例:
<?xml version="1.0" encoding="UTF-8"?>
 <people>  <person personid="e01" enable="true">
     <name>张三</name>
     <tel>5128</tel>
     <email>txq512@sina.com</email>
   </person>
    
   <person personid="e02" enable="false">
     <name>meixin</name>
     <tel>5252525</tel>
     <email>wnight88@sina.com</email>
   </person>
    
   <person personid="e03" enable="true">
     <name>yu</name>
     <tel>5389654</tel>
     <email>yu@188.net</email>
   </person> 
 </people>