ошибка рабочего каталога при чтении нескольких xml файлов в R и объединении данных - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь проанализировать / прочитать несколько файлов xml из моих текущих данных и попытаться объединить их вместе.

current type of XMLResponse is character

И мой Пример файла xml выглядит следующим образом:

<ApplicationResponse>
    <Service Name="AlternativeCreditAttributes">
      <Categories>
        <Category Name="Default">
          <Attributes>
            <Attribute Name="ACA_ACH_NSF_12M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_18M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_24M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_3M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_6M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_9M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_AMT_12M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_18M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_24M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_3M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_6M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_9M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_EVER" Value="600" />
            <Attribute Name="ACA_ACH_NSF_EVER" Value="2" />
            <Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_NEWEST" Value="41" />
            <Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_OLDEST" Value="41" />
          </Attributes>
        </Category>
      </Categories>
    </Service>
</ApplicationResponse>

Я успешно извлек один файл на основе следующего кода:

doc<-read_xml(Data$XMLResponse[1])
  # setNames(data.frame(
    cols<- xml_attr(xml_find_all(doc, "//Attribute"), "Name")
    rows<- xml_attr(xml_find_all(doc, "//Attribute"), "Value")
  # ),
out  <- data.frame(rows, row.names = cols)
out

Но когда я пытался использовать lapply чтобы получить несколько файлов на основе этого ответа , я обнаружил ошибку в рабочем каталоге.

Ошибка: 'NA' не существует в текущем рабочем каталоге

Ниже приведен код, который я использую. Пожалуйста, дайте мне знать, если вам известна проблема или вам нужны какие-либо подробности по этой проблеме. Заранее спасибо.

df_list <- lapply(Data$XMLResponse, function(f) {
  doc <- read_xml(f)
  setNames(data.frame(
    xml_attr(xml_find_all(doc, "//Attribute"), "Name"),
    xml_attr(xml_find_all(doc, "//Attribute"), "Value")
  ),c("Name", f))
})

1 Ответ

0 голосов
/ 17 января 2020

Вот подход, использующий for() l oop для сбора всех значений из каждого файла xml, который вы сохранили в Data $ XMLResponse. Код предполагает, что каждый xml файл имеет одинаковую длину «Атрибутов» в том же порядке.

library(xml2)    
#create a blank list
datalist = list()
#loop through your column of xml responses to extract the values you want.
for(i in 1:length(Data$XMLResponse)){
temp_vals<-read_xml(Data$XMLResponse[i])
temp_vals<-xml_attr(xml_find_all(temp_vals, "//Attribute"), "Value")
#assign these values to your data list
datalist[[i]]<-temp_vals
}

#bind the data from the xml files together
your_data = do.call(rbind, datalist)

Затем получите имена столбцов:

your_column_names<-xml_attr(xml_find_all(Data$XMLResponse[1], "//Attribute"), "Name")
doc<-setNames(data.frame(matrix(ncol = length(your_column_names), nrow = 0)), your_column_names)

И затем используйте rbind() связать ваши данные с именами столбцов

rbind(doc,your_data)
...