我有一个数据表,其中的一列包含xml格式的字符串,例如:
str = '<root>
<MatchData id="1234" >
<PA>
<Name val="John, Joseph, Smith" />
<Address value="123 Smith St City" />
<Gender value="M" />
</PA>
</MatchData>
<MatchData id="1235">
<PA>
<Name val="Sarah, Amy, Jones" />
<Address value="123 Jones St City" />
<Gender value="F" />
</PA>
</MatchData>
</root>'
对于数据表中的每一行,我需要将值提取到新的数据表中,并将它们绑定在一起。目前,我可以使用如下所示的for循环执行此操作,在该循环中,将确切的节点提取到数据表的一行中,然后追加到完整的集合中:
library(data.table)
library(xml2)
library(purrr)
Data <- data.table(String = str)
All <- data.table(ID = '', Name = '', Address = '', Gender = '')
for (i in 1:nrow(Data)){
tryCatch( { temp <- xml_find_all(read_xml(Data$String[i]), ".//MatchData") %>%
map_df(function(x) {
list(
ID=xml_attr(x, "id"),
Name=xml_find_first(x, ".//Name") %>% xml_attr("val"),
Address=xml_find_first(x, ".//Address") %>% xml_attr("value"),
Gender=xml_find_first(x, ".//Gender") %>% xml_attr("value")
)
}) %>% as.data.table()
}, silent = TRUE
, error = function(e) {})
All <- rbind(All,temp)
}
可以在功能内完成此操作以加快处理速度吗?我已经尝试过,但是输出数据表不是很正确:
parseXMLStructure <- function(y){
return <- xml_find_all(read_xml(y), ".//MatchData") %>%
map_df(function(x) {
list(
ID=xml_attr(x, "id"),
Name=xml_find_first(x, ".//Name") %>% xml_attr("val"),
Address=xml_find_first(x, ".//Address") %>% xml_attr("value"),
Gender=xml_find_first(x, ".//Gender") %>% xml_attr("value")
)
}) %>% as.data.table()
}
x <- mapply(parseXMLStructure,Data$String)