这个问题类似于之前的问题,Import all fields (and subfields) of XML as dataframe , 但我只想提取 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>
理想情况下,这将进入一个看起来像这样的数据框:
London Tower Bridge
New York NA
Paris Eiffel Tower
Paris Louvre
我认为可能有一种方法可以使用 XML 库和 xpathSApply
来做到这一点,但我认为我被打败了。
也想不出如何在不引用示例的情况下表达问题,因此请随意编辑以提供更具描述性的问题。
最佳答案
假设 XML 数据位于名为 world.xml
的文件中,将其读入并遍历城市,提取城市 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)
}))
结果是:
city landmark
1 London Tower Bridge
2 New York <NA>
3 Paris Eiffel Tower
4 Paris Louvre
关于xml - 当值是多个或缺失时来自 XML 的 R 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349630/