XML文件简介
在计算机领域,XML(extensible markup language)指的是可扩展标记语言,类似于HTML,它设计的宗旨是传输数据,而不是显示数据,所以这也是它和HTML的一个明显的差别。另外一个差别是XML的标签没有被预定义,我们可以根据自己的需要自行设计标签名字,所以具有自我描述性。
一个具体的例子
<?xml version="1.0" encoding="UTF-8"?>
以上就是一个XML的例子,它拥有发送者和接受者,标题,内容等信息,所以自我描述非常清晰。但是这个文档实际上只是包装了一些数据信息,而并没有做任何传输、接收和显示文档的信息,也就说你可以把他当成一个纯文本。纯文本的特点会让你在不同的操作系统进行数据共享的门槛大大降低。
XML结构
XML文档是一种树结构,从根部开始扩展到枝叶。第1行是XML声明,它定义版本和编码。第2行是根元素,和第7行相对应,<message>叫做起始标签,</message>叫做结束标签,结束标签有一个"/"符号。
XML文档必须包含根元素,所有元素都可以拥有子元素。
XML文档均可拥有文本内容和属性。例如content元素下,属性time为noon,属性值要加引号。
XML文档元素必须要有结束标签,标签对大小写敏感,而且必须正确嵌套,也就是说一个标签必须完整地嵌套在另一个标签里。
开始读取文件,首先加载XML和RCurl包。
library(XML)
## Loading required package: bitops
url <- "https://d396qusza40orc.cloudfront.net/getdata0.000000data0.000000restaurants.xml"
file_url <- getURL(url)doc <- xmlTreeParse(file_url,useInternal=TRUE)
rootNode <- xmlRoot(doc)
注意:这里,url是https传输的,xmlTreeParse不支持,会报出不是一个XMl文档的错误,所以我们需要先用getURL处理一下,然后用xmlTreeParse函数读取,如果是http的话,就可以直接把url传入xmlTreeParse函数。现在你可以把doc想象成一棵大树,也就是XML文档的树结构,xmlRoot就是获取文档节点的函数。
xmlName(rootNode)
## [1] "response"
names(rootNode)
## row
这里,我们通过xmlName函数获取根节点的名称是response,根节点下面包括叫做row的子节点。下面,我们分析一下如下的操作:
rootNode[[1]][[1]][[1]]
## <name>410</name>
我们在选择xml文档的节点时可以采用如上的类似于R语言中列表元素的索引。其中rootNode[[1]]我们选择的进入根节点response下面的第一个子节点,就是"row"节点,rootNode[[1]][[1]]进入的就是row节点下的第一个子节点,也叫做row,rootNode[[1]][[1]][[1]],进入的是这个row节点下的第一个子节点就是name节点。所以我们获得了如上的name元素。