信息标记与提取方法(XML、JSON、YAML)

来源:互联网 发布:人民大学网络课程 编辑:程序博客网 时间:2024/05/22 00:55

信息标记

        实际应用中的原始数据往往是杂乱无章的,为了更加方便组织和存储各种信息,以及为计算机处理、传播消息提供一种统一的方法。必须对信息进行一定的标记,信息标记的特点一般有以下几点:

        1、标记后的信息可形成信息组织结构,增加了信息维度

        2、标记的结构与信息一样具有重要价值

        3标记后的信息可用于通信、存储或展示

        4、标记后的信息更利于程序理解和运用

        常用的信息标记主要有XML、JSON、YAML三种,基于WWW(World Wide Web)的信息组织方式是HTML(HyperText Markup Language,超文本标记语言)。



XML(可扩展标记语言)

XML简介

        XMLExtensible Markup Language)即可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

        在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。

        1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。可扩展标记语言可以使我们能够更准确的搜索,更方便的传送软件组件,更好的描述一些事物。例如电子商务交易等。

        XML和HTML都是标准通用标记语言的子集,XML是被设计用来传输和存储数据,而HTML是被设计用来显示数据的。

        XML语言具有如下一些特点:

        1、可扩展标记语言是一种很像超文本标记语言的标记语言。

        2、它的设计宗旨是传输数据,而不是显示数据。

        3它的标签没有被预定义。需要自行定义标签。

        4、它被设计为具有自我描述性。

        5、它是W3C的推荐标准。


XML与HTML的区别

        1XML不是HTML的替代。而是对HTML的补充。

        2、它和HTML为不同的目的而设计:XML被设计用来传输和存储数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。

        3、HTML旨在显示信息,而XML旨在传输信息。对XML最好的描述是:它是独立于软件和硬件的信息传输工具。


XML语法

        XML去掉了之前令许多开发人员头疼的标准通用标记语言的随意语法。在XML中,采用了如下的语法:

        1、任何的起始标签都必须有一个结束标签。

        2、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<简化语法/>。XML解析器会将其翻译成<简化语法></简化语法>。

        3标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。

        4、所有的特性都必须有值。

        5、所有的特性都必须在值的周围加上双引号。

        这些规则使得开发一个XML解析器要简便得多,而且也除去了解析标准通用标记语言中花在判断何时何地应用那些奇怪语法规则上的工作。仅仅在XML出现后的前六年就衍生出多种不同的语言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同时也将HTML改进为XHTML。XML运用广泛,它的相关技术比较丰富,例如DTD、 XPath、XLink、XPoint、XSLT等;


XML实例

<person>        <firstName>Tian</firstName>        <lastName>Song</lastName>        <address>                <streetAddr>中关村南大街5号</streetAddr>                <city>北京市</city>                <zipcode>100081</zipcode>        </address>        <prof>Computer System</prof><prof>Security</prof></person>

用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8"?><country>        <name>中国</name>        <province>                <name>黑龙江</name>                <cities>                        <city>哈尔滨</city>                        <city>大庆</city>                </cities>        </province>        <province>                <name>广东</name>                <cities>                        <city>广州</city>                        <city>深圳</city>                        <city>珠海</city>                </cities>        </province></country>

