概念:
XML 指可扩展标记语言
XML 是一种标记语言,非常类似 HTML ,文本文件.
XML 的设计宗旨是数据传输,而非显示数据 。存储和传输复杂的关系模型数据
XML 标签没有被提前定义
使用约束的XML文档设计具有自我描写叙述性。
XML 是 W3C 的推荐标准
XML语法:
一个XML文件分为例如以下几部分内容:
文档声明 <?xml version="1.0" ecoding="utf-8">
元素:有開始有结束
属性
凝视
CDATA区 、特殊字符
处理指令(processing instruction)
- CDATA区:不被解析
<![CDATA[内容]]>或者转义字符:< script >子元素< /script >
- 处理指令
简称PI (processing instruction)。处理指令用来指挥解析引擎怎样解析XML文档内容。比如,在XML文档中能够使用xml-stylesheet指令。通知XML解析引擎,应用css文件显示xml文档内容。 <?xml-stylesheet type="text/css" href="1.css"?>
处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
XML约束概述
在XML技术里。能够编写一个文档来约束一个XML文档的书写规范,这称之为XML约束
为什么使用DTD?
通过 DTD,您的每个 XML 文件均可携带一个有关其自身格式的描写叙述。通过 DTD。独立的团体可一致地使用某个标准的 DTD 来交换数据。而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。您还能够使用 DTD 来验证您自身的数据。
常见的约束技术:
XML DTD
XML Schema
- XML DTD :文档类型定义,不严格,简单
l 使用内部DTD
l 使用外部DTD SYSTEM
l 使用公共DTD PUBLIC
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<bookname>红楼梦</bookname>
<author>小张</author>
</book>
<book>
<bookname>西游记</bookname>
<author>小明</author>
</book>
</books>
books.dtd(顺序,内容都严格要求)
导入本地的:
<!-- 使用外部的dtd -->
//../目录名/ 訪问上上一级下的目录
<!DOCTYPE 文档根节点 SYSTEM "dtd文件的url">
<!-- 使用内部的dtd -->
<!DOCTYPE books [
<!ELEMENT books (book+) >
<!ELEMENT book (bookname,author)>
<!ELEMENT bookname (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]> 导入外部的
<!DOCTYPE 文档根节点 PUBLIC "dtd名称" "dtd文件的url">
DTD元素





DTD属性
如:
<!ATTLIST 元素名称 属性名 属性类型 属性约束>
属性类型 CDATA (字符串)
属性约束 #REQUIRED 这个代表属性必须有。
#FIXED 属性值的绑定
- XML Schema:语法难,约束性强
xml解析(很重要)
读写xml
XML解析开发包
Jaxp(sun)、Jdom、dom4j
dom(Document Object Medal)即文档对象模型)
- 支持回写
- 会将整个XML加载内存,以树形结构方式存储,大文件的时候执行较慢
- XML比較复杂的时候。或者当你须要随机处理文档中数据的时候不建议使用
- 全部的东西都映射成node
sax: (Simple API for XML) 不是官方标准,但它是 XML 社区其实的标准,差点儿全部的 XML 解析器都支持它。
- 相比DOM是一种更为轻量级的方案。 速度快
- 採用串行方法读取 --- 逐行读取
- 编程较为复杂
- 无法改动XML数据,仅仅能读。
选择 DOM 还是 SAX
应用程序的目的:假设必须对数据进行更改,而且作为 XML 将它输出,则在大多数情况下,使用 DOM
数据的数量:对于大文件,SAX 是更好的选择
将怎样使用数据:假设实际上仅仅使用一小部分数据。则使用 SAX 将数据抽取到应用程序中。这样的方法更好些
需要速度:通常,SAX 实现比 DOM 实现快
JAXP(Java API for XML Processing )
JAXP是 Sun 提供的一套XML解析API,非常好的支持DOM和SAX解析方式
JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
在 javax.xml.parsers 包中,定义了几个工厂类。程序猿调用这些工厂类。能够得到对xml文档进行解析的 DOM 或 SAX 的解析器对象
1、使用DOM方式解析XML
解析器工厂类DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
解析器类DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
解析生成Document对象
Document doc = db.parse("message.xml");
通过Document对象查询节点
document.getElementById 返回Node对象 --- 必须文档元素有ID属性
document.getElementsByTagName 返回NodeList对象
简单的元素增删改查样例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 使用内容的dtd --><books><bookkuan=""><bookname>红楼梦</bookname><author>小张</author><value>15.6</value></book><bookkuan=""><bookname>爱我是</bookname><author>撒地方</author></book></books>
publicclass test1 {/*** @param args* @throws ParserConfigurationException* @throws IOException* @throws SAXException* @throws TransformerException*/publicstaticvoid main(String[] args)throwsParserConfigurationException,SAXException,IOException,TransformerException{// addElement();// updateText();deleteElement();}/**删除元素* @throws ParserConfigurationException* @throws SAXException* @throws IOException* @throws TransformerException* @throws TransformerFactoryConfigurationError* @throws TransformerConfigurationException*/privatestaticvoid deleteElement()throwsParserConfigurationException,SAXException,IOException,TransformerConfigurationException,TransformerFactoryConfigurationError,TransformerException{Document document = getDocument("dtd/books.xml");NodeList nodeList=document.getElementsByTagName("author");Element element=(Element) nodeList.item(0);//通过父亲来删除子节点element.getParentNode().removeChild(element);domToFile(document);}/**加入元素* @throws ParserConfigurationException* @throws SAXException* @throws IOException* @throws TransformerFactoryConfigurationError* @throws TransformerConfigurationException* @throws TransformerException*/privatestaticvoid addElement()throwsParserConfigurationException,SAXException,IOException,TransformerFactoryConfigurationError,TransformerConfigurationException,TransformerException{Document document = getDocument("dtd/books.xml");Element element= document.createElement("value");element.setTextContent("15.6");document.getElementsByTagName("book").item(0).appendChild(element);domToFile(document);}//改动publicstaticvoid updateText()throwsParserConfigurationException,SAXException,IOException,TransformerConfigurationException,TransformerFactoryConfigurationError,TransformerException{Document document = getDocument("dtd/books.xml");NodeList nodeList=document.getElementsByTagName("author");Element element=(Element) nodeList.item(1);element.setTextContent("小红");domToFile(document);}/**由于是载入到内存,所以须要回写到xml文件里* @param document* @throws TransformerFactoryConfigurationError* @throws TransformerConfigurationException* @throws TransformerException*/privatestaticvoid domToFile(Document document)throwsTransformerFactoryConfigurationError,TransformerConfigurationException,TransformerException{TransformerFactory factory=TransformerFactory.newInstance();Transformer tf=factory.newTransformer();tf.transform(newDOMSource(document),newStreamResult("dtd/books.xml"));}/**得到document* @param file* @return* @throws ParserConfigurationException* @throws SAXException* @throws IOException*/publicstaticDocument getDocument(String file)throwsParserConfigurationException,SAXException,IOException{// TODO Auto-generated method stub// 解析器工厂DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();// 解析器DocumentBuilder db = builderFactory.newDocumentBuilder();Document document =(Document) db.parse(file);return document;}}
2、使用SAX方式解析XML
// 1.得到sax解析器工厂SAXParserFactory factory =SAXParserFactory.newInstance();// 2.得到sax解析器SAXParser parse = factory.newSAXParser();// parse.parse("xml/books.xml", new MyHandle()); //这句话能够替换以下的三句// 3.得到读取器XMLReader reader = parse.getXMLReader();// 4设置读取器的事件处理器reader.setContentHandler(newMyHandle());// 5.真正读取文件reader.parse("xml/books.xml");classMyHandleextendsDefaultHandler{@Overridepublicvoid startDocument()throwsSAXException{System.out.println("start document");}@Overridepublicvoid startElement(String uri,String localName,String qName,Attributes attributes)throwsSAXException{// qName能够得到元素名称// 能够通过 attributes得到当前元素的全部属性System.out.println("<"+ qName +">");}@Overridpublicvoid characters(char[] ch,int start,int length)throwsSAXException{// 能够得到元素中的文本信息System.out.println(newString(ch, start, length));}@Overridepublicvoid endElement(String uri,String localName,String qName)throwsSAXException{System.out.println("<"+ qName +">");}@Overridepublicvoid endDocument()throwsSAXException{System.out.println("endDocument");}
3.使用dom4j解析xml
Dom4j是一个简单、灵活的开放源码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
与JDOM不同的是,dom4j使用接口和抽象基类,尽管Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。如今非常多软件採用的Dom4j,比如Hibernate。包含sun公司自己的JAXM也用了Dom4j
使用Dom4j开发。需下载dom4j对应的jar文件
注意:
1.一个XML元素能够包括字母、数字以及其他一些可见字符。但必须遵守以下的一些规范:
区分大写和小写,比如。<P>和<p>是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能以xml(或XML、或Xml 等)开头。
不能包括空格。
名称中间不能包括冒号(:)。
2.Xml文件里的凝视採用:“<!--凝视-->” 格式。
XML声明之前不能有凝视
凝视不能嵌套
3.全部 XML 元素都须有关闭标签
XML 标签对大写和小写敏感
XML 必须正确地嵌套顺序
XML 文档必须有根元素
XML 的属性值须加引號
特殊字符必须转义
XML 中的空格会被保留