首页 > 代码库 > 用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