JSON(JS对象标记)

        JSON(JavaScript ObjectNotation, JS对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。


JSON 语法规则

        在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

        对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。

        数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript","vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

        1、对象表示为键值对

        2、数据由逗号分隔

        3花括号保存对象

        4、方括号保存数组

        JSON键值对:是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:

        {"firstName":"John"},这很容易理解,等价于这条 JavaScript 语句:{firstName = "John"}。

        JSON与JS 对象的关系:很多人搞不清楚 JSON 和 Js 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。如:

        var obj = {a: 'Hello', b:'World'}; //这是一个 JS对象,注意键名也是可以使用引号包裹的。

        var json = '{"a":"Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串,键名必须用引号包裹。

        JSON和JS 对象互转:要实现从对象转换为 JSON 字符串,使用JSON.stringify()方法:

        var json = JSON.stringify({a: 'Hello',b: 'World'}); // 结果是 '{"a": "Hello","b": "World"}'

        要实现从 JSON 转换为对象,使用 JSON.parse()方法:

        var obj = JSON.parse('{"a":"Hello", "b": "World"}'); // 结果是 {a: 'Hello', b: 'World'}


JSON和XML的比较

        1、可读性。JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

        2、可扩展性。XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

        3、编码难度。XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

        4、解码难度。XML的解析方式有两种:一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

        另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。凡是这样可扩展的结构数据解析起来一定都很困难。

        JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。

        而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

        以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

        5、除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。


JSON实例

{        “firstName” :“Tian” ,        “lastName” :“Song” ,        “address” : {                                “streetAddr” :“中关村南大街5号” ,                                “city” : “北京市” ,                                “zipcode” : “100081”                        } ,        “prof”  :[ “Computer System” , “Security” ]}

用JSON表示中国部分省市数据如下:

{        "name": "中国",        "province": [{                                "name": "黑龙江",                                "cities": {"city":["哈尔滨", "大庆"] }                           },                        {                                  "name":"广东",                                "cities":{"city": ["广州", "深圳", "珠海"] }        }]}

YAML(另一种标记语言)

YAML简介

        YAML(YAML Ain't Markup Language,另一种标记语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。

        它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表,标量等资料形态。它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定档、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

        尽管它比较适合用来表达阶层式(hierarchical model)的数据结构,不过也有精致的语法可以表示关联性(relational model)的资料。

        由于YAML使用空白字符和分行来分隔资料,使的他特别适合用grep、Python、Perl、Ruby操作。

其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构中会变得复杂而难以辨认。


YAML语法

        多行缩进:数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:

house:        family:                name: Doe                parents:                        - John                        - Jane                children:                        - Paul                        - Mark                        - Simone                address:                        number:34                        street:Main Street                        city:Nowheretown                        zipcode:12345

        注意:1、字串不一定要用双引号标识;

        2、在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);

        3、允许在文件中加入选择性的空行,以增加可读性;

        4、在一个档案中,可同时包含多个文件,并用“——”分隔;

        5、选择性的符号“...”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。

        单行缩写:YAML也有用来描述好几行相同结构的数据的缩写语法,数组用'[]'包括起来,hash用'{}'来包括。因此,上面的这个YAML能够缩写成这样:

house:        family: { name: Doe, parents: [John, Jane], children: [Paul,Mark, Simone] }        address: { number: 34, street: Main Street, city: Nowheretown,zipcode: 12345 }

        此外YAML使用表达整块数据表示注释。


YAML与JSON的区别

        虽然YAML是参考JSON,XML和SDL等语言,不过跟这些语言比起来,YAML仍有自己的特色。

        JSON的语法是YAML1.2版的子集,同时非常接近YAML1.0与1.1版的子集,因此大部分的JSON文件都可以被YAML的剖析器剖析。这是因为JSON的语法结构和YAML的内置格式相同。虽然大范围的分层也可以使用类似JSON的内置格式,不过YAML标准并不建议这样使用,除非这样编写能让文件可读性增加。YAML的许多扩展在JSON是找不到的,如:进阶资料形态、关系锚点、字串不需要双引号、映射资料形态会储存键值的顺序。


YAML实例

firstName : TianlastName : Songaddress  :        streetAddr : 中关村南大街5号        city  : 北京市        zipcode : 100081prof  :‐Computer System‐Security


小结

        1、XML:最早的通用信息标记语言,可扩展性好,但繁琐,适用于Internet上的信息交互与传递;

        2、JSON:信息有类型,适合程序处理(js),较XML简洁,适用于移动应用云端和节点的信息通信,无注释。

        3、YAML:信息无类型,文本信息比例最高,可读性好,适用于各类系统的配置文件,有注释易读。



信息提取的一般方法

        从标记后的信息(XML JSON YAML)中提取所关注的内容:(标记, 信息)。

        方法一:完整解析信息的标记形式,再提取关键信息,需要标记解析器。例如:bs4库的标签树遍历。

        优点:信息解析准确

        缺点:提取过程繁琐,速度慢

        方法二:无视标记形式,直接搜索关键信息。对信息的文本查找函数即可。

        优点:提取过程简洁,速度较快

        缺点:提取结果准确性与信息内容相关

        融合方法:结合形式解析与搜索方法,提取关键信息。需要标记解析器及文本查找函数。

原创粉丝点击