【问题标题】:Select certain child nodes using xpath使用 xpath 选择某些子节点
【发布时间】:2014-02-19 10:13:34
【问题描述】:

我正在使用 R 函数 xpathSApply 我想在其中选择某些子节点。目前我只能选择一个子节点,例如

xpathSApply(dat, "//Establishment[AddressLine3='Mumbles']/BusinessName",xmlValue)

这给了我一个餐厅列表,其中子节点AddressLine3 = Mumbles。还有另一个我感兴趣的子节点,称为 Rating(完整路径是 //Establishment/Rating)。我想做的是在一个 xPath 查询中带回一对值,BusinessNameRating 子节点。这个可以吗?

【问题讨论】:

标签: xml r xpath


【解决方案1】:

你可以使用“|”将 2 个查询分开。但显然它会返回同一个向量中的值,然后你必须格式化结果。

url <- "http://ratings.food.gov.uk/OpenDataFiles/FHRS568en-GB.xml"
doc <- xmlParse(url)

datas <- xpathSApply(doc, "//EstablishmentDetail[AddressLine3='Mumbles']/BusinessName | //EstablishmentDetail[AddressLine3='Mumbles']/RatingValue", xmlValue)

data.frame(BusinessName = datas[seq(1, 117, by = 2)], RatingValue = datas[-seq(1, 117, by = 2)])

【讨论】:

  • 我也很好奇第二列中的“-seq”是如何工作的。您能否详细说明这是在做什么?
  • datas[-1] 是没有第一个元素的“数据”,datas[-c(1, 2)] 没有第一个和第二个元素的“数据”。 datas[-seq(1, 117, by = 2)] 返回向量“datas”,不包含由seq(1, 117, by = 2) 生成的向量中的值索引的元素。虽然这只是示例,但这并不是最好的方法。
【解决方案2】:

XPath 查询不是 R 特定的,所以 this 建议

query <- "//EstablishmentDetail[AddressLine3='Mumbles']/
              *[self::BusinessName or self::RatingValue]"

这可以被当作

library(XML)
xml <- xmlParse("http://ratings.food.gov.uk/OpenDataFiles/FHRS568en-GB.xml")
as.data.frame(split(vapply(xml[query], xmlValue, character(1)), 1:2))

但也许写起来更清楚

query <- "//EstablishmentDetail[AddressLine3='Mumbles']"
xmlToDataFrame(xml[query])[, c("BusinessName", "RatingValue")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多