xml
  • r
  • xpath
  • 2014-02-19 9 views 2 likes 
    2

    Я использую функцию R xpathSApply, где я хочу выбрать определенные дочерние узлы. На данный момент я могу выбрать только один дочерний узел, например.Выберите определенные дочерние узлы с помощью xpath

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

    , где это дает мне список, где Рестораны дочерний узел AddressLine3 = Mumbles. Существует еще один дочерний узел, которого интересует названный рейтинг (полный путь: //Establishment/Rating). То, что я хотел бы сделать, это вернуть пару значений, дочерние узлы BusinessName и Rating в одном запросе xPath. Это можно сделать?

    +0

    Вы можете использовать concat? –

    +1

    Можете ли вы поделиться образцом xml. Должно быть очень легко, и я могу получить xpath. – Vinay

    +0

    здесь http://ratings.food.gov.uk/OpenDataFiles/FHRS568en-GB.xml – user3310867

    ответ

    1

    вас может использовать "|" для разделения двух запросов. Но, очевидно, он вернет значения в один и тот же вектор, тогда вы должны сформировать результат.

    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)]) 
    
    +0

    спасибо Жюльен - это то, что я искал. – user3310867

    +0

    также мне любопытно, как «-seq» работает во второй колонке. Не могли бы вы рассказать о том, что это делает? – user3310867

    +0

    'datas [-1]' is "datas" без его первого элемента, 'datas [-c (1, 2)]' 'datas" без 1-го и 2-го элементов. 'datas [-seq (1, 117, by = 2)]' возвращает векторные «данные» без элементов, индексированных значениями в векторе, создаваемыми 'seq (1, 117, by = 2)'. Хотя это было только для примера, это не лучший способ сделать это. –

    1

    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")] 
    
    Смежные вопросы