Java文档 XML

认识XML

XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。XML是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的有点,但正式这点使XML与众不同。

XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身。而HTML是用来定义数据的,重在数据的显示模式。

XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows,Mac OS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

为了是的SGML显得用户友好,XML重新定义了SGML的一些内部值和参数,去掉了大量的很少用到的功能,这些繁杂的功能使得SGML在设计网站时显得复杂化。XML保留了SGML的结构化功能,这样就使得网站设计者可以定义自己的文档类型,XML同时也推出一种新型文档类型,使得开发者也可以不必定义文档类型。

我们先来个Hello world。

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <hello>  
  3.   <content>Hello world!</content>  
  4. </hello>  
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
version是使用的XML版本。

encoding是该文档所使用的字符集,缺省是UTF-8。

standalone是否可以在不读去任何其他文件的情况下处理该文档(可以是yes或no)

注释:

[html]  view plain copy
  1. <!--注释可以出现在文档的任何位置-->  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <users>  
  4.   <user>a</user><!--这是注释-->  
  5. </users>  

标记、元素、属性

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <users>  
  3.   <user id="0001">San Zhang</user>  
  4.   <user id="0002">张三</user>  
  5. </users>  

标记(tag)是左尖括号(<)和右尖括号(>)之间的文本

元素(elements)是开始记、结束记以及位于二者之间的所有的内容。

属性(attribute)是一个元素的开始标记中的键-值对

<user>是user元素的起始标记,</user>是结束标记。

users为跟元素,一个xml只应该一个根元素

users元素包含了2个user子元素,Users是user的父元素,user是users的子元素

id是user元素的属性


CDATA

<user>

<name>Yu</name>

<description>

<![CIATA[

Go,>>>cool<<<

~!@#$%^&*_+我CDATA中可以放任意字符并且空白也会当作字符

]]>

</user>


Well-formed

所有元素都要关闭,即遍空元素:

<br/>

标记区分大小写,起始标记与结束标记大小写必须一致

标签间不能交叉,例如:

<name>Yu Zhang<password>12</name></password>

所有的属性都必须有引号(单双都行,建议双引号)

<userinfo id="123"/>


根元素唯一

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <!-- A well-formed docuemnt -->  
  3. <user>san</user>  
[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <!-- A invalid document -->  
  3. <user>san</user>  
  4. <user>san</user>  
下面的这种情况XML解析器会拒绝无效文档

必须有结束标记

所有的起始标记都必须有结束标记。对于空元素可以采用这种形式表示

<userinfo id ="2302"/>

HTML中的<br><hr>应该<br/><hr/>


标记区分大小写

标记区分大小写,起始标记与结束标记大小写必须一致

<!-- 非法 --->

<h1>股市大跌</H1>

<!--合法-->

<h1>北京欢迎你</h1>


属性必须有引号

所有的属性都必须有引号(单双都行)

<!--合法,如果属性值包含单引号或双引号,则您可以使用另一种引号来括起该值-->

<user info='my "s"'/>

<user info="'it's..."/>

<!--非法-->

<form id=userForm>

<!--非法-->

<input readonly/>


下面我们来学习对于XML文档的解析 ,这里用到dom4j ,添加相应的jar包。

首先我们定义一个XML文件(book.xml):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
  
<booklist>  
  <cbook cid="0001">  
    cbook1  
    <bookname>XML的今生今世</bookname>  
    <price>66.66</price>  
    <note>  
    该书详细描写XML的从出生到衰老的整个过程  
    </note>  
    <newBook>  
      <cbook cid="0001">  
        cbook2  
        <bookname>XML教程0</bookname>  
        <price>90</price>  
        <note>  
        该书详细描写XML  
        </note>  
      </cbook>  
    </newBook>  
  </cbook>  
  <cbook cid="0002">  
    cbook2  
    <bookname>XML教程1</bookname>  
    <price>90</price>  
    <note>  
           该书详细描写XML  
    </note>  
  </cbook>  
  <cbook cid="0003">  
    cbook3  
    <bookname>XML教程2</bookname>  
    <price>90</price>  
    <note>  
           该书详细描写XML  
    </note>  
  </cbook>  
</booklist>  



然后看下我们的解析类(TestXMLDemo.java):

package com.qianyan.xml;  
  
import java.io.File;  
  
import org.dom4j.Attribute;  
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  
  
  
public class TestXMLDemo {  
  
    public void myXMLReader() throws Exception{  
        File file = new File("src/book.xml");  
        SAXReader xreader = new SAXReader();  
        Document doc = xreader.read(file);  
          
        Element root = doc.getRootElement();  
        Element cbook = root.element("cbook");  
          
        Attribute cid = cbook.attribute("cid"); //获取属性值方法一  
        System.out.println(cid.getText());  
          
        System.out.println(cbook.attributeValue("cid"));  //获取属性值方法二  
          
        Element newBook = cbook.element("newBook");  //获取单元素  
        System.out.println(newBook.getText());  
          
        Element newBook_cbook = newBook.element("cbook");  //获取单元素  
          
        Element note = newBook_cbook.element("note");  //获取单元素  
        System.out.println(note.getText());  
    }  
      
    public static void main(String[] args) throws Exception {  
        TestXMLDemo txmldemo = new TestXMLDemo();  
        txmldemo.myXMLReader();  
    }  
}  


上面是简单的读取单元素或属性,下面来看下读取多元素和基本写xml文档的方法。iew plain

package com.qianyan.xml;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Document;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
  
  
public class TestXMLDemo2 {  
  
    public void myXMLReader() throws Exception{  
        File file = new File("src/book.xml");  
        SAXReader xreader = new SAXReader();  
        Document doc = xreader.read(file);  
          
        Element root = doc.getRootElement();  
          
        List<Element> list = root.elements("cbook");  //读入root下的所有cbook元素  
        Iterator<Element> it = list.iterator();       //迭代集合  
        while(it.hasNext()){  
            Element tempElement = it.next();  
            System.out.println(tempElement.getText());  
        }  
    }  
      
    public void myXMLWriter() throws IOException{  
        Document doc = DocumentHelper.createDocument(); //创建文档  
        Element booklist = doc.addElement("booklist");  //添加元素  
        booklist.addComment("写注释操作");  
        Element cbook = booklist.addElement("cbook");  
        cbook.addText("第一个cbook");  
        cbook.addComment("cbook的注释");  
        cbook.addAttribute("cid", "0001");  
        OutputFormat format = OutputFormat.createPrettyPrint();  //文档格式化format  
        format.setEncoding("UTF-8");  
          
        File file = new File("mybook.xml");  
        XMLWriter xwriter = new XMLWriter(new FileOutputStream(file), format);  
        xwriter.write(doc);  
        xwriter.close();  
    }  
      
    public static void main(String[] args) throws Exception {  
        TestXMLDemo2 txmldemo = new TestXMLDemo2();  
//        txmldemo.myXMLReader();  
        txmldemo.myXMLWriter();  
    }  
}  


xpath查找,注意需要引入jaxen.jar 包

package com.qianyan.xml;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Document;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
  
  
public class TestXMLDemo2 {  
      
    public void myXMLpath() throws Exception{  
        File file = new File("src/book.xml");  
        SAXReader xreader = new SAXReader();  
        Document doc = xreader.read(file);  
          
        Element root = doc.getRootElement();  
//      List list = root.selectNodes("//cbook[@cid='0002']"); //查找特定标签元素cbook  
//      List list = root.selectNodes("//cbook"); //查找任意位置的cbook  
        List list = root.selectNodes("/booklist/cbook"); //查找booklist下的cbook  
        for(int i = 0; i < list.size(); i++){  
            Element node = (Element)list.get(i);  
            System.out.println(node.getText());  
        }  
    }  
      
    public static void main(String[] args) throws Exception {  
        TestXMLDemo2 txmldemo = new TestXMLDemo2();  
        txmldemo.myXMLpath();  
    }  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值