XML和XPath使用方法备忘



如果把XML看作传统的关系数据库,那么XPath就是SQL。R语言中的XML包可用来解析处理XML或是HTML数据。在之前的文章中,我们了解到readHTMLTable函数,如果页面中的数据是一个规整的表格,用它是很方便的,但如果页面中是一些非结构化的数据,就要用到XML包中的其它函数了。其中最重要两个函数是xmlTreeParse()和getNodeSet(),前者负责抓取页面数据并形成树状结构,后者对抓取的数据根据XPath语法来选取特定的节点集合。下面用一个简单的例子来看一下这两个函数配合使用的效果。

这里是一个简单的XML文档,下面是一些简单的节点选取操作:

  
  
  1. library(XML) 
  2. # 解析XML文件 
  3. doc <- xmlParse('http://www.w3school.com.cn/example/xmle/books.xml') 
  4. # 选取属于 bookstore 子元素的第一个 book 元素 
  5. getNodeSet(doc,'/bookstore/book[1]')  
  6. # 选取属于 bookstore 子元素的最后一个 book 元素。 
  7. getNodeSet(doc,'/bookstore/book[last()]')  
  8. # 选取最前面的两个属于 bookstore 元素的子元素的 book 元素 
  9. getNodeSet(doc,'/bookstore/book[position()<3]')  
  10. # 选取所有拥有名为 lang 的属性的 title 元素。 
  11. getNodeSet(doc,'//title[@lang]')  
  12. #选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性 
  13. getNodeSet(doc,"//title[@lang='eng']") 
  14. # 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 
  15. getNodeSet(doc,"/bookstore/book[price>35.00]") 
  16. # 选取 bookstore 元素中的 book 元素的所有 title 元素,且 price 元素的值须大于 35.00。 
  17. getNodeSet(doc,"/bookstore/book[price>35.00]/title") 
  18. # 选取 book 元素的所有 title 和 price 元素 
  19. getNodeSet(doc,"//book/title | //book/price") 
  20. # 选取文档中的所有 title 和 price 元素 
  21. getNodeSet(doc,"//title | //price") 
  22. # 选取 bookstore 元素的所有子元素 
  23. getNodeSet(doc,"/bookstore/*") 
  24. # 选取所有带有属性的 title 元素 
  25. getNodeSet(doc,"//title[@*]") 
  26. # 选择所有属性lang的值 
  27. unlist(getNodeSet(doc,"//title/@lang"),use.names = FALSE
  28. # title结点下的所有文本 
  29. getNodeSet(doc,"//title/text()") 

如果你比较习惯操作R,也可以用xmlToList转成list格式再说。如果说XML的结构比较简单,我们可以使用xmlToDataFrame直接将其转为R语言中的data.frame。下面再来看一个操作豆瓣API的例子和其它一些有用的函数。

  
  
  1. # 豆瓣的例子 
  2. url <- 'http://api.douban.com/movie/subject/imdb/tt0111161' 
  3. # 解析获得树结构数据 
  4. doc <- xmlTreeParse(url,useInternal=TRUE,encoding="UTF-8")  
  5. # 获得根结点信息 
  6. top <- xmlRoot(doc) 
  7. # 获取子节点 
  8. top[[5]]  
  9. # 子节点名称 
  10. xmlName(top[[5]]) 
  11. # 按名字取子节点 
  12. top[['author']] 
  13. # 与上一命令相同 
  14. xmlChildren(top)[['author']] 
  15. # 显示子节点数量 
  16. xmlSize(top) 
  17. # 获取节点元素 
  18. xmlValue(top[['author']]) 
  19. # 获取节点属性 
  20. xmlAttrs(top[[5]])  
  21. #获取节点属性值 
  22. xmlGetAttr(top[[5]],name='href')  
  23. # 向量化操作,获取所有子结点的名字 
  24. sapply(xmlChildren(top), xmlName) 
  25. # 使用专门的xmlSApply函数,等价于上一条 
  26. xmlSApply(top, xmlName)  
  27.  
  28. # 使用xpath语法进行XML查询 
  29. # 找出合乎条件的节点,例如找出所有主演的节点集合 
  30. (node <- getNodeSet(top, 
  31. path="//db:attribute[@name='cast']")) 
  32. # 然后取出其中的元素 
  33. sapply(node,xmlValue) 
  34. # 也可以从根节点一步操作得到结果 
  35. (cast <- xpathSApply(top, 
  36. path="//db:attribute[@name='cast']"
  37. xmlValue)) 
  38.  
  39. # 取出link节点中的属性和属性值 
  40. # 定义命名空间,再使用前述函数 
  41. namespaces <- c(ns='http://www.w3.org/2005/Atom'
  42. getNodeSet(top, "//ns:link", namespaces) 
  43. xpathSApply(top, "//ns:link",  
  44. fun=xmlAttrs
  45. namespacesnamespaces=namespaces) 
  46. xpathApply(top, "//ns:link",  
  47. fun=xmlGetAttr
  48. 'href',  
  49. namespacesnamespaces=namespaces) 

 

本文来源 我爱IT技术网 http://www.52ij.com/jishu/XML/12424.html 转载请保留链接。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值