LearningR-XML
因为要读取一个XML格式的数据,学习整理XML包。
1.XML包
1.1. 载入XML文件
有两种方法:
通过函数xmlTreeParse("file.xml")载入xml文件,如果不加入参数,将获得关于这个xml文件的所有信息。所以,这个函数通常配合xmlRoot()使用,比如xmlRoot(xmlTreeParse("file.xml"))以得到xml主体文件。
通过函数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的常见用法:
获取第一个son元素
/root/son[1]
getNodeSet(d, "/bookstore/book[1]")
获取最后一个son元素
/root/son[last()]
getNodeSet(d, "/bookstore/book[last()]")
获取前两个son元素
/root/son[position() < 3]
getNodeSet(d, "/bookstore/book[position() < 3]")
获取任意son2元素
//son2
getNodeSet(d, "/bookstore/book")
getNodeSet(d, "/bookstore/book/title")
获取任意son2的age属性
//son2[@age]
getNodeSet(d, "//book[@category]")
获取任意son2的age属性等于18的元素
//son2[@age=18]
getNodeSet(d, "//book[@category='web']")
获取root下所有元素
/root/*
getNodeSet(d, "/bookstore/*")
获取所有带属性的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
读取节点的值
#读取第一本书的"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)
读取节点的属性值
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相关推荐
- 利用dom4j将实体类转换为对应的xml报文
利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...
- mybatis的资源过滤错误及xml文件编码错误
mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...
- 【spring】spring基于xml的声明式事务控制
结构 domain package com.itheima.domain;import java.io.Serializable;public class Account implements Ser ...
- 【Spring】基于xml实现事务控制(银行转账)
代码结构 domain类 package com.itheima.domain;import java.io.Serializable;/*** 账户的实体类*/ public class Accou ...
- 【Spring】基于XML的IOC案例
代码结构: bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...
- Python 标准库之 xml.etree.ElementTree xml解析
Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...
- python读取xml文件报错ValueError: multi-byte encodings are not supported
1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...
- MyBatis——XML配置解析
目录 1. 环境配置(environments) 2. 属性(properties) 3. 类型别名(typeAliases) 方式一:通过typeAlias起别名 方式二:通过package起别名 ...
- linux下用js生成xml,js2xml:将javascript字符串转换为xml
有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在. var totalReviewsValue = 32; var averageRating = 4.5; if(t ...
- 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想预览下 什么效果,出现了这个问题, 就是不支持,刚开始想了半天为啥 ...
最新文章
- ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码
- SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段
- 使用Kettle抽取数据时,出现中文乱码问题解决方案
- js中将字符串转换成json的三种方式
- 《memory leak: stackwalk》
- c语言自增自减5运算符详解,巧用C语言中的自增自减运算符
- Qt Creator分析函数执行
- 牛客 - sequence(笛卡尔树+线段树)
- css 商城 两列_CSS 居中?来一探究竟
- sqlserver中日期保存及取值
- 浏览器全屏fullScreen
- java不同数据类型混合运算规则
- 如何用U盘重新安装Win10系统
- 拳皇中碰撞检测和血量变化的实现
- the little schemer 笔记(10)
- EasyBCD and UEFI
- 集合中的compare方法返回值说明
- 设计师 VS 装修工
- 网络摄像头RTSP拉流协议网页无插件视频直播平台EasyNVR为什么无法获取通道接口数据?
- 计算机桌面颜色异常怎样修复,电脑显示器变色怎么办?显示器颜色异常的原因及解决方法...