簡體   English   中英

在 R 中將 XML 轉換為數據框

[英]Convert XML to Data Frame in R

您好我正在嘗試將以下 XML 代碼轉換為 R 中的數據框。但是我不能,因為每條記錄都缺少值。

RecordID 23063 包含以下數據:ActivityCreatedDate、ExpectedInstallDate、InvoiceTxnDate。 但是,以下一些節點並不具備所有這些元素。 RecordID 23321 缺少 InvoiceTxnDate 等。

<?xml version="1.0" encoding="windows-1252" ?>
  <Record>
    <RecordID>23063</RecordID>
    <ActivityCreatedDate>2018-12-11T19:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2018-12-19T19:00:00</ExpectedInstallDate>
    <InvoiceTxnDate>2018-12-13T19:00:00</InvoiceTxnDate>
  </Record>
  <Record>
    <RecordID>23321</RecordID>
    <ActivityCreatedDate>2018-10-15T18:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2018-11-14T19:00:00</ExpectedInstallDate>
  </Record>
  <Record>
    <RecordID>23566</RecordID>
    <ActivityCreatedDate>2019-01-23T19:00:00</ActivityCreatedDate>
  </Record>
  <Record>
    <RecordID>23217</RecordID>
    <ActivityCreatedDate>2018-12-20T19:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2019-01-23T19:00:00</ExpectedInstallDate>
    <InvoiceTxnDate>2019-01-18T19:00:00</InvoiceTxnDate>
  </Record>
  <Record>
    <RecordID>23325</RecordID>
    <ActivityCreatedDate>2018-05-25T18:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2019-01-23T19:00:00</ExpectedInstallDate>
  </Record>
</end of file>

目前我正在使用 xml2。 我正在使用 read_xml 將其讀取到變量中,然后使用 xml_find_all 和 trimws 將列存儲到列表中。 然后我嘗試將我的列表轉換為數據框,但由於維度關閉而失敗。

我想知道如何將上述 XML 轉換為如下所示的數據框:

RecordID    ActivityCreatedDate ExpectedInstallDate InvoiceTxnDate
1   23063   2018-12-11T19:00:00 2018-12-19T19:00:00 2018-12-13T19:00:00
2   23321   2018-10-15T18:00:00 2018-11-14T19:00:00 NA
3   23566   2019-01-23T19:00:00 NA                  NA
4   23217   2018-12-20T19:00:00 2019-01-23T19:00:00 2019-01-18T19:00:00
5   23325   2018-05-25T18:00:00 2019-01-23T19:00:00 NA

在這種情況下,有沒有辦法遍歷每個 RecordID 並添加一個

<InvoiceTxnDate>NA</InvoiceTxnDate> or a <ExpectedInstallDate>NA</ExpectedInstallDate>

到節點,如果它丟失? 我會更樂意分享我擁有的所有統一數據的 R 代碼。 另外,如果這個問題沒有意義,請告訴我,我會更多地解釋自己。

您是否嘗試過使用XML包?

XML::xmlToDataFrame('path to xml file')


> XML::xmlToDataFrame('~/R/test.xml')
  RecordID ActivityCreatedDate ExpectedInstallDate      InvoiceTxnDate
1    23063 2018-12-11T19:00:00 2018-12-19T19:00:00 2018-12-13T19:00:00
2    23321 2018-10-15T18:00:00 2018-11-14T19:00:00                <NA>
3    23566 2019-01-23T19:00:00                <NA>                <NA>
4    23217 2018-12-20T19:00:00 2019-01-23T19:00:00 2019-01-18T19:00:00
5    23325 2018-05-25T18:00:00 2019-01-23T19:00:00                <NA>

在 XML 完全如上所示的情況下,沒有根節點。 您可以執行以下操作:

library(xml2)
library(rvest)
library(tidyverse)

## METHOD 1
## add missing root node
read_html('~/R/test.xml') %>% html_children() %>% 
  as_xml_document(root = 'doc') %>% xml_contents() %>% xml_contents() %>% 
  map_df(., function(x) {
    kids <- xml_children(x)
    setNames(as.list(type.convert(xml_text(kids))), xml_name(kids))
  })

## METHOD 2
## treating the xml as a list
read_html('~/R/test.xml') %>% 
  html_nodes('record') %>% 
  as_list() %>% 
  lapply(., function(x) unlist(x, recursive = F) %>% bind_cols()) %>% 
  bind_rows()


## both of the above methods will return the following tibble
# A tibble: 5 x 4
  recordid activitycreateddate expectedinstalldate invoicetxndate     
  <chr>    <chr>               <chr>               <chr>              
1 23063    2018-12-11T19:00:00 2018-12-19T19:00:00 2018-12-13T19:00:00
2 23321    2018-10-15T18:00:00 2018-11-14T19:00:00 NA                 
3 23566    2019-01-23T19:00:00 NA                  NA                 
4 23217    2018-12-20T19:00:00 2019-01-23T19:00:00 2019-01-18T19:00:00
5 23325    2018-05-25T18:00:00 2019-01-23T19:00:00 NA  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM