我正在使用R中的XML
包,并想要将XML树“展平”为字符串,使用xmlParse
中的处理程序进行各种转换(例如,转换{{ 1}}到<code>...</code>
等等。)
我并不完全确定这种“正确”的方式,并且正在寻求指导。
我在下面的示例中考虑了一种方法,我使用\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}."
,这意味着我应该使用{{1我打电话给xmlParse
。
但是,我还想在我的调用中设置useInternalNodes=TRUE
以使我的扁平字符串退出调用,但这会出错:
xmlTreeParse
我很确定这是因为我的处理程序正在返回字符串而不是asTree=T
,因此内部出现了错误(?)。
我可以将XML树扁平化为字符串,将用户定义的转换应用于特定标记的另一种方式(我必须能够知道我正在转换的父节点是什么)? /强>
(顺便说一下,我很清楚我当前的方法是“错误的”做这样的事情,但我不确定我应该做什么。我觉得如果我想要的话当我将XML展平为字符串时,要对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解析树(而不是正则表达式),但这似乎不是正确的方法。首先,<code></code>
的目的并不是要压扁和收集节点!)。