R Скрипт для объединения нескольких XML файлов - PullRequest
0 голосов
/ 30 марта 2020

Я создал этот 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...