Итак, у меня есть большой XML-файл с множеством отчетов. Я создал пример данных ниже, чтобы приблизительно показать размер xml и его структуру:
x <- "<Report><Agreements><AgreementList /></Agreements><CIP><RecordList><Record><Date>2017-05-26T00:00:00</Date><Grade>2</Grade><ReasonsList><Reason><Code>R</Code><Description>local</Description></Reason></ReasonsList><Score>xxx</Score></Record><Record><Date>2017-04-30T00:00:00</Date><Grade>2</Grade><ReasonsList><Reason><Code>R</Code><Description/></Reason></ReasonsList><Score>xyx</Score></Record></RecordList></CIP><Individual><Contact><Email/></Contact><General><FirstName>MM</FirstName></General></Individual><Inquiries><InquiryList><Inquiry><DateOfInquiry>2017-03-19</DateOfInquiry><Reason>cc</Reason></Inquiry><Inquiry><DateOfInquiry>2016-10-14</DateOfInquiry><Reason>er</Reason></Inquiry></InquiryList><Summary><NumberOfInquiries>2</NumberOfInquiries></Summary></Inquiries></Report>"
x <- paste(rep(x, 1.5e+5), collapse = "")
x <- paste0("<R>", x, "</R>")
require(XML)
p <- xmlParse(x)
p <- xmlRoot(p)
p[[1]]
Я хотел бы преобразовать эти данные в data.frame, но структура XML непростая. Ранее, работая с XML, я создал цикл, который для каждого отчета преобразует свои подузлы в data.frame, но здесь (в этих данных) количество подузлов больше 30 (не все они помещены в пример), а структура различается (узлы списка могут встречаться даже на двух уровнях в XML).
Итак, у меня есть несколько вопросов:
1) Я уверен, что цикл отчетов - не лучший способ справиться с этим. Как мне подойти к этой проблеме?
2) Могу ли я как-то извлечь все данные из одного отчета из двух в одну строку data.frame (возможно, рекурсивно)?
3) Или я могу автоматически создавать отдельные data.frames для каждого объекта списка XML?
Любая помощь приветствуется.
Обновлять:
Пример результатов может выглядеть так:
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 17 variables:
$ Record.1.Date : chr "2017-05-26T00:00:00"
$ Record.1.Grade : num 2
$ Record.1.Reason.1.Code : chr "R"
$ Record.1.Reason.1.Description: chr "local"
$ Record.1.Score : chr "xxx"
$ Record.2.Date : chr "2017-05-26T00:00:00"
$ Record.2.Grade : num 2
$ Record.2.Reason.1.Code : chr "R"
$ Record.2.Reason.1.Description: chr "NA"
$ Record.2.Score : chr "xyx"
$ Email.1 : chr "NA"
$ FirstName : chr "MM"
$ Inquiry.1.DateOfInquiry : POSIXct, format: "2017-03-19"
$ Inquiry.1.Reason : chr "cc"
$ Inquiry.2.DateOfInquiry : POSIXct, format: "2016-10-14"
$ Inquiry.2.Reason : chr "er"
$ NumberOfInquiries : num 2
, но, как я упоминал ранее, подсписки также могут быть в отдельных таблицах.
xmlToDataFrame(p)
поможет вам в этом - person Andrew Gustar   schedule 30.05.2017xmlToDataFrame(p)
не работает в этом случае (и во многих других), когда xml имеет сложную структуру. Он объединяет все подузлы - person minem   schedule 30.05.2017xmlToDataFrame
, я получу неструктурированные символьные строки, которые будет нелегко разделить (если даже возможно) - person minem   schedule 30.05.2017