Я создал этот R-скрипт для извлечения атрибутов из нескольких xml файлов. Каждый файл xml относится к исследовательской группе. Не все исследовательские группы имеют упомянутые переменные (например, есть группы, которые связаны только с одной компанией, двумя компаниями или ни одной). Код, как и сегодня, возвращается с ошибкой, если у xml нет семи компаний, связанных с группой. Как не дать другим результатам быть нулевыми (группы с одной, двумя, тремя ... n связанными компаниями)?
library (XML)
library(methods)
library(dplyr)
library(xml2)
process_xml <- function(xml_path) {
pg <- read_xml(xml_path)
#create the rootnode variable for files
xmldata <- xmlParse(xml_path)
rootnode <- xmlRoot(xmldata)
#research group id
idgr <- xmlGetAttr(rootnode, "NRO-ID-GRUPO")
#university's attributes
sint <- xmlGetAttr(rootnode[[1]], "SIGLA-DA-INSTITUICAO")
nint <- xmlGetAttr(rootnode[[1]], "NOME-DA-INSTITUICAO")
apre <- xmlGetAttr(rootnode[[1]], "AREA-PREDOMINANTE")
#company's attributes
rsoc1 <- xmlGetAttr(rootnode[[7]][[1]], "RAZAO-SOCIAL-DA-EMPRESA")
cnpj1 <- xmlGetAttr(rootnode[[7]][[1]], "CNPJ")
njur1 <- xmlGetAttr(rootnode[[7]][[1]], "NATUREZA-JURIDICA")
semp1 <- xmlGetAttr(rootnode[[7]][[1]], "SIGLA-DA-EMPRESA")
nemp1 <- xmlGetAttr(rootnode[[7]][[1]], "NOME-DA-EMPRESA")
rsoc2 <- xmlGetAttr(rootnode[[7]][[2]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj2 <- xmlGetAttr(rootnode[[7]][[2]], "CNPJ", default = NULL)
njur2 <- xmlGetAttr(rootnode[[7]][[2]], "NATUREZA-JURIDICA", default = NULL)
semp2 <- xmlGetAttr(rootnode[[7]][[2]], "SIGLA-DA-EMPRESA", default = NULL)
nemp2 <- xmlGetAttr(rootnode[[7]][[2]], "NOME-DA-EMPRESA", default = NULL)
rsoc3 <- xmlGetAttr(rootnode[[7]][[3]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj3 <- xmlGetAttr(rootnode[[7]][[3]], "CNPJ", default = NULL)
njur3 <- xmlGetAttr(rootnode[[7]][[3]], "NATUREZA-JURIDICA", default = NULL)
semp3 <- xmlGetAttr(rootnode[[7]][[3]], "SIGLA-DA-EMPRESA", default = NULL)
nemp3 <- xmlGetAttr(rootnode[[7]][[3]], "NOME-DA-EMPRESA", default = NULL)
rsoc4 <- xmlGetAttr(rootnode[[7]][[4]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj4 <- xmlGetAttr(rootnode[[7]][[4]], "CNPJ", default = NULL)
njur4 <- xmlGetAttr(rootnode[[7]][[4]], "NATUREZA-JURIDICA", default = NULL)
semp4 <- xmlGetAttr(rootnode[[7]][[4]], "SIGLA-DA-EMPRESA", default = NULL)
nemp4 <- xmlGetAttr(rootnode[[7]][[4]], "NOME-DA-EMPRESA", default = NULL)
rsoc5 <- xmlGetAttr(rootnode[[7]][[5]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj5 <- xmlGetAttr(rootnode[[7]][[5]], "CNPJ", default = NULL)
njur5 <- xmlGetAttr(rootnode[[7]][[5]], "NATUREZA-JURIDICA", default = NULL)
semp5 <- xmlGetAttr(rootnode[[7]][[5]], "SIGLA-DA-EMPRESA", default = NULL)
nemp5 <- xmlGetAttr(rootnode[[7]][[5]], "NOME-DA-EMPRESA", default = NULL)
rsoc6 <- xmlGetAttr(rootnode[[7]][[6]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj6 <- xmlGetAttr(rootnode[[7]][[6]], "CNPJ", default = NULL)
njur6 <- xmlGetAttr(rootnode[[7]][[6]], "NATUREZA-JURIDICA", default = NULL)
semp6 <- xmlGetAttr(rootnode[[7]][[6]], "SIGLA-DA-EMPRESA", default = NULL)
nemp6 <- xmlGetAttr(rootnode[[7]][[6]], "NOME-DA-EMPRESA", default = NULL)
rsoc7 <- xmlGetAttr(rootnode[[7]][[7]], "RAZAO-SOCIAL-DA-EMPRESA", default = NULL)
cnpj7 <- xmlGetAttr(rootnode[[7]][[7]], "CNPJ", default = NULL)
njur7 <- xmlGetAttr(rootnode[[7]][[7]], "NATUREZA-JURIDICA", default = NULL)
semp7 <- xmlGetAttr(rootnode[[7]][[7]], "SIGLA-DA-EMPRESA", default = NULL)
nemp7 <- xmlGetAttr(rootnode[[7]][[7]], "NOME-DA-EMPRESA", default = NULL))
xmlframe <- data.frame(idgr=idgr, sint=sint, nint=nint, apre=apre, rsoc1=rsoc1,rsoc2,rsoc3,rsoc4,rsoc5,rsoc6,rsoc7, cnpj1=cnpj1,cnpj2,cnpj3,cnpj4,cnpj5,cnpj6,cnpj7, njur1=njur1,njur2,njur2,njur3,nju4,njur5,njur6,njur7, semp1=semp1,semp2,semp3,semp4,semp5,semp6,semp7, nemp1=nemp1,nemp2,nemp3,nemp4,nemp5,nemp6,nemp7)
}
# GET XML FILE PATH NAMES (RECURSIVE FOR SUBDIRECTORIES)
files <- list.files()
print(files)
# LIST OF DATAFRAMES (TRYCATCH IN CASE OF PARSING ERRORS TO RETURN NULL)
df_list <- lapply(files, function(x)
tryCatch(process_xml(x), error=function(e) NULL))
# REMOVE NULL ELEMENTS (I.E., ERRORS ABOVE)
df_list <- Filter(NROW, df_list)
# APPEND ALL DATAFRAMES
master_xml_df <- do.call(rbind, df_list)
# MERGE WITH ORIGINAL DATA
final_df <- merge(original_data, master_xml_df, by="Title")
#EXPORT AS XLS
write.table(master_xml_df, file = "Teste.xls", sep = "\t",
row.names = TRUE, col.names = NA)