XML
XML,Extensible Markup Language,可扩展标记语言,用于定义文档类型DTD、描述标记数据XML。
DTD,Document Type Definition,文档类型定义,用于定义xml数据交换标准及文档规范验证。
XSD,Xml Schemas Definition,文档模式定义(替代DTD),用于描述和验证XML文档结构。
- XML和DTD的构建模块:DTD本身不是XML文档,不支持自定义类型,不支持域名机制
- 元素、标签、属性:<element attribute="value">content</element>
DTD声明元素:<!ELEMENT 元素名 内容>,通配符?*+,<!ATTLIST 元素名 属性名 类型 默认值>- 空元素:
<!ELEMENT jsp:setProperty EMPTY> - 带子元素:
<!ELEMENT jsp:include (jsp:param*)> - 元素属性:#REQUIRED必须,#IMPLIED可选;类型可以是CDATA或自定义ENTITY <!ATTLIST jsp:includeflush %Bool; "false"page %URL; #REQUIRED>
- 带PCDATA的元素: <!ELEMENT jsp:expression (#PCDATA)>
- 内嵌DTD:<!DOCTYPE root [<!ELEMENT root (empty)><!ELEMENT empty EMPTY>]>
引入DTD:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
常见的DTD:html jsp spring
- 空元素:
- 实体:xml文档用到的特殊字符使用实体代替,如空格 小于<引号"等
DTD内部实体声明:<!ENTITY 实体名 "实体值">
DTD外部实体引入:<!ENTITY 实体名 SYSTEM "URI"> - PCDATA:parsed character data,比如开始标签和结束标签之间的文本
- CDATA:character data,不会被解析的文本,比如属性值
- 元素、标签、属性:<element attribute="value">content</element>
- XSD定义的文档模式
- xsd文档模式结构:
xsd:schema xmlns="url":xsd文档根元素为schema,定义的命名空间默认为${spring}/schema/beans
xmlns:xsd="url":xsd文档本身命名空间为w3c标准,xsd为前缀
targetNamespace:目标命名空间,通常在定义时与默认命名空间相同
<xsd:schema xmlns="http://www.springframework.org/schema/beans"xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.springframework.org/schema/beans"> - 引用xsd文档模式:
beans xmlns="namespace":默认命名空间为${spring}/schema/beans,所以beans前面没有前缀
xmlns:xsi="namespace":定义了这个属性后才可以使用属性xsi:schemaLocation引用自定义命名空间
xsi:schemaLocation="namespace url":引用自定义命名空间,给出名字和网址
xmlns:mvc="namespace":引用mvc命名空间,前缀为mvc,在schemaLocation中给出名称和网址<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd> - xsd文档模式元素定义:建议使用ref引用各级元素或类型定义,避免单根嵌套太深
- 简易元素:仅包含简单文本,可被转换为字符串、整数、逻辑值、日期等简单类型
<xsd:element name="simple" type="xsd:string" default="hehe"/>
简单类型有:xsd:(string|decimal|integer|boolean|date|time) - 复合元素:包含其他元素或属性,可以嵌套替换type,也可以命名并引用type="pairType"
<xsd:complexType name="pairType">
<xsd:attribute name="key" type="xsd:string" use="required"/>
<xsd:sequence><xsd:element name="value" type="xsd:integer" use="required"/>
<xsd:element name="enabled" type="xsd:boolean" default="false"/>
</xsd:sequence></xsd:complexType>
复合元素类型还支持扩展
<xsd:complexContent><xsd:extension base="pairType">...扩展的元素或属性
</xsd:extension></xsd:complexContent>
复合类型定义子元素:元素组和属性组只是简单封装,ref="groupName"引用组
xsd:all任意,xsd:sequence顺序,xsd:choice某个;
minOccurs最少次数,maxOccurs最多次数(unbounded不限,默认为1)
xsd:group元素组(包含xsd:all|sequence|choice),xsd:attributeGroup属性组
引用任意元素或属性:<xsd:any|anyAttribute minOccurs="0"/> - 属性:默认值default,固定值fixed,必选use,编辑xsd有来自xmlns:xsi的提示
<xsd:attribute name="lang" type="xsd:string" fixed="EN" use="required"/> - 值限定:替换type为枚举值供选择,支持限定数字范围、字符串长度等
<xsd:simpleType><xsd:restriction base="xsd:string">
<xsd:enumeration value="no"/><xsd:enumeration value="byName"/>
</xsd:restriction></xsd:simpleType> - 注释:编辑xml时自动提示的文本
<xsd:annotaion><xsd:documentation><!CDATA[
文本注释]]></xsd:documentation></xsd:annotation>
- 简易元素:仅包含简单文本,可被转换为字符串、整数、逻辑值、日期等简单类型
- xsd文档模式结构:
- 解析XML文档:
- DOM是官方W3C标准,加载整个文档并构建层次树结构(在内存和速度上受限),可反复遍历:
javax.xml.parsers.DocumentBuilderFactory.newInstance();
javax.xml.parsers.DocumentBuilder=documentBuilderFactory.newDocumentBuilder();
org.w3c.dom.Document=documentBuilder.parse(File | InputStream);
org.w3c.dom.NodeList=document.getElementByTagName("root"); - SAX基于事件模型,快速解析文档,DefaultHandler(2)处理标签
javax.xml.parsers.SAXParserFactory.newInstance();
javax.xml.parsers.SAXParser=saxParserFactory.newSAXParser();
saxPasrser.parse(File | InputStream, DefaultHandler); - DOM4J面向接口提高灵活性,集成XPath、XML Schema和事件模型:dom4j.jar
org.dom4j.io.SAXReader=new SAXReader();
org.dom4j.Document=saxReader.read(File | InputStream); - JDOM使用具体类简化API比DOM快(灵活性不够),使用Collections和SAX2解析器
org.jdom.SAXBuilder=new SAXBuilder();
org.jdom.Document=saxBuilder.build(File | InputStream); - 生成XML文档:
- DOM4J
org.dom4j.Document=org.dom4j.DocumentHelper.createDocument();
org.dom4j.Element=document.addElement("root");
new org.dom4j.io.XMLWriter(FileWriter).write(document); - 其他XML-Object互转方案:
- xstream:支持直接在Object对象和XML之间相互转换
com.thoughtworks.xstream.XStream xstream=new XStream();
xstream.alias("Person",Person.class);//自定义类元素名称xstream.aliasField("writer",Blog.class,"author");//字段author对应元素writer
xstream.useAttributeFor(Blog.class,"writer");xstream.registerConverter(AuthorConverter());//将Author转化为xml的转换器
xstream.addImplicitCollection(Blog.class,"entries");//忽略集合,直接列出entry
xstream.autodetectAnnotations(true);//懒惰lazy模式解析xml,不必处理多个含标记的类@XStreamAlias("type")//标记类名或字段@XStreamAsAttribute//字段作为xml属性@XStreamOmitField//忽略字段@XStreamImplicit//忽略集合元素,还可加上(itemFieldName="part")改变子项名@XStreamConverter(SingleValueCalenderConverter.class)//自定义转换器