У меня есть таблица данных со столбцом, содержащим строки в формате 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)