我在此处(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)
答案 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创建