缺少值时将 XML 转换为数据框
Converting XML to dataframe when values are missing
我在这里 post 阅读了类似的问题(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 还是不同的类型?
Second,我已经尝试了所有 post 和 none 适用于这种 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)
要解析 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
我在这里 post 阅读了类似的问题(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 还是不同的类型?
Second,我已经尝试了所有 post 和 none 适用于这种 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)
要解析 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