В качестве примера, я следующий код XMLПолучение всех дочерних узлов файла XML в data.frame или data.table
tt = '<Nummeraanduiding>
<identificatie>0010200000114849</identificatie>
<aanduidingRecordInactief>N</aanduidingRecordInactief>
<aanduidingRecordCorrectie>0</aanduidingRecordCorrectie>
<huisnummer>13</huisnummer>
<officieel>N</officieel>
<postcode>9904PC</postcode>
<tijdvakgeldigheid>
<begindatumTijdvakGeldigheid>2010051100000000</begindatumTijdvakGeldigheid>
</tijdvakgeldigheid>
<inOnderzoek>N</inOnderzoek>
<typeAdresseerbaarObject>Verblijfsobject</typeAdresseerbaarObject>
<bron>
<documentdatum>20100511</documentdatum>
<documentnummer>2010/NR002F</documentnummer>
</bron>
<nummeraanduidingStatus>Naamgeving uitgegeven</nummeraanduidingStatus>
<gerelateerdeOpenbareRuimte>
<identificatie>0010300000000444</identificatie>
</gerelateerdeOpenbareRuimte>
</Nummeraanduiding> '
Цель состоит в том, чтобы преобразовать этот узел (Nummeraanduiding) к data.table (или data.frame также отлично). Одна из проблем заключается в том, что у меня есть много этих Nummeraanduiding узлов (миллионы из них).
Следующий код способен обрабатывать данные:
library(XML)
# This parses the doc...
doc = xmlParse(tt)
# Solution (1) - this is the most obvious solution..
XML::xmlToDataFrame(doc)
# Solution (2) - apparently converting to a list is also possible..
unlist(xmlToList(doc))
# Solution (3) - My own solution
data.frame(as.list(unlist(xmlToList(doc))))
Не все решения получения желаемого результата ... В конце концов, только вариант решения (3) удовлетворяет мои потребности.
- Он находится в data.frame/data.table формате
- Он содержит все дочерний РЕБЕНОК-узлы и имеет различные имена для каждого столбца
- Это не «слияние» информация о ребенке -child-nodes
Тем не менее, запуск этой части кода для всех моих данных становится довольно медленным. Потребовалось 8 часов, чтобы завершить его для файла, содержащего 2290000 раз «узел Nummeraanduiding».
Вы, ребята, знаете какой-либо способ ускорить этот процесс? Может ли мой метод быть улучшен? Возможно, я пропустил какую-то полезную функцию?
Вы можете сделать это с помощью xml2, например. 'library (xml2); tt%>% read_xml()%>% xml_children()%>% {setNames (xml_text (.), xml_name (.))}%>% t()%>% data.frame() ', хотя я бы на самом деле, вероятно, оставляют 't()%>% data.frame' и просто' rbind' векторы в матрицу, которая может быть преобразована в data.frame. Если вы хотите разобрать весь элемент по элементу, 'purrr' может быть очень полезным. – alistaire