Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R和XML:';展平';带处理程序的XML树?_Xml_R - Fatal编程技术网

R和XML:';展平';带处理程序的XML树?

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

我正在使用R中的
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
的目的并不是真正展平和收集节点!)