简单介绍下,XSL(eXtensible Stylesheet Language,扩展样式语言)是描述XML文档结构规则的语言,XML Schema是其中使用最广泛的一种。也就是说,你可以使用XML Schema限制某一类XML完全按照你的规范来编写代码。
比如,你想让某个XML文件以MainNode作为根节点名称,但可能有main_node作为根节点名称的,符合XML文件规范,但你就是识别不了它。这就比较尴尬了。那么,使用XSL验证机制,就可以保证XML文件100%符合你的规范。
也许做过HTML4的前端知道,DOCTYPE需要指向一个dtd文件,比如
1 | < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
DTD也是XSL的一种,但因为对扩展的支持性不好,在HTML5中被弃用,之后DTD的使用将会越来越少。对于基于HTML4的网页代码都使用DTD作为规则文件对网页文档进行规范。HTML是从XML基础上演化而来的,当然也属于XML标准规范的一部分。使用标准XML也可以使用dtd进行描述。dtd此处不细说,此处说说XML Schema。
1 2 3 4 5 | <?xml version="1.0" encoding="UTF-8"?> <f:MainNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="urn:fawdlstty:2017.01" xsi:schemaLocation="urn:fawdlstty:2017.01 faw.xsd"> <f:name>fawdlstty</f:name> <f:addr xsi:type="URL">www.fawdlstty.com</f:addr> </f:MainNode> |
大概使用XML Schema的XML文件长这样。小伙伴们就发现了,每个标签或者属性都是冒号分开的两个名称。下面我详细解释下这种XML写法。首先,根节点中必须要有一行,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",代表着这是基于XML Schema的一个实例,这儿xmlns:f的意思是,定义f这个命名空间,描述指向“urn:fawdlstty:2017.01”,意味着,只要是以f开头的标签或属性,都要遵循这个描述地址所指向的规范。假如这儿写的是xmlns,后面没有接冒号,那含义就是代表默认命名空间规范,意味着所有没有带命名空间的标签和属性都得遵循这个规范。
XML Schema最大优势是支持扩展,也就是说,可以一个XML引用多个Schema验证文件,只需保证命名空间名称和资源名称不重复即可。
下面附一则XML Schema教程链接:XML Schema语法教程
XML Schema除了能验证文档规范性以外还有一个比较有特色的功能,那就是给智能IDE提供自动提示。这个就非常强大了,可以说,有了Schema,写XML就像写代码那样简单了。
基于XSL外,还有一个用的非常广泛的一种语言,叫XSLT(eXtensible Stylesheet Language Transformations,扩展样式转换语言),用于将XML文档转换为其他任意格式的语言。附上教程链接:XSLT语法教程
说了这么多,来点干货。对于现在的XML的访问库啊,暂时还没找到一个好用的,好用的JSON库比如jsoncpp都特别好用,好用的XML库还没找到。首先对于XML吧,不支持带命名空间的就直接刷下去大多数了,只能在为数不多的剩下的中找。我目前使用的是一个基于CXml的库,这玩意封装的挺好,但写起来还是稍微有点麻烦。我就在这库基础上再次封装了一层。地址在这:hanXmlLib
这个库目前比较简陋,但也挺好用了。我也在在慢慢的完善它。
对于不带命名空间的XML来说,可以这么用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 打开文档 hXmlDoc doc = hXmlDoc::create_from_file (_T ("D:/a.xml")); // 根据字符串创建文档 hXmlDoc doc2 = hXmlDoc::create_from_string (_T ("<Root><a /></Root>")); // 创建新文档 hXmlDoc doc3 = hXmlDoc::create_new (_T ("RootNode")); // 创建节点 hXmlObject obj = doc.create_child (_T ("ChildNode")); // 设置属性 obj.set_attr (_T ("name"), _T ("aaa")); // 获取属性 CString attr = obj.get_attr (_T ("name")); // 移除属性 obj.remove_attr (); // 移除当前节点 obj.remove (); // 保存当前文档 doc.save (_T ("D:/a.xml")); |
带命名空间的使用上稍微麻烦点,需要初始化命名空间。打开文档和从字符串中创建的代码可以自动捕获命名空间,但对于新建节点对象的命名空间来说,就需要稍微麻烦一些,初始化列表写完所有命名空间,另外还需要调用set_schema_location函数,用于设置Uri地址。
还在持续更新呀
写着玩咯