2

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并不是真正扁平化和收集节点!)。

4

0 回答 0