XML

简介

XML与HTML
  • XML被设计用来传输和存储数据,HTML被设计用来显示数据。
  • XML标签没有被预定义,需要自行定义标签,XML 被设计为具有自我描述性; HTML中使用的标签(以及 HTML的结构)是预定义的,HTML文档只使用在HTML标准中定义过的标签(比如 <p><h1> 等等)。

结构

命名空间

XML 命名空间提供避免元素命名冲突的方法。(使用前缀来避免命名冲突)

xmlns:namespace-prefix=\"namespaceURI\"

用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

默认的命名空间(Default Namespaces):为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。

xmlns =\"namespaceURI\"

XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。

<bookstore>
<book category="CHILDREN">
    <title>Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
</book>
<book category="WEB">
    <title>Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
</book>
</bookstore>

元素(Element):从(且包括)开始标签直到(且包括)结束标签的部分。 父元素,子元素;

XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。

标签(Tag):XML 元素使用 XML 标签进行定义。XML 标签对大小写敏感。所有元素都必须有结束标签(声明不属于XML本身的组成部分。它不是XML 元素,也不需要关闭标签。)

属性(Attribute):键值对,值必须加引号(单引号和双引号均可使用,如果属性值本身包含双引号,那么有必要使用单引号包围它)。

\<note date=\"08/08/2008\"\>

因使用属性而引起的一些问题:

  • 属性无法包含多重的值(元素可以)
  • 属性无法描述树结构(元素可以)
  • 属性不易扩展(为未来的变化)
  • 属性难以阅读和维护

在 XML 中,您应该尽量避免使用属性。元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

特殊字符

命令特殊字符意义
&lt;<小于
&gt;>大于
&amp;&和号
&apos;'单引号
&quot;"引号

空格

文档中的空格不会被缩减。

注释

\<!\-- This is a comment \--\>

XML验证

XML DTD

XML Schema:An XML schema language is used to describe the structure and content of an XML document. The one that currently rules the roost is the W3C XML Schema Definition Language typically abbreviated as XSD.

如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。

显示

CSS

XSLT 是首选的 XML 样式表语言。

XML解析

解析方法

  1. DOM XML DOM (XML Document Object Model) 定义了访问和操作 XML文档的标准方法。 DOM 把 XML 文档作为树结构来查看。能够通过 DOM树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。
  2. SAX

XML解析器

Tree Model-based APIs:把 XML 转换为 DOM对象。

Cursor-based APIs

Streaming APIs

.NET Framework实现

  1. XmlReader, XmlWriter

  2. System.Xml.XPath
    快速查询定位XML元素。

System.Xml.Xsl

System.Xml.Schema

System.Xml.Linq

System.Xml.XmlDocument/XmlNode

  • Properties

    • Attributes

    • DocumentElement:获取根元素。

    • DocumentType:DOCTYPE

    • ChildNodes

    • FirstChild

    • LastChild

    • ParentNode

    • Item[String]:获取为指定名称的第一个子节点。

    • Name

    • LocalName

      If the node does not have a prefix, LocalName is the same as Name.

    • Value

  • Methods

    • AppendChild

XPathNavigator

Namespace: System.Xml.XPath

  1. Assembly: System.Xml (in System.Xml.dll)

Provides a cursor model for navigating and editing XML data.

  1. System.Xml.XmlReader

Represents a reader that provides fast, noncached, forward-only access to XML data.

Java实现

Java XML Parser - JournalDev

Python实现

Python有三种方法解析XML,SAX,DOM,以及ElementTree。ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

**注:**因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

XPath查询语言

XPath 是用于XML文档的查询语言,可以查询XML元素节点并计算相应的值。

简写语法(Abbreviated syntax)

使用节点名,按XML树结构逐级限定查询节点位置。

  1. 绝对路径
/tag1/tag2/.../tagn
/tag1/tag2/.../@prop
xxx//tag/...
xxx/tag/*

//查询指定范围内所有层级的节点。

*查询指定层级的所有节点。

  1. 相对路径
childname/...
./childname
../tag

使用节点名,根据当前节点位置指定查询节点。

多个路径可以由|运算符连接,从而同时选择多个路径。

限定声明(Predicates)

每一层级声明可以附加限定声明。

限定表达式结果
name[1]选取满足表达式条件的第一个元素。
name[last()]选取满足表达式条件的最后一个元素。
name[last()-n]
name[position()<n]
name[@lang]选取满足表达式且具有lang属性的元素。
name[@lang='en']选取满足表达式且lang='en'的元素
name[@*]选取具有属性的节点。
name[price>100]选取满足表达式且其子元素price>100的节点。

完整语法(Full Syntax)

使用路径表达式(Location Path)扩展简写语法:

/step1/step2/step3...
step1/step2/...

每一级step由三部分组成(可省略):

axis::test[predicates]
  • 轴(axis): 指定基于当前节点的查询范围,简写语法中的轴总是child(省略)。

  • 节点测试(test): 测试满足条件的节点,简写语法中总是节点名

    text():获取节点的文本内容

    comment():获取节点内的注释内容

    node():获取节点。

  • 限定声明(predicates):与简写语法一致。

完整语法简写语法Notes
ancestor选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self选取当前节点及其所有先辈(父、祖父等)。
attribute@@abc is short for attribute::abc
childxyz is short for child::xyz
descendant选取当前节点的所有后代元素(子、孙等)。
descendant-or-self//// is short for /descendant-or-self::node()/
following选取文档中当前节点的结束标签之后的所有节点。
following-sibling选取当前节点之后的所有同级节点。
namespace选取当前节点的所有命名空间节点。
parent.... is short for parent::node()
preceding选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling选取当前节点之前的所有同级节点。
self.. is short for self::node()

运算符

实例

//div[@class='tab-content-item']  # 查询所有指定类型的div节点
div[@class='p-name p-name-type-2']/a/em//text() # 查询指定范围内所有层级的文本
div[@class='p-operate']/a[1]/attribute::data-sku[1] # 查询指定节点的指定属性

XSLT

XQuery

XML Query

Xlink和XPointer

SVG

使用SVG构造网站图标
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
    <text y="0.9em" font-size="90">🍦</text>
</svg>