通过R从XML提取数据元素

时间:2019-04-24 21:22:02

标签: r xml xml2

我通常将此数据提取到一个csv文件中。这次我不能这样做,因为注释列中的文本太长,如果导出到csv会被截断。如果我导出到xml,那么我可以得到整个文本。但是我在努力处理xml输出。

我正在RStudio中使用xml2。我尝试了xml_children(notes)和其他一些事情,例如as_list(xml_children(notes))

XML看起来像这样:

<RESULTS>
    <ROW>
        <COLUMN NAME="SUBJECT_ID"><![CDATA[12345678]]></COLUMN>
        <COLUMN NAME="PAT_ID"><![CDATA[12345678]]></COLUMN>
        <COLUMN NAME="PAT_MRN_ID"><![CDATA[12345678]]></COLUMN>
        <COLUMN NAME="PAT_ENC_CSN_ID"><![CDATA[222111333]]></COLUMN>
        <COLUMN NAME="CREATE_INSTANT_DTTM"><![CDATA[18-JUL-01]]></COLUMN>
        <COLUMN NAME="NAME"><![CDATA[Progress Notes]]></COLUMN>
        <COLUMN NAME="NOTE_ID"><![CDATA[123456]]></COLUMN>
        <COLUMN NAME="LINE"><![CDATA[1]]></COLUMN>
        <COLUMN NAME="NOTE_TEXT"><![CDATA[ text text text]]></COLUMN>
    </ROW>

我想要一个看起来像的数据框 notes $ SUBJECT_ID, notes $ PAT_ID ... notes $ NOTE_TEXT

但是如何?

1 个答案:

答案 0 :(得分:0)

我已自由调整您的示例。每列的条目数相等。

library(xml2)
library(tidyverse)

string <- "
    <ROW>
        <COLUMN NAME=\"SUBJECT_ID\"><![CDATA[12 345 678]]></COLUMN>
        <COLUMN NAME=\"PAT_ID\"><![CDATA[123 456 78]]></COLUMN>
        <COLUMN NAME=\"PAT_MRN_ID\"><![CDATA[12 345 678]]></COLUMN>
        <COLUMN NAME=\"PAT_ENC_CSN_ID\"><![CDATA[222 1113 33]]></COLUMN>
        <COLUMN NAME=\"CREATE_INSTANT_DTTM\"><![CDATA[18-JUL-01 19-JUL-02 19-JUL-02]]></COLUMN>
        <COLUMN NAME=\"NAME\"><![CDATA[Progress Notes NN]]></COLUMN>
        <COLUMN NAME=\"NOTE_ID\"><![CDATA[12 345 6]]></COLUMN>
        <COLUMN NAME=\"LINE\"><![CDATA[1 1 2]]></COLUMN>
        <COLUMN NAME=\"NOTE_TEXT\"><![CDATA[text text text]]></COLUMN>
    </ROW>"


xml <- read_xml(string)
xml %>% 
  xml_contents() %>% 
  xml_text() %>% 
  map_dfc(~ unlist(str_split(.x, " "))) %>%
  magrittr::set_colnames(
    xml %>% 
      xml_contents() %>% 
      xml_attrs() %>%
      flatten_chr()
  )

# A tibble: 3 x 9
  SUBJECT_ID PAT_ID PAT_MRN_ID PAT_ENC_CSN_ID CREATE_INSTANT_DTTM NAME     NOTE_ID LINE  NOTE_TEXT
  <chr>      <chr>  <chr>      <chr>          <chr>               <chr>    <chr>   <chr> <chr>    
1 12         123    12         222            18-JUL-01           Progress 12      1     text     
2 345        456    345        1113           19-JUL-02           Notes    345     1     text     
3 678        78     678        33             19-JUL-02           NN       6       2     text