XML

XML,Extensible Markup Language,可扩展标记语言,用于定义文档类型DTD、描述标记数据XML。
DTD,Document Type Definition,文档类型定义,用于定义xml数据交换标准及文档规范验证。
XSD,Xml Schemas Definition,文档模式定义(替代DTD),用于描述和验证XML文档结构。
  • XML和DTD的构建模块:DTD本身不是XML文档,不支持自定义类型,不支持域名机制
    1. 元素、标签、属性:<element attribute="value">content</element>
      DTD声明元素:<!ELEMENT 元素名 内容>,通配符?*+,<!ATTLIST 元素名 属性名 类型 默认值>
      1. 空元素:
        <!ELEMENT jsp:setProperty EMPTY>
      2. 带子元素:
        <!ELEMENT jsp:include (jsp:param*)>
      3. 元素属性:#REQUIRED必须,#IMPLIED可选;类型可以是CDATA或自定义ENTITY
        <!ATTLIST jsp:include
        flush %Bool; "false"
        page %URL; #REQUIRED
        >
      4. 带PCDATA的元素:
        <!ELEMENT jsp:expression (#PCDATA)>
      5. 内嵌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
    2. 实体:xml文档用到的特殊字符使用实体代替,如空格&nbsp;小于&lt;引号&quot;等
      DTD内部实体声明:<!ENTITY 实体名 "实体值">
      DTD外部实体引入:<!ENTITY 实体名 SYSTEM "URI">
    3. PCDATA:parsed character data,比如开始标签和结束标签之间的文本
    4. CDATA:character data,不会被解析的文本,比如属性值
  • XSD定义的文档模式
    1. 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">
    2. 引用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.xsd
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd>
    3. xsd文档模式元素定义:建议使用ref引用各级元素或类型定义,避免单根嵌套太深
      1. 简易元素:仅包含简单文本,可被转换为字符串、整数、逻辑值、日期等简单类型
        <xsd:element name="simple" type="xsd:string" default="hehe"/>
        简单类型有:xsd:(string|decimal|integer|boolean|date|time)
      2. 复合元素:包含其他元素或属性,可以嵌套替换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"/>
      3. 属性:默认值default,固定值fixed,必选use,编辑xsd有来自xmlns:xsi的提示
        <xsd:attribute name="lang" type="xsd:string" fixed="EN" use="required"/>
      4. 值限定:替换type为枚举值供选择,支持限定数字范围、字符串长度等
        <xsd:simpleType><xsd:restriction base="xsd:string">
        <xsd:enumeration value="no"/><xsd:enumeration value="byName"/>
        </xsd:restriction></xsd:simpleType>
      5. 注释:编辑xml时自动提示的文本
        <xsd:annotaion><xsd:documentation><!CDATA[
        文本注释]]></xsd:documentation></xsd:annotation>
  • 解析XML文档:
    1. 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");
    2. SAX基于事件模型,快速解析文档,DefaultHandler(2)处理标签
      javax.xml.parsers.SAXParserFactory.newInstance();
      javax.xml.parsers.SAXParser=saxParserFactory.newSAXParser();
      saxPasrser.parse(File | InputStream, DefaultHandler);
    3. DOM4J面向接口提高灵活性,集成XPath、XML Schema和事件模型:dom4j.jar
      org.dom4j.io.SAXReader=new SAXReader();
      org.dom4j.Document=saxReader.read(File | InputStream);
    4. JDOM使用具体类简化API比DOM快(灵活性不够),使用Collections和SAX2解析器
      org.jdom.SAXBuilder=new SAXBuilder();
      org.jdom.Document=saxBuilder.build(File | InputStream);
  • 生成XML文档:
    1. DOM4J
      org.dom4j.Document=org.dom4j.DocumentHelper.createDocument();
      org.dom4j.Element=document.addElement("root");
      new org.dom4j.io.XMLWriter(FileWriter).write(document);
  • 其他XML-Object互转方案:
    1. 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)//自定义转换器





posted @ 2012-07-30 14:42 xlongwei 阅读(...) 评论(...) 编辑 收藏
xlongwei