我XML
在 R 中使用包,并希望将 XML 树“展平”为字符串,使用处理程序xmlParse
进行各种转换(例如,转换<code>...</code>
为\code{...}
等)。
我不完全确定这样做的“正确”方法,并且正在寻求指导。
在下面的示例中,我已经想到了一种方法,其中我使用code
标记的处理程序返回string \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
这意味着我应该useInternalNodes=TRUE
在调用xmlTreeParse
.
但是,我也想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 树展平为字符串,将用户定义的转换应用于特定标签(并且我必须能够知道我正在转换的标签的父节点是什么)?
(顺便说一句,我很清楚我目前的方法是“错误”的方式来做这样的事情,但我不确定我应该怎么做。我觉得如果我想做各种转换<code></code>
,\code{}
比如我扁平化我的XML 到一个字符串,那么我应该以某种方式使用 XML 解析树(而不是正则表达式),但这似乎不是正确的方法。一方面,目的xmlTreeParse
并不是真正扁平化和收集节点!)。