今天我们来进行对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。
<?xml version="1.0"?> <hello> <content>Hello world!</content> </hello>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>version是使用的XML版本。
encoding是该文档所使用的字符集,缺省是UTF-8。
standalone是否可以在不读去任何其他文件的情况下处理该文档(可以是yes或no)
注释:
<!--注释可以出现在文档的任何位置--> <?xml version="1.0" encoding="UTF-8"?> <users> <user>a</user><!--这是注释--> </users>
<?xml version="1.0" encoding="UTF-8"?> <users> <user id="0001">San Zhang</user> <user id="0002">张三</user> </users>
元素(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"/>
根元素唯一
<?xml version="1.0"?> <!-- A well-formed docuemnt --> <user>san</user>
<?xml version="1.0"?> <!-- A invalid document --> <user>san</user> <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(); } }
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(); } }
关于这部分 w3c 有更详细的文档及案例说明,有兴趣的朋友可以w3c了解更多关于xml的知识。