R和XML:';展平';带处理程序的XML树?
我正在使用R中的R和XML:';展平';带处理程序的XML树?,xml,r,Xml,R,我正在使用R中的XML包,希望将XML树“展平”为字符串,使用xmlParse中的处理程序进行各种转换(例如,将..转换为\code{…}) 我不完全确定这样做的“正确”方式,我正在寻求指导 在下面的示例中,我想到了一种方法,其中我使用code标记的处理程序返回字符串\code{contents},使用p标记的处理程序将所有不同的位粘贴在一起: library(XML) code.xml <- '<p>This is some <code>inline code&l
XML
包,希望将XML树“展平”为字符串,使用xmlParse
中的处理程序进行各种转换(例如,将..
转换为\code{…}
)
我不完全确定这样做的“正确”方式,我正在寻求指导
在下面的示例中,我想到了一种方法,其中我使用code
标记的处理程序返回字符串\code{contents}
,使用p
标记的处理程序将所有不同的位粘贴在一起:
library(XML)
code.xml <- '<p>This is some <code>inline code</code>.</p>'
handlers <- list()
handlers$code <- function (node) {
paste0('\\code{', xmlValue(node), '}')
}
# paste together the bits of text
handlers$p <- function(node) {
bits <- sapply(xmlChildren(node), function (ch) {
if (is.character(ch)) return(ch)
xmlValue(ch)
})
paste(bits, collapse='')
}
xmlRoot(xmlTreeParse(code.xml, asText=T, asTree=T,
handlers=handlers, trim=F,
useInternalNodes=F))
# "This is some \\code{inline code}."
然而,这是不可行的,因为对于某些元素,我希望拥有祖先信息(如父节点),根据xmlParse
,这意味着我应该在调用xmlTreeParse
时使用useInternalNodes=TRUE
但是,我还想在调用中设置asTree=T
,以便从调用中恢复平展字符串,但这会产生一个错误:
xmlTreeParse(code.xml, asText=T, asTree=T,
handlers=handlers, trim=F,
useInternalNodes=T)
# Error in class(ans) = oldClass(class(ans)) :
# attempt to set an attribute on NULL
我很确定这是因为我的处理程序返回的是字符串而不是XMLInternalNodes
,所以内部出现了一些问题(?)
将XML树展平为字符串的另一种方法是什么,将用户定义的转换应用于特定标记(并且我必须能够知道我正在转换的标记的父节点是什么?
(顺便说一句,我很清楚我当前的方法“错误”地做了这样的事情,但不确定我应该怎么做。我觉得如果我想在将XML展平为字符串时进行各种转换,如
到\code{}
,那么我应该以某种方式使用XML解析树(而不是regex),但这似乎不是正确的方法。首先,xmlTreeParse
的目的并不是真正展平和收集节点!)