首页 > 代码库 > 用R解析XML
用R解析XML
一、XML基本语法:
如果我们用爬网页的方式获取数据,必然要解析网页。网页中存储数据的部分一般用XML语法,所以这里介绍一下R解析XML的方法。其实这部分内容挺简单的,没有高深的技巧,很容易搞明白。
首先要知道XML的基本要素:元素、属性、文本数据,我们可以看如下xml文件:
<bookstore><book> <title lang="eng">Harry Potter</title> <price>29.99</price></book><book> <title lang="eng">Learning XML</title> <price>39.95</price></book></bookstore>
在这个xml里,<bookstore>是根元素,它有两个子元素<book>,第一个<book>元素又有两个子元素分别是<title>和<price>,xml就是这样通过父元素带子元素的形式组成树状结构;其中元素<title>有属性lang,其值eng必须用引号引起来,有文本数据Harry Potter(XML本身就是文本文件),R中有专门的方法可获取该文本数据。元素<price>只有文本数据,无属性。
XML文件的基本结构如上所述,那么怎么获取这些属性、文本数据呢?这需要用到XPath语法,主要的路径表达式如下:
表达式 | 描述 |
/ | 从根元素选取 |
// | 选择文档中的元素,而不考虑它们的位置 |
@ | 选取属性 |
举几个例子:
路径表达式 | 结果 |
/bookstore | 选取根元素bookstore 注意:以“/”开头,表示该路径为绝对路径 |
//book | 选择所有的book元素,而不考虑它的具体位置 |
//@lang | 选取所有名为lang的属性 |
/bookstore//price | 选择根元素bookstore下所有的price元素 |
/bookstore/book | 选择根元素bookstore下所有book子元素 |
//title[@lang] | 选取所有带属性lang的title元素 |
//title[@lang="eng"] | 选取所有带属性lang且值为eng的title元素 |
二、R中解析XML的函数:
R中解析的函数都在XML这个包中,用法如下:
1)读取xml文件的函数xmlParse:
如我们将文章开头提到的xml存为books.xml文件,运行如下:
> library(XML);> doc = xmlParse(‘books.xml‘);> > doc<?xml version="1.0"?><bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book></bookstore>
2)获取元素的函数getNodeSet:
> prices = getNodeSet(doc, ‘/bookstore//price‘);
> prices
[[1]]
<price>29.99</price>
[[2]]
<price>39.95</price>
attr(,"class")
[1] "XMLNodeSet"
3)解析元素的文本数据xmlValue:
> xmlValue(prices[[1]])[1] "29.99"
xmlValue的输入参数类型为XMLNode,如果想一次性获得XMLNodeSet中元素的文本数据,可用如下函数:
> sapply(1:length(prices), function(x) xmlSApply(prices[[x]], xmlValue)) text text "29.99" "39.95
用R解析XML