1,主要内容
<?xml version="1.0" encoding="UTF-8"?> <中国> <北京> <海淀></海淀> <丰台></丰台> </北京> <广东> <广州></广州> <东莞></东莞> </广东> <湖北> <武汉></武汉> <襄阳></襄阳> </湖北> </中国>
如:<?xml version=“1.0” encoding=“GB2312”?>
如:<?xml version=“1.0” standalone=“yes”?>
<mytag name="value"/>
<mytag>
<name>
<firstname></firstnamename>
<secondname></secondname>
</name>
</mytag>
注释
<!--大段注释
……
<!--局部注释--> Wrong
……
-->
<![CDATA[
<itcast>www.itcast.cn</itcast>
]]>
以上红色部分被当做普通文本而不是标签
7,特殊字符
8,处理指令
xml-stylesheet指令
<?xml-stylesheet type=“text/css” href=“some.css”?>
9,xml约束概述
为什么需要约束?
文件清单:book.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>
DTD文件应使用UTF-8或Unicode
文件清单:book.dtd <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
xml 内部编写DTD
DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。(单独的DTD文件要以UTF-8保存)
在XML 文档中编写DTD示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> ]> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> ... </书架>
引入外部DTD文档
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
如:<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
11,DTD约束语法细节
元素定义1
<!ELEMENT 元素名称元素类型>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
ANY:表示元素内容为任意类型
PCDATA
CDATA
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开
元素定义2
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)>
attribute 属性定义
<!ATTLIST 元素名
……
>
<!ATTLIST 商品
类别 CDATA #required
颜色 CDATA #IMPLIED
>
<商品类别="服装" 颜色="黄色">…</商品>
<商品类别="服装">…</商品>
<!ATTLIST页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #required
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
常用属性值类型
属性值类型àENUMERATED
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> ]> <购物篮> <肉 品种 ="鱼肉"/> <肉 品种 ="牛肉 "/> <肉/> </购物篮>
属性值类型 ID
<?xml version = "1.0" encoding="GB2312" ?> <!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 ANY> <!ELEMENT 联系人 (姓名,EMAIL)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ATTLIST 联系人 编号 ID #required> ]> <联系人列表> <联系人 编号="a1"> <姓名>张三</姓名> <EMAIL>zhang@it315.org</EMAIL> </联系人> <联系人 编号="b1"> <姓名>李四</姓名> <EMAIL>li@it315.org</EMAIL> </联系人> </联系人列表>
实体定义
引用实体
&实体名称;
<!ENTITY shit"oh,holy shit">
……
&shit;
参数实体
%实体名称;
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址"> <!ELEMENT 个人信息 (% TAG_NAMES; | 生日)> <!ELEMENT 客户信息 (% TAG_NAMES; | 公司名)>
举例2
<!ENTITY % common.attributes " id ID #IMPLIED account CDATA #required " > ... <!ATTLIST purchaSEOrder %common.attributes;> <!ATTLIST item %common.attributes;>
12 XML编程(CRUD)
java 解析xml概述
JAXP
使用JAXP进行DOM解析
javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回
获得JAXP中的DOM解析器
SAXParserFactoryspf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReaderxmlReader = sp.getXMLReader();
xmlReader.setContentHandler(new BookParserHandler());
xmlReader.parse("book.xml");
DOM4J解析XML文档
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
Element root = document.addElement("members");
节点对象
Element root = document.getRootElement();
Element element=node.element(“书名");
String text=node.getText();
List nodes = rootElm.elements ("member");
for ( Iterator it = nodes.iterator (); it.hasNext ();) {
Element elm = (Element) it.next ();
// do something
}
for( Iterator it= root.elementIterator (); it.hasNext ();){
Element element = (Element) it.next ();
// do something
}
parentElm.remove(childElm);
Element contentElm = infoElm.addElement ("content");
contentElm.addCDATA ( diary.getContent ());
节点对象属性
Attribute attribute=root.attribute("size");
节点对象属性
Element root= document.getRootElement ();
for( Iterator it= root.attributeIterator (); it.hasNext ();){
Attribute attribute = (Attribute) it.next ();
String text= attribute.getText ();
System.out.println (text);
}
将文档写入XML文件
XMLWriter writer = new XMLWriter (new FileWriter ("output.xml"));
writer.write (document);
writer.close ();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml"),format);
writer.write(document);
writer.close();
字符串与xml的转换
String text = "<members> <member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();
pull解析器
XML约束之Schema
<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn" elementFormDefault="qualified"> <xs:element name='书架' > <xs:complexType> <xs:sequence maxOccurs='unbounded' > <xs:element name='书' > <xs:complexType> <xs:sequence> <xs:element name='书名' type='xs:string' /> <xs:element name='作者' type='xs:string' /> <xs:element name='售价' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
<?xml version="1.0" encoding="UTF-8"?> <itcast:书架 xmlns:itcast="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.itcast.cn book.xsd"> <itcast:书> <itcast:书名>JavaScript网页开发</itcast:书名> <itcast:作者>张孝祥</itcast:作者> <itcast:售价>28.00元</itcast:售价> </itcast:书> </itcast:书架>名称空间的概念
<itcast:书架 xmlns:itcast=“http://www.itcast.cn”>
<itcast:书>……</itcast:书>
</itcast:书架>
此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。
<itcast:书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
基本格式: xmlns="URI" 举例: <书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.itcast.cn book.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> <书架>
使用名称空间引入多个XML Schema文档
文件清单:xmlbook.xml <?xml version="1.0" encoding="UTF-8"?> <书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:demo="http://www.it315.org/demo/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd http://www.it315.org/demo/schema http://www.it315.org/demo.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价 demo:币种=”人民币”>28.00元</售价> </书> </书架>
不使用名称空间引入XML Schema文档
文件清单:xmlbook.xml <?xml version="1.0" encoding="UTF-8"?> <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xmlbook.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>
在XML Schema文档中声明名称空间
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:schema>
elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间