问题 在R XML Package中,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 通过$ doc $ children $ ...遍历获取非重复节点的函数。但我不确定每种方法最好的时候都能理解。解析XML是几乎放弃R并学习Python的原因之一。在没有被迫购买书籍的情况下缺乏傻瓜的例子。


10017
2017-12-19 14:40


起源



答案:


我不是XML专家,所以这个答案是基于我自己的XML包经验。

  • xmlParse 是一个版本 xmlTreeParse 哪个参数 useInternalNodes 设置为TRUE。
  • 如果你想使用R对象 xmlTreeParse。如果您只想提取xml文档的部分部分,这可能不是非常有效和不必要的。
  • 如果你不想得到一个R对象,只需要一个c指针,就可以了 xmlParse。但你应该知道一些 xpath 操纵结果的基础。
  • 使用 asText=TRUE 如果您有文本而不是文件或网址作为输入。

这里有一个例子,我展示了两个函数之间的区别:

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 请求和其中一个功能( xpathApplyxpathSApply ,getNodeSet)检查它。例如:

xpathApply(res,'//el')

创建有效的Xml节点后,即可申请 xmlValuexmlGetAttr,..提取节点信息。所以这两个陈述是等价的:

## 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)    

12
2017-12-19 15:55