Nic*_*ick 3 xml import xpath r dataframe
此问题类似于上一个问题,将XML的所有字段(和子字段)导入为数据帧,但我想只提取XML数据的一个子集,并希望包含缺失/多个值.
我从一个XML文件开始,想要根据它包含的一些数据在R中构造一个数据帧,由XML元素的内容定义.用一个例子来解释是最容易的.在下面,我想要找出每个城市的地标信息(即使没有地标元素或有几个),并忽略有关电台的信息.
<world>
<city>
<name>London</name>
<buildings>
<building>
<type>landmark</type>
<bname>Tower Bridge</bname>
</building>
<building>
<type>station</type>
<bname>Waterloo</bname>
</building>
</buildings>
</city>
<city>
<name>New York</name>
<buildings>
<building>
<type>station</type>
<bname>Grand Central</bname>
</building>
</buildings>
</city>
<city>
<name>Paris</name>
<buildings>
<building>
<type>landmark</type>
<bname>Eiffel Tower</bname>
</building>
<building>
<type>landmark</type>
<bname>Louvre</bname>
</building>
</buildings>
</city>
</world>
Run Code Online (Sandbox Code Playgroud)
理想情况下,这将进入如下所示的数据框:
London Tower Bridge
New York NA
Paris Eiffel Tower
Paris Louvre
Run Code Online (Sandbox Code Playgroud)
我假设可能有一种方法可以使用XML库来做到这一点,xpathSApply但我想我已经被打败了.
也无法想象如何在不参考示例的情况下对问题进行短语,因此请随意编辑以提供更具描述性的问题.
假设XML数据位于一个名为world.xmlread in in的文件中,并在提取城市name和bname任何相关地标的城市上进行迭代:
library(XML)
doc <- xmlParse("world.xml", useInternalNodes = TRUE)
do.call(rbind, xpathApply(doc, "/world/city", function(node) {
city <- xmlValue(node[["name"]])
xp <- "./buildings/building[./type/text()='landmark']/bname"
landmark <- xpathSApply(node, xp, xmlValue)
if (is.null(landmark)) landmark <- NA
data.frame(city, landmark, stringsAsFactors = FALSE)
}))
Run Code Online (Sandbox Code Playgroud)
结果是:
city landmark
1 London Tower Bridge
2 New York <NA>
3 Paris Eiffel Tower
4 Paris Louvre
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4021 次 |
| 最近记录: |