xml - 当值是多个或缺失时来自 XML 的 R 数据框

标签 xml r xpath import dataframe

这个问题类似于之前的问题,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 的文件中,将其读入并遍历城市,提取城市 namebname 任何相关地标:

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/

相关文章:

java - Android Recycler View notifyItemRemoved 动画中断

r - 在函数内访问函数中的变量

r - 如何存储在 r 中创建的随机数据以供进一步使用?

xml - 选择在XSLT中逗号分隔的特定字符串

java - 使用selenium和java获取div的总数

java - Java 如何计算 XML 文档中节点的子节点数?

c# - 将 xml 模式和数据加载到 DataSet(和 datagridview)中

java - WebResource返回xml

python - Snakemake - 在调用外部脚本之前加载集群模块

java - 如何在 webdriver 中使用 $x ("//input[@id=' searchInput']") xpath 因为它给出了完成语句的错误