因为要读取一个XML格式的数据,学习整理XML包。

1.XML包

1.1. 载入XML文件

有两种方法:

    1. 通过函数xmlTreeParse("file.xml")载入xml文件,如果不加入参数,将获得关于这个xml文件的所有信息。所以,这个函数通常配合xmlRoot()使用,比如xmlRoot(xmlTreeParse("file.xml"))以得到xml主体文件。

    1. 通过函数xmlTreeParse("file.xml", useInternalNodes = TRUE)来得到加入首行的xml文件主体

library(RCurl)
library(XML)
url<-"http://www.w3school.com.cn/example/xdom/books.xml"  #注,也可以为url复制本地文件的路径
doc<-xmlTreeParse(getURL(url),useInternal = TRUE)
d <- xmlRoot(doc)

1.2. 获取特定的节点

详细XPath语言见XPath 语法

使用函数getNodeSet(doc, XPath)

XPath的常见用法:

  1. 获取第一个son元素
    /root/son[1]

getNodeSet(d, "/bookstore/book[1]")
  1. 获取最后一个son元素
    /root/son[last()]

getNodeSet(d, "/bookstore/book[last()]")
  1. 获取前两个son元素
    /root/son[position() < 3]

getNodeSet(d, "/bookstore/book[position() < 3]")
  1. 获取任意son2元素
    //son2

getNodeSet(d, "/bookstore/book")
getNodeSet(d, "/bookstore/book/title")
  1. 获取任意son2的age属性
    //son2[@age]

getNodeSet(d, "//book[@category]")
  1. 获取任意son2的age属性等于18的元素
    //son2[@age=18]

getNodeSet(d, "//book[@category='web']")
  1. 获取root下所有元素
    /root/*

getNodeSet(d, "/bookstore/*")
  1. 获取所有带属性的son元素
    //son[@*]

getNodeSet(d, "//book[@*]")

节点相关函数

  • class(xmltop) #查看类

  • xmlName(node):查看根目录名。
    node[[1]]:查看第一个子目录

node[1]]:查看第一个子目录的第二个节点

  • xmlSize(node):该节点下字节点数量。

  • xmlAttrs(node):该节点属性。

  • xmlGetAttr(node, attr):该节点某一属性。

  • xmlValue(node):该节点值。

  • xmlChildren(node):该节点下的子节点。

class(d)
xmlName(d)
xmlSize(d)
xmlAttrs(d)
xmlAttrs(d[[1]])
xmlAttrs(d[[1]][[1]])
xmlGetAttr(d[[1]][[1]], "lang")
xmlChildren(d[[1]])#通过以下方式获得的节点类型不同,建议使用getNodeSet
d[[1]][[1]]
getNodeSet(d, "//book/title")[[1]]
getNodeSet(d, "//book[1]/title")

1.3 xmlSApply和xmlApply

  1. 读取节点的值

#读取第一本书的"title"的值
d[[1]][[1]][[1]]
xmlValue(d[[1]][[1]])
xpathSApply(d, "/bookstore/book[1]/title", xmlValue)
xpathSApply(d, "//book[1]/title", xmlValue)xpathSApply(d, "//book/title", xmlValue)xpathSApply(d, "//book[1]/title", xmlName)
xpathSApply(d, "//book[1]/title", xmlSize)
xpathSApply(d, "//book[1]/title", xmlAttrs)#xpathSApply和xpathApply的区别:
#xpathSApply是xpathApply读取值的一个因子
xpathApply(d, "//book[1]/title", xmlName)
xpathApply(d, "//book[1]/title", xmlSize)
xpathApply(d, "//book[1]/title", xmlAttrs)
  1. 读取节点的属性值

xmlGetAttr(d[[1]][[1]], "lang")title<-getNodeSet(d, "//book[1]/title")
title_lang<-sapply(title, xmlGetAttr, "lang")
sapply(xmlChildren(d), xmlGetAttr, "category")#也可以通过该方法读取节点的值
title_value<-sapply(title, xmlValue)
sapply(xmlChildren(d[["book"]]), xmlValue)

1.4 xml格式转dataframe

book <- getNodeSet(d, "//book")
mybook <- sapply(book,xmlValue)#第一种方式,直接用xmlToDataFrame()函数
xmlToDataFrame(d)
#由于book[4]不规范,导致转化失败
xmlToDataFrame(xmlChildren(d)[["book"]])
xmlToDataFrame(getNodeSet(d, "//book[1]"))
xmlToDataFrame(nodes = getNodeSet(d, "//book/title"))#第二种方式,数据格式处理专用包plyr
library("plyr")
#先转成list,再转dataframe
MyBooks <- ldply(xmlToList(d), data.frame)
MyBooks <- ldply(xmlToList(getNodeSet(d, "//book")), data.frame)#第三种方式,读取单个值后组合为dataframe
author <- xpathSApply(d, "//book/author", xmlValue)
#对第四个book的author值做特殊处理
author4 <- xpathSApply(d, "//book[4]/author", xmlValue)
author4 <- paste(author4, collapse = ", ")
author <- c(author[1:3],author4)
MyBooks <- data.frame(category=sapply(xmlChildren(d), xmlGetAttr, "category"),title=xpathSApply(d, "//book/title", xmlValue),author,year=xpathSApply(d, "//book/year", xmlValue),price=xpathSApply(d, "//book/price", xmlValue))

LearningR-XML相关推荐

  1. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  2. mybatis的资源过滤错误及xml文件编码错误

    mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...

  3. 【spring】spring基于xml的声明式事务控制

    结构 domain package com.itheima.domain;import java.io.Serializable;public class Account implements Ser ...

  4. 【Spring】基于xml实现事务控制(银行转账)

    代码结构 domain类 package com.itheima.domain;import java.io.Serializable;/*** 账户的实体类*/ public class Accou ...

  5. 【Spring】基于XML的IOC案例

    代码结构: bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  6. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

  7. python读取xml文件报错ValueError: multi-byte encodings are not supported

    1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...

  8. MyBatis——XML配置解析

    目录 1. 环境配置(environments) 2. 属性(properties) 3. 类型别名(typeAliases) 方式一:通过typeAlias起别名 方式二:通过package起别名 ...

  9. linux下用js生成xml,js2xml:将javascript字符串转换为xml

    有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在. var totalReviewsValue = 32; var averageRating = 4.5; if(t ...

  10. Unable to preview the file. Please open a JS, CSS or HML file of the JS UI framework or a layout.xml

    这个是DevEco 开发工具提示的. 这个问题是打开HarmonyOS graphic 里面的xml文件,比如自己画了一个shape想预览下 什么效果,出现了这个问题, 就是不支持,刚开始想了半天为啥 ...

最新文章

  1. ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码
  2. SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段
  3. 使用Kettle抽取数据时,出现中文乱码问题解决方案
  4. js中将字符串转换成json的三种方式
  5. 《memory leak: stackwalk》
  6. c语言自增自减5运算符详解,巧用C语言中的自增自减运算符
  7. Qt Creator分析函数执行
  8. 牛客 - sequence(笛卡尔树+线段树)
  9. css 商城 两列_CSS 居中?来一探究竟
  10. sqlserver中日期保存及取值
  11. 浏览器全屏fullScreen
  12. java不同数据类型混合运算规则
  13. 如何用U盘重新安装Win10系统
  14. 拳皇中碰撞检测和血量变化的实现
  15. the little schemer 笔记(10)
  16. EasyBCD and UEFI
  17. 集合中的compare方法返回值说明
  18. 设计师 VS 装修工
  19. 网络摄像头RTSP拉流协议网页无插件视频直播平台EasyNVR为什么无法获取通道接口数据?
  20. 计算机桌面颜色异常怎样修复,电脑显示器变色怎么办?显示器颜色异常的原因及解决方法...

热门文章

  1. 轉:showModalDialog和showModelessDialog使用心得
  2. 多租户数据库性能测试手册
  3. 当微信小程序遇上TensorFlow:Server端实现补充
  4. PC处理器装机中的认识 三
  5. ORACLE DataGuard主备切换
  6. SATA硬盘如何使用GHOST
  7. java 缘起_缘起 网络编程
  8. JSP页面图片路径为中文时乱码解决办法
  9. [转载]关于request和session详解
  10. DOM0,DOM2,DOM3事件,事件基础知识入门