我正在尝试使用Duncan Temple Lang的XML包来解析R中的XML。该函数的目的是解析给它的任何XML数据并在data.frame中产生输出,如下面所需的输出所示。 getValues函数用于生成属性名称列表及其关联值,然后在调用时将其传递到数据框中。但它不起作用,因为并非所有属性名称和值都出现在数据框中。请参阅下面的示例XML和我目前得到的输出。
library(XML)
getValues <- function(x) {
aList <- list()
#attributes
if(!is.null(xmlAttrs(x))) {
num.attributes = xmlSize(xmlAttrs(x))
for (i in seq_len(num.attributes)) {
attributeName <- names(xmlAttrs(x)[i])
attributeValue <- xmlAttrs(x)[[i]]
aList <- append(aList, c(Name = attributeName, Text = attributeValue))
}
}
return(aList)
}
retrieveStructureInfo <- function(node) {
if (is.null(node)) {
return()
}
nkids <- xmlSize(node)
bypass <- function(n = nkids) {
if(nkids == 0) {
xpathApply(xmlParent(node), path = xpath, fun = getValues)
} else {
return(nkids)
}
}
#children is the no. of nodes within a node
for (i in 1 : children) {
#recursive function call
retrieveStructureInfo(node[[i]])
}
}
#parse xml document
#xmlfile is the file path
doc <- xmlParse(xmlfile)
r <- xmlRoot(doc)
data <- data.frame(node = NA, value = NA)
retrieveStructureInfo(r)
data
示例XML:
<CATALOG>
<PLANT>
<COMMON Source="a" Available="false">Bloodroot</COMMON>
<LOCATION></LOCATION>
<PARENT />
</PLANT>
<PLANT>
<COMMON Source="b" Available="true">Columbine</COMMON>
<LOCATION>Africa</LOCATION>
<PARENT />
</PLANT>
</CATALOG>
输出:
node value
source a
source b
期望的输出:
node value
source a
available false
source b
available true
答案 0 :(得分:0)
我昨天尝试回答这个问题,并指出所需输出中的所有内容都已存在于xmlToList输出中。您甚至可以解析下面的路径列以获取父列表,类型列和其他列。
x <- xmlParse( your sample XML with <root> tags added)
y <- xmlToList(x)
z <- unlist(y)
data.frame(path=names(z), value=z)
path value
1 CATALOG.PLANT.COMMON.text Bloodroot
2 CATALOG.PLANT.COMMON..attrs.Source a
3 CATALOG.PLANT.COMMON..attrs.Available false
4 CATALOG.PLANT.COMMON.text Columbine
5 CATALOG.PLANT.COMMON..attrs.Source b
6 CATALOG.PLANT.COMMON..attrs.Available true