缺少值时将XML转换为数据框

时间:2018-11-04 04:44:40

标签: r xml dataframe missing-data

我在此处(R dataframe from XML when values are multiple or missing )上阅读了类似的问题,但是XML文件的格式与我的格式不同。我的XML是这样的:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <row 
     Id="-1" 
     Body="Hello! I am a programmer!" 
     OwnerUserId="11111" 
  />
<\users>

首先,这是正确的XML还是其他类型?

第二,我已经尝试了该帖子中的所有答案,但没有一种适用于该XML格式。

第三,在这种情况下,如果某些行没有OwnerUserId,那么如何有效地解析这些行?

我已经编写了以下代码来做到这一点,我想知道是否有一种高效,快捷的方法来代替逐行读取?

    posts <- xmlParse('path_to_file.xml')
    xml_posts <- xmlToList(posts)

    df_posts <- as.data.frame(matrix(ncol = 3))
    df_posts <- df_posts[-1,]
    colnames(df_posts) <- c(
        "Id"
      , "Text"
      , "User_ID"
                     )

    for(i in 1:length(xml_posts)){
        user_id <- 'none'
        xml_unlisted <- unlist(xml_posts[i])
        name <- names(xml_unlisted)

        if (length(xml_unlisted[name == "row.OwnerUserId"]) != 0){
            user_id <- xml_unlisted[name == "row.OwnerUserId"] 
        }

        df_temp <-  data.frame(list(
           xml_unlisted[name == "row.Id"]
          ,xml_unlisted[name == "row.Body"]
          ,user_id
            ))

        colnames(df_temp) <- c(
            "Id"
          , "Text"
          , "User_ID"
          )


        df_posts <- rbind(df_posts, df_temp)
    }

    head(df_posts)

1 个答案:

答案 0 :(得分:1)

要解析xml,我现在将使用xml2。假设您的xml是供多个用户使用的这种形式,那么我会这样做,如果属性是xml中存在的节点,那么我将获得NA

xml_string <- '<?xml version="1.0" encoding="utf-8"?>
<users>
  <row 
     Id="1" 
     Body="Hello! I am a programmer!" 
     OwnerUserId="11111" 
  />
  <row 
     Id="2" 
     Body="Hello! I am a teacher!" 
  />
</users>'
library(xml2)
# for the pipe
library(magrittr)
# get the row nodes
xml <- read_xml(xml_string) %>% xml_find_all("row")
data.frame(
  Id = xml %>% xml_attr("Id"),
  Text = xml %>% xml_attr("Body"),
  User_ID = xml %>% xml_attr("OwnerUserId")
)
#>   Id                      Text User_ID
#> 1  1 Hello! I am a programmer!   11111
#> 2  2    Hello! I am a teacher!    <NA>

reprex package(v0.2.1)于2018-11-04创建