У меня есть папка, содержащая более 1000 файлов с расширением (хотя они не являются настоящими файлами xml).
Я хочу автоматически извлекать определенное содержимое из этих файлов, чтобы конечным результатом была матрица или таблица (которые я могу использовать в дальнейшем в R для анализа или экспортировать в 1 файл csv и т. д.).
Я сделал/изменил код, который работает для одного файла, но не могу заставить его работать автоматически для остальных. По петле?
Итак, мой код для одного файла выглядит следующим образом:
library(xml2)
temp <- read_xml("test.xml")
# get all the <ns2:opendataField>s
recs <- xml_find_all(temp, "//ns2:opendataField")
# extract and clean all the columns
vals <- trimws(xml_text(recs))
#create columns
cols <- xml_attr(xml_find_all(temp, "//ns2:opendataField"), "key")
#create rows
rows <- xml_attr(xml_find_all(temp, "//ns2:opendataField"), "value")
datakvk <- data.frame(cols,rows)
Это приводит к:
> head(datakvk)
cols rows
1 SbiBusinessCode 18129
2 DocumentAdoptionDate 2017-08-22
3 FinancialYear 2016
4 BalanceSheet <NA>
5 BalanceSheetBeforeAfterAppropriationResultsTitle <NA>
6 BalanceSheetBeforeAfterAppropriationResults Na
>
В конце концов, со всеми этими тысячами файлов я надеюсь получить что-то вроде:
cols file 1 file 2
1 SbiBusinessCode 18129 34234
2 DocumentAdoptionDate 2017-08-22 452454
3 FinancialYear 2016 2016
4 BalanceSheet <NA> 2016
5 BalanceSheetBeforeAfterAppropriationResultsTitle <NA> <NA>
6 BalanceSheetBeforeAfterAppropriationResults Na
>
Я пробовал следующий код, но он не работал:
list.files(pattern=".xml$") #
# create a list from these files
list.filenames<-list.files(pattern=".xml$")
# create an empty list that will serve as a container to receive the incoming files
list.data<-list()
# create a loop to read in your data
for (i in 1:length(list.filenames))
{
list.data[[i]]<-read_xml(list.filenames[i])
recs <- xml_find_all(list.data[[i]], "//ns2:opendataField")
vals <- trimws(xml_text(recs))
cols <- xml_attr(xml_find_all(list.data[[i]], "//ns2:opendataField"), "value")
rows <- xml_attr(xml_find_all(list.data[[i]], "//ns2:opendataField"), "key")
}
# add the names of data to the list
names(list.data)<-list.filenames
Что мне не хватает? где я ошибаюсь?
Заранее спасибо за помощь....
Чтобы быть полным: (Один единственный исходный файл (из 1000 выглядит так:)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<opendata xmlns:ns2="http://schemas.kvk.nl/xb/query/service/2016/1/0/0">
<ns2:opendataField key="SbiBusinessCode" value="18129"/>
<ns2:opendataField key="DocumentAdoptionDate" value="2017-08-22"/>
<ns2:opendataField key="FinancialYear" value="2016"/>
<ns2:opendataField key="BalanceSheet">
<ns2:opendataField key="BalanceSheetBeforeAfterAppropriationResultsTitle">
<ns2:opendataField key="BalanceSheetBeforeAfterAppropriationResults" value="Na"/>
</ns2:opendataField>
<ns2:opendataField key="BalanceSheetTitle">
<ns2:opendataField key="Assets" value="61296">
<ns2:opendataField key="AssetsNoncurrent" value="8978">
<ns2:opendataField key="IntangibleAssets" value="8978"/>
</ns2:opendataField>
<ns2:opendataField key="AssetsCurrent" value="52318">
<ns2:opendataField key="Inventories" value="2239"/>
<ns2:opendataField key="Receivables" value="40560"/>
<ns2:opendataField key="CashAndCashEquivalents" value="9519"/>
</ns2:opendataField>
</ns2:opendataField>
<ns2:opendataField key="EquityAndLiabilities" value="61296">
<ns2:opendataField key="Equity" value="201">
<ns2:opendataField key="ShareCapital" value="1"/>
<ns2:opendataField key="ReservesOther" value="200"/>
</ns2:opendataField>
<ns2:opendataField key="LiabilitiesCurrent" value="61095"/>
</ns2:opendataField>
</ns2:opendataField>
</ns2:opendataField>
</opendata>