В R XML-пакете, в чем разница между xmlParse и xmlTreeParse?

Когда я хочу использовать функцию xmlParse по сравнению с функцией xmlTreeParse? Кроме того, когда значения параметра useInternalNodes=TRUE или asText=TRUE полезны?

Например:

library("XML")
nct_url <- "http://clinicaltrials.gov/ct2/show/NCT00112281?resultsxml=true"
xml_doc <- xmlParse(nct_url, useInternalNodes=TRUE)

против.

doc <- xmlTreeParse(getURL(nct_url), useInternalNodes=TRUE)
top <- xmlRoot(doc)
top[["keyword"]]
xmlValue(top[["start_date"]])
xmlValue(top[["location"]])

Люди, похоже, используют функцию xmlTreeParse для получения не повторяющегося node через $doc $children $... traversal. Но я не уверен, что понимаю, когда каждый подход лучше. Анализ XML является одной из причин почти отказаться от R и изучить Python. Отсутствие примеров для манекенов без принуждения к покупке книги.

Ответ 1

Здесь некоторые отзывы после использования пакета XML.

  • xmlParse - это версия xmlTreeParse которой аргумент useInternalNodes имеет значение TRUE.
  • Если вы хотите получить объект R, используйте xmlTreeParse. Это может быть не очень эффективным и ненужным, если вы хотите просто извлечь частичную часть XML-документа.
  • Если вы не хотите получать объект R, просто указатель переменного тока, используйте xmlParse. Но вы должны знать некоторые основы xpath чтобы манипулировать результатом.
  • Используйте asText=TRUE если у вас есть текст, а не файл или URL в качестве ввода.

Вот пример, где я показываю разницу между двумя функциями:

txt <- "<doc>
          <el> aa </el>
       </doc>"
library(XML)
res <- xmlParse(txt,asText=TRUE)
res.tree <- xmlTreeParse(txt,asText=TRUE)

Сейчас осматриваем 2 объекта:

class(res)
[1] "XMLInternalDocument" "XMLAbstractDocument"
> class(res.tree)
[1] "XMLDocument"         "XMLAbstractDocument"

Вы видите, что res является внутренним документом. Это указатель на объект C. res.tree является объектом R Вы можете получить его атрибуты так:

 res.tree$doc$children
$doc
<doc>
 <el>aa</el>
</doc>

Для res вы должны использовать действительный запрос xpath и одну из этих функций (xpathApply, xpathSApply, getNodeSet) для его проверки. например:

xpathApply(res,'//el')

После создания действительного узла xmlValue вы можете применить xmlValue, xmlGetAttr,.. для извлечения информации об узле. Итак, вот эти 2 утверждения эквивалентны:

## we have already an R object, just apply xmlValue to the right child
xmlValue(res.tree$doc$children$doc)
## xpathSApply create an R object and pass it to
xpathSApply(res,'//el',xmlValue)