Bootstrap

xml入门

xml入门

标签: XML DOM JAX DTD Schema
512人阅读  评论(1)  收藏  举报

目录(?)[+]

xml介绍

文档说明

一个良好的xml文件,需要对xml文件有一个基本的介绍和基础属性的设置.最基本的文档说明如下:

[html]  view plain  copy
  1. <?xml version="1.0" ?>  



常见的文档说明如下

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  2. <!--   version:声明版本号       
  3.      encoding:指定编码格式,例如 gb2312  utf-8     注意在编写文件中存取和读取的编码需一致  
  4.        standalone:文档是否独立         -->  




元素(element)

声明格式:以下两种xml声明格式

[html]  view plain  copy
  1. <!-- 声明格式1 -->    <a id="9527">...</a>  <!-- 常常把一个元素称为一个标签   -->  
  2. <!-- 声明格式2 -->    <a id="9527"/>    <!--此声明格式不含子标签 --></span>  

xml元素需要注意一些规范

                          1.大小写区分,不能包含空格,不能有;号

                          2.不要以_开头,也不要以xml开头


  注意:在xml文件中空格和换行都算是text内容,会被程序解析(红刷笔刷过的地方)



demo

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  2. <exam>                                    <!--  根节点为exam -->  
  3.     <student id="1" >                 <!--     子标签student  包含一个属性id -->  
  4.         <name>xiaosan</name>            <!--         子标签name,location,grade-->  
  5.         <location>沈阳</location>  
  6.         <grade>89</grade>  
  7.     </student>  
  8.   
  9.     <student id="2" >  
  10.         <name>xiaowu</name>  
  11.         <location>合肥</location>  
  12.         <grade>29</grade>  
  13.     </student>  
  14. </exam>  
  

特殊语法

使用<![CDATA[ .... ]]>告诉解析器不解析内含字段,原样输出。

[html]  view plain  copy
  1. <![CDATA[  
  2.     <student id="1" >                 <!--     子标签student  包含一个属性id --> 
  3.         <name>xiaosan</name>            <!--         子标签name,location,grade--> 
  4.         <location>沈阳</location> 
  5.         <grade>89</grade> 
  6.     </student> 
  7.  ]]>  

一些特殊字段使用转义字符来表示








xml约束

所谓的约束,即编写xml文件的指导说明。常用的xml约束有两种:DTD和Schema.DTD语法简单但是对属性类型具有局限性,Schema相对更为严谨也更为复杂,两者都有成熟的文档,可以参考文档编写,一般能看懂即可。


DTD约束

DTD可以直接在相应的xml文档中声明,也可以单独为一个dtd文件。


1.直接在xml文件中定义

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!--    
  4.     内部DTD声明 ,格式为:  
  5.     <!DOCTYPE root_name     root_name为xml文件的根节点  
  6.         [  
  7.             ....  
  8.         ]  
  9. >      
  10. -->  
  11.   
  12.       
  13. <!DOCTYPE person[      
  14.         <!ELEMENT person (人+)>  
  15.         <!ELEMENT 人 (姓名+,年龄,(住址*|家乡?))>  
  16.         <!ELEMENT 姓名 (#PCDATA)>  
  17.         <!ELEMENT 年龄 (#PCDATA)>  
  18.         <!ELEMENT 住址 (#PCDATA)>  
  19. ]>  
  20.   
  21. <person>  
  22.     <>  
  23.         <姓名>小李</姓名>  
  24.         <年龄>23</年龄>  
  25.         <住址>岗头村</住址>  
  26.     </>  
  27.   
  28.     <>  
  29.         <姓名>小王</姓名>  
  30.         <姓名>隔壁老王</姓名>  
  31.         <年龄>30</年龄>  
  32.         <家乡>二八村</家乡>  
  33.     </>  
  34. </person>  

2.单独编写一个DTD文件


person.dtd文件

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!ELEMENT     person (人+)>  
  4.         <!ELEMENT 人 (姓名+,年龄,(住址*|家乡?))>  
  5.         <!ELEMENT 姓名 (#PCDATA)>  
  6.         <!ELEMENT 年龄 (#PCDATA)>  
  7.         <!ELEMENT 住址 (#PCDATA)>  
[html]  view plain  copy
  1.   

对应的person.xml文件
[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!--    
  4.     使用外部声明的DTD ,需要加入:  
  5.     <!DOCTYPE 根元素名称   SYSTEM/PUBLIC  "外部文档名称或路径.dtd"  >     
  6. -->  
  7.   
  8. <<!DOCTYPE person PUBLIC SYSTEM "person.dtd">  
  9.       
  10. <person>  
  11.     <>  
  12.         <姓名>小李</姓名>  
  13.         <年龄>23</年龄>  
  14.         <住址>岗头村</住址>  
  15.     </>  
  16.   
  17.     <>  
  18.         <姓名>小王</姓名>  
  19.         <姓名>隔壁老王</姓名>  
  20.         <年龄>30</年龄>  
  21.         <家乡>二八村</家乡>  
  22.     </>  
  23. </person>  



DTD语法简介

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!ELEMENT     person (人+)>  
  4.         <!ELEMENT 人 (姓名+,年龄,(住址*|家乡?))>  
  5.         <!ELEMENT 姓名 (原名|昵称)>  
  6.             <!ATTLIST 原名  
  7.                 中文名 CDATA   #REQUIRED  
  8.                 英文名 CDATA   #IMPLIED  
  9.                 阿三名         CDATA   #FIXED "乌拉拉"     
  10.             >      
  11.             <!ATTLIST 昵称  
  12.                 QQ昵称    (xiao|li|wang) "sb"  
  13.             >      
  14.         <!ELEMENT 年龄 (#PCDATA)>  
  15.         <!ELEMENT 住址 (#PCDATA)>  
  16.   
  17.           
  18. <!--  
  19.     元素内容使用,号表示出现次序需要一致  
  20.     元素内容使用|号表示只能选择其一  
  21.       
  22.     元素中使用+、?、*表示元素出现次数  
  23.         ? 0次或1次  (人?)  
  24.         + 1次或多次 (人+)  
  25.         * 0次或多次 (人*)  
  26.       
  27.     对于标签可以使用ATTLIST为其设置属性  
  28.     <!ATTLIST 元素名  
  29.         属性1 类型   设置说明  
  30.         属性2 ...   ...  
  31.          ...  
  32.     >  
  33.       
  34.     常见类型:  
  35.         cdata       为常见字符串    
  36.         (?|?|?)     给定范围取值  
  37.         id          表示唯一属性  
  38.         entity      表示一个实体(类似一个宏定义)  
  39.         ...  
  40.   
  41.     设置说明:  
  42.         #REQUIRED   必须有此属性  
  43.         #IMPLIED    可有  
  44.         #FIXED      固定值  
  45.         "xxx"       如果没表定,则默认值  
  46.   
  47. -->  





schema语法

因为schema的语法和xml语法类似。

  一个schema文档必须有一个根节点,且根节点名称为schema。每个schema模式文档可以声明一个名称空间,同时用一个唯一的URI表示。


在schema文件中

schema.xsd文档声明

[html]  view plain  copy
  1.  <!--根元素schema。  
  2.       使用xmlns关键字引入命名空间xs   
  3.      同时限定该文档的约束对象URI:www.delphifan.com  
  4.      -->  
  5. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"    
  6.     targetNamespace="http://www.delphifan.com" elementFormDefault="qualified">  


对于的xml文件中

[html]  view plain  copy
  1. <!--  xmlns="http://www.delphifan.com"    ->  使用默认命名空间        
  2.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  ->  使用xsi命名空间 配置 xsi:schemaLocation属性    
  3.       xsi:schemaLocation="http://www.delphifan.com shiporder.xsd"  ->  声明该文档的约束文档的URI和对于的文档名称   
  4.     -->  
  5. <shiporder     
  6.     xmlns="http://www.delphifan.com"                      
  7.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         
  8.     xsi:schemaLocation="http://www.delphifan.com shiporder.xsd"   
  9.     orderid="23" >  

注意: 在声明xsi:schemaLocation属性时候按照xsi:xsi:schemaLocation="{namespace} {location}" 格式声明。namespace和location之间的空格不能少



demo

shiporder.xsd约束文档

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  3.     targetNamespace="http://www.delphifan.com" elementFormDefault="qualified">  
  4.     <xs:element name="shiporder">  
  5.         <xs:complexType>    <!--complexType表示一个复杂类型 -->  
  6.             <xs:sequence>      <!--xs:sequence表示元素值必须按顺序声明 -->  
  7.                 <xs:element name="orderperson" type="xs:string" />  
  8.                 <xs:element name="shipto">  
  9.                     <xs:complexType>  
  10.                         <xs:sequence>  
  11.                             <xs:element name="name" type="xs:string" />  
  12.                             <xs:element name="address" type="xs:string" />  
  13.                             <xs:element name="city" type="xs:string" />  
  14.                             <xs:element name="country" type="xs:string" />  
  15.                         </xs:sequence>  
  16.                     </xs:complexType>  
  17.                 </xs:element>  
  18.   
  19.                 <xs:element name="item" maxOccurs="unbounded">  
  20.                     <xs:complexType>  
  21.                         <xs:sequence>  
  22.                             <xs:element name="title" type="xs:string" />  
  23.                             <xs:element name="note" type="xs:string" minOccurs="0" />  
  24.                             <xs:element name="quantity" type="xs:positiveInteger" />  
  25.                             <xs:element name="price" type="xs:decimal" />  
  26.                         </xs:sequence>  
  27.                     </xs:complexType>  
  28.                 </xs:element>  
  29.             </xs:sequence>  
  30.   
  31.             <xs:attribute name="orderid" type="xs:string" use="required" />  
  32.         </xs:complexType>  
  33.     </xs:element>  
  34. </xs:schema>  

shiporder.xml文档

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shiporder     
  3.     xmlns="http://www.delphifan.com"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.delphifan.com shiporder.xsd"  
  6.     orderid="23" >  
  7.       
  8.     <orderperson>fan</orderperson>  
  9.     <shipto>  
  10.         <name>xiaofan</name>  
  11.         <address>hefei</address>  
  12.         <city>anhui</city>  
  13.         <country>zhongguo</country>  
  14.     </shipto>  
  15.       
  16.     <item>  
  17.         <title>schema technology</title>  
  18.         <note>so handsome</note>  
  19.         <quantity>23</quantity>  
  20.         <price>12.2</price>  
  21.     </item>  
  22.   
  23. </shiporder>  







xml解析

解析方式分为两种:dom和sax

dom(document object model )解析:

   一次性读取xml文件,可对xml里数据操作。 优点CRUD操作方便,但占用内存大


sax(simple API for XML)解析:

     一点一点读取。优点是占用内存小,速度快,但CRUD操作不方便


常用的xml解析开发包

jaxp(官方的不需要外部jar包)与dom4j(需要外部jar包)



DOM解析(jaxp包)

整体流程如图所示


过程大致分为两部分

1.修改部分

使用DocumentBuilderFactory产生factory对象-->产生DocumentBuilder对象 -->使用parse()方法得到ducment对象

对document对象可以获取指定元素,作CRUD操作等



2.保存部分

使用TransformerFactory-->得到factory对象-->得到Transformer()对象-->使用transform()方法把改变后的document对象存储至xml文件中 





demo

任务需求:要求编写一个工具类

1.直接操作Student对象在xml文件中存储

2.在xml文件中通过examid属性查找对应的student标签

 3.通过name属性在xml文件中删除对于的student标签




设计思路如下图




1.studentDao负责对xml文件操作,包含三个方法,即增加学生对象,删除,查找操作

2.因为对xml操作中有大量重复代码,故定义工具类简化操作



student类

[java]  view plain  copy
  1. package org.nihao.domain;  
  2.   
  3. public class Student {  
  4.     private int idcard;  
  5.     private int examid;  
  6.     private String name;  
  7.     private String location;  
  8.     private double score;  
  9.     public int getIdcard() {  
  10.         return idcard;  
  11.     }  
  12.     public void setIdcard(int idcard) {  
  13.         this.idcard = idcard;  
  14.     }  
  15.     public int getExamid() {  
  16.         return examid;  
  17.     }  
  18.     public void setExamid(int examid) {  
  19.         this.examid = examid;  
  20.     }  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public String getLocation() {  
  28.         return location;  
  29.     }  
  30.     public void setLocation(String location) {  
  31.         this.location = location;  
  32.     }  
  33.     public double getScore() {  
  34.         return score;  
  35.     }  
  36.     public void setScore(double score) {  
  37.         this.score = score;  
  38.     }  
  39. }  

studentDao.java

[java]  view plain  copy
  1.  package org.nihao.dao;  
  2.   
  3. import org.nihao.domain.Student;  
  4. import org.nihao.exception.StudentNotExistException;  
  5. import org.nihao.util.XmlUtils;  
  6. import org.w3c.dom.Document;  
  7. import org.w3c.dom.Element;  
  8. import org.w3c.dom.NamedNodeMap;  
  9. import org.w3c.dom.Node;  
  10. import org.w3c.dom.NodeList;  
  11.   
  12. public class StudentDao {  
  13.       
  14.     public void add(Student s){  
  15.         try {  
  16.             Document document = XmlUtils.getDocument();     //checked exception  
  17.               
  18.             //1.创建标签  
  19.             Element element = document.createElement("student");  
  20.           
  21.                 //创建子标签并填充子标签  
  22.             Element nameElement = document.createElement("name");  
  23.                 nameElement.setTextContent(s.getName());  
  24.             Element locationElement = document.createElement("location");  
  25.                 locationElement.setTextContent(s.getLocation());  
  26.             Element gradeElement = document.createElement("grade");  
  27.                 gradeElement.setTextContent(Double.toString(s.getScore()));  
  28.               
  29.             //2.填充数据  
  30.             element.setAttribute("idcard", Integer.toString(s.getIdcard()));  
  31.             element.setAttribute("examid", Integer.toString(s.getExamid()));  
  32.   
  33.             element.appendChild(nameElement);  
  34.             element.appendChild(locationElement);  
  35.             element.appendChild(gradeElement);  
  36.               
  37.             document.getElementsByTagName("exam").item(0).appendChild(element);  
  38.   
  39.             //3.保存标签  
  40.             XmlUtils.write2Xml(document);  
  41.               
  42.               
  43.         } catch (Exception e) {  
  44.             throw new RuntimeException(e);  //运行时的异常  
  45.         }   
  46.     }  
  47.       
  48.       
  49.       
  50.       
  51.     public Student find(int examid){  
  52.         try {  
  53.             Document document = XmlUtils.getDocument();  
  54.             NodeList list = document.getElementsByTagName("student");  
  55.             for (int i = 0; i < list.getLength(); i++) {  
  56.                 Element student = (Element) list.item(i);  
  57.                 String attribute = student.getAttribute("examid");  
  58.                   
  59.                 if (attribute.equals(Integer.toString(examid))) {  
  60.                     Student stu = new Student();  
  61.                     stu.setExamid(examid);  
  62.                     stu.setIdcard(Integer.parseInt(student.getAttribute("idcard").trim()));  
  63.                     stu.setLocation(  
  64.                             student.getElementsByTagName("location").item(0).getTextContent());  
  65.                     stu.setName(  
  66.                             student.getElementsByTagName("name").item(0).getTextContent());  
  67.                     stu.setScore(Double.parseDouble(student.getElementsByTagName("grade")  
  68.                             .item(0).getTextContent()));  
  69.                     return stu;  
  70.                 }  
  71.             }  
  72.             return null;  
  73.   
  74.         } catch (Exception e) {  
  75.             throw new RuntimeException(e);  //运行时的异常  
  76.         }  
  77.     }  
  78.       
  79.       
  80.     public void delete(String name) throws StudentNotExistException{  
  81.           
  82.         try {  
  83.             Document document = XmlUtils.getDocument();  
  84.             NodeList list = document.getElementsByTagName("name");  
  85.               
  86.             for (int i = 0; i < list.getLength(); i++) {  
  87.                 if (list.item(i).getTextContent().equals(name)) {  
  88.                     list.item(i).getParentNode().getParentNode()  
  89.                         .removeChild(list.item(i).getParentNode());  
  90.                     XmlUtils.write2Xml(document);  
  91.                     return;  
  92.                 }  
  93.             }  
  94.           
  95.             throw new StudentNotExistException(name+"不存在!");  //自定义异常,用于通知调用者未查找到学生信息  
  96.   
  97.         }catch(StudentNotExistException e){  
  98.             throw e;  
  99.         }catch (Exception e ) {  
  100.             throw new RuntimeException(e);  //运行时的异常  
  101.         }  
  102.     }  
  103. }  

XmlUtils.java

[java]  view plain  copy
  1. package org.nihao.util;  
  2.   
  3. import javax.xml.parsers.DocumentBuilder;  
  4. import javax.xml.parsers.DocumentBuilderFactory;  
  5. import javax.xml.transform.Transformer;  
  6. import javax.xml.transform.TransformerException;  
  7. import javax.xml.transform.TransformerFactory;  
  8. import javax.xml.transform.dom.DOMSource;  
  9. import javax.xml.transform.stream.StreamResult;  
  10.   
  11. import org.w3c.dom.Document;  
  12.   
  13. public class XmlUtils {  
  14.   
  15.     private static String filename = "src/exam.xml";  
  16.       
  17.     public static Document getDocument() throws Exception {  
  18.           
  19.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  20.         DocumentBuilder documentBuilder = factory.newDocumentBuilder();  
  21.           
  22.         return documentBuilder.parse(filename);  
  23.     }  
  24.       
  25.     public static void write2Xml(Document document) throws TransformerException{  
  26.         TransformerFactory factory = TransformerFactory.newInstance();  
  27.         Transformer transformer = factory.newTransformer();  
  28.         transformer.transform(new DOMSource(document), new StreamResult(filename));  
  29.     }  
  30.       
  31. }  

exam.xml

[java]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  2. <exam>                                      
  3.     <student id="1" >                   
  4.         <name>xiaosan</name>              
  5.         <location>沈阳</location>  
  6.         <grade>89</grade>  
  7.     </student>  
  8.     <student id="2" >  
  9.         <name>xiaowu</name>  
  10.         <location>合肥</location>  
  11.         <grade>29</grade>  
  12.     </student>  
  13. </exam>  



sax解析

采用事件处理的方式解析xml文件,分为两个部分:解析器和事件处理器

解析过程如下图


解析器:通过JAXP的api直接创建


事件处理器:

       每当解析到一个组成部分,就会调用事件处理器的一个方法,同时会把解析出来的内容作为方法参数传递。

       新建一个对象实现给定的ContentHandler,并实现其中方法,重写常用的三个方法startElement、endElement、characters方法

或者使用官方帮我们实现了几个常用的类  DefaultHandler,DefaultHandler2, ValidatorHandler, XMLFilterImpl, XMLReaderAdapter




demo

[java]  view plain  copy
  1. public class Demo1 {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.             //1.通过工厂得到解析器  
  5.             SAXParserFactory factory = SAXParserFactory.newInstance();  
  6.             SAXParser parser = factory.newSAXParser();  
  7.               
  8.             //2.通过解析器得到Reader  
  9.             XMLReader xmlReader = parser.getXMLReader();  
  10.               
  11.             //设置内容处理器  
  12.             xmlReader.setContentHandler(new handler());  
  13.               
  14.             //3.解析  
  15.             xmlReader.parse("src/book.xml");  
  16.     }  
  17. }  
  18.   
  19.   
  20. class handler implements ContentHandler{  
  21.   
  22.     @Override  
  23.     public void setDocumentLocator(Locator locator) {  
  24.           
  25.     }  
  26.   
  27.     @Override  
  28.     public void startDocument() throws SAXException {  
  29.           
  30.     }  
  31.   
  32.     @Override  
  33.     public void endDocument() throws SAXException {  
  34.           
  35.     }  
  36.   
  37.     @Override  
  38.     public void startPrefixMapping(String prefix, String uri)  
  39.             throws SAXException {  
  40.           
  41.     }  
  42.   
  43.     @Override  
  44.     public void endPrefixMapping(String prefix) throws SAXException {  
  45.           
  46.     }  
  47.   
  48.     @Override  
  49.     public void startElement(String uri, String localName, String qName,  
  50.             Attributes atts) throws SAXException {  
  51.         System.out.println("<"+qName+">");  
  52.     }  
  53.   
  54.     @Override  
  55.     public void endElement(String uri, String localName, String qName)  
  56.             throws SAXException {  
  57.         System.out.println("<"+qName+">");  
  58.     }  
  59.   
  60.     @Override  
  61.     public void characters(char[] ch, int start, int length)  
  62.             throws SAXException {  
  63.         System.out.println(new String(ch,start,length));  
  64.     }  
  65.   
  66.     @Override  
  67.     public void ignorableWhitespace(char[] ch, int start, int length)  
  68.             throws SAXException {  
  69.           
  70.     }  
  71.   
  72.     @Override  
  73.     public void processingInstruction(String target, String data)  
  74.             throws SAXException {  
  75.           
  76.     }  
  77.   
  78.     @Override  
  79.     public void skippedEntity(String name) throws SAXException {  
  80.           
  81.     }  
  82.       
  83. }  






使用dom4j对xml操作

dom4j的说明文档非常详细,其中包含强大的xpath正则表达式获取元素方法。这里只贴一些简单的demo,需要使用dom4j之间查看其官方的文档即可。

 

ADU操作

[java]  view plain  copy
  1. public void add() throws  Exception{  
  2.         SAXReader reader = new SAXReader();  
  3.         Document document =  reader.read(new File("src/book.xml"));  
  4.           
  5.         Element book = document.getRootElement().element("书");  
  6.         List elements = book.elements();  
  7.           
  8.         Element element = DocumentHelper.createElement("售价");  
  9.         element.setText("200yuan");  
  10.         elements.add(2, element);  
  11.         //修改完毕后,输出存储  
  12.         OutputFormat format = OutputFormat.createPrettyPrint();  
  13.         format.setEncoding("UTF-8");  
  14.           
  15.         XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);  
  16.         writer.write(document);  
  17.         writer.close();   
  18.     }  
  19.       
  20.       
  21.     public void delete() throws  Exception{  
  22.         SAXReader reader = new SAXReader();  
  23.         Document document =  reader.read(new File("src/book.xml"));  
  24.           
  25.         Element book = document.getRootElement().element("书");  
  26.         book.remove(book.element("售价"));  
  27.           
  28.           
  29.         OutputFormat format = OutputFormat.createPrettyPrint();  
  30.         format.setEncoding("UTF-8");  
  31.           
  32.         XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);  
  33.         writer.write(document);  
  34.         writer.close();  
  35.     }  
  36.       
  37.     public void update() throws  Exception{  
  38.         SAXReader reader = new SAXReader();  
  39.         Document document =  reader.read(new File("src/book.xml"));  
  40.           
  41.         Element book = (Element) document.getRootElement().elements("书").get(1);  
  42.         book.element("售价").setText("2999元");  
  43.           
  44.           
  45.         OutputFormat format = OutputFormat.createPrettyPrint();  
  46.         format.setEncoding("UTF-8");  
  47.           
  48.         XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);  
  49.         writer.write(document);  
  50.         writer.close();  
  51.         <pre name="code" class="java">                  }  



[java]  view plain  copy
  1. public class Demo3 {  
  2.     //基本的XPATH操作  
  3.     public void xpath() throws Exception{  
  4.         SAXReader reader = new SAXReader();  
  5.         Document document =  reader.read(new File("src/book.xml"));  
  6.           
  7.         String text = document.selectSingleNode("//作者").getText();  
  8.         System.out.println(text);  
  9.     }  
  10. }  




schema语法

因为schema的语法和xml语法类似,且对类型的限制远好于DTD的类型限制,故schema的使用会更加广泛。

 文档后缀名:xxx.xsd       一个schema文档必须有一个根节点,且根节点名称为schema 。每个schema模式文档可以声明一个名称空间,同时用一个唯一的URI表示。


在schema文件中

schema文档的头元素声明

[html]  view plain  copy
  1. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"     根元素schema。  使用xmlns关键字引入命名空间xs  同时限定该文档的约束对象URI:www.delphifan.com  
  2.     targetNamespace="http://www.delphifan.com" elementFormDefault="qualified">  
  3.       


对于的xml文件中

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shiporder     
  3.     xmlns="http://www.delphifan.com"       使用默认命名空间     
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    使用xsi命名空间  并声明该文档的约束文档的URI和对于的文档名称  
  5.     xsi:schemaLocation="http://www.delphifan.com shiporder.xsd"  
  6.     orderid="23" >  
注意 在声明xsi:schemaLocation属性时候按照xsi:xsi:schemaLocation="{namespace} {location}" namespace和location之间的空格不能少。

具体的细节可以参考schema官方文档。


demo

shiporder.xsd约束文档

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  3.     targetNamespace="http://www.delphifan.com" elementFormDefault="qualified">  
  4.     <xs:element name="shiporder">  
  5.         <xs:complexType>    <!--complexType表示一个复杂类型 -->  
  6.             <xs:sequence>      <!--xs:sequence表示元素值必须按顺序声明 -->  
  7.                 <xs:element name="orderperson" type="xs:string" />  
  8.                 <xs:element name="shipto">  
  9.                     <xs:complexType>  
  10.                         <xs:sequence>  
  11.                             <xs:element name="name" type="xs:string" />  
  12.                             <xs:element name="address" type="xs:string" />  
  13.                             <xs:element name="city" type="xs:string" />  
  14.                             <xs:element name="country" type="xs:string" />  
  15.                         </xs:sequence>  
  16.                     </xs:complexType>  
  17.                 </xs:element>  
  18.   
  19.                 <xs:element name="item" maxOccurs="unbounded">  
  20.                     <xs:complexType>  
  21.                         <xs:sequence>  
  22.                             <xs:element name="title" type="xs:string" />  
  23.                             <xs:element name="note" type="xs:string" minOccurs="0" />  
  24.                             <xs:element name="quantity" type="xs:positiveInteger" />  
  25.                             <xs:element name="price" type="xs:decimal" />  
  26.                         </xs:sequence>  
  27.                     </xs:complexType>  
  28.                 </xs:element>  
  29.             </xs:sequence>  
  30.   
  31.             <xs:attribute name="orderid" type="xs:string" use="required" />  
  32.         </xs:complexType>  
  33.     </xs:element>  
  34. </xs:schema>  

shiporder.xml文档

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shiporder     
  3.     xmlns="http://www.delphifan.com"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.delphifan.com shiporder.xsd"  
  6.     orderid="23" >  
  7.       
  8.     <orderperson>fan</orderperson>  
  9.     <shipto>  
  10.         <name>xiaofan</name>  
  11.         <address>hefei</address>  
  12.         <city>anhui</city>  
  13.         <country>zhongguo</country>  
  14.     </shipto>  
  15.       
  16.     <item>  
  17.         <title>schema technology</title>  
  18.         <note>so handsome</note>  
  19.         <quantity>23</quantity>  
  20.         <price>12.2</price>  
  21.     </item>  
;