在数据框中显示已解析的XML

时间:2014-12-05 00:42:35

标签: xml r xpath xml-parsing dataframe

我正在尝试使用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

1 个答案:

答案 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