1,主要内容
<?xml version="1.0" encoding="UTF-8"?>
<中国>
<北京>
<海淀></海淀>
<丰台></丰台>
</北京>
<广东>
<广州></广州>
<东莞></东莞>
</广东>
<湖北>
<武汉></武汉>
<襄阳></襄阳>
</湖北>
</中国>
如:<?xml version=“1.0” encoding=“GB2312”?>
如:<?xml version=“1.0” standalone=“yes”?>
第一段:
<中国><北京/></中国>
第二段: 给人看的
<中国>\r\n
\t <北京/>
</中国>
命名规范
<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 元素名
属性名1 属性值类型设置说明
属性名2 属性值类型设置说明
……
>
<!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 % 实体名称 "实体内容" >
%实体名称;
<!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
}
Element ageElm = newMemberElm.addElement ("age");
element.setText ("29");
// childElm 是待删除的节点 , parentElm 是其父节点
parentElm.remove(childElm);
Element contentElm = infoElm.addElement ("content");
contentElm.addCDATA ( diary.getContent ());
节点对象属性
Element root= document.getRootElement ();
// 属性名 name
Attribute attribute=root.attribute("size");
String text= attribute.getText ();
Attribute attribute = root.attribute ("size");
root.remove (attribute);
节点对象属性
Element root= document.getRootElement ();
for( Iterator it= root.attributeIterator (); it.hasNext ();){
Attribute attribute = (Attribute) it.next ();
String text= attribute.getText ();
System.out.println (text);
}
newMemberElm.addAttribute ("name", " sitinspring ");
Attribute attribute = root.attribute ("name");
attribute.setText (" sitinspring ");
将文档写入XML文件
XMLWriter writer = new XMLWriter (new FileWriter ("output.xml"));
writer.write (document);
writer.close ();
OutputFormat format = OutputFormat.createPrettyPrint ();
// 指定 XML 编码
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所指定的名称空间