我有一个XML文件,想从中提取数据。到目前为止,我已经使用tidyverse和xml2软件包完成了所有操作,但我无法解决XML问题中的下一步难题。
样例XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:ArchiveView>
<Notification ID="1001">
<persons>
<Timestamp>07:39:25</Timestamp>
<person type="A" name="Barney">
<uniqueUserId>2222</uniqueUserId>
</person>
</persons>
<persons>
<Timestamp>08:40:25</Timestamp>
<person type="B" name="John">
<uniqueUserId>1111</uniqueUserId>
</person>
</persons>
</Notification>
<Notification ID="1002">
<persons>
<Timestamp>14:39:25</Timestamp>
<person type="A" name="Barney">
<uniqueUserId>2222</uniqueUserId>
</person>
</persons>
</Notification>
<Notification ID="1003">
</Notification>
</ns2:ArchiveView>
由于可以分配给通知的最大人数为3人,因此我希望最终得到一个类似于以下数据框的结果:
ID name1 time1 type1 name2 time2 type2 name3 time3 type3
1001 Barney 07:39:25 A John 08:40:25 B NA NA NA
1002 Barney 14:39:25 A NA NA NA NA NA NA
1003 NA NA NA NA NA NA NA NA NA
我已经得到的内容如下:
doc <- read_xml( "./data/test.xml" )
提取所有ID
df.ID <- data.frame(
ID = xml_find_all( doc, ".//Notifications" ) %>% xml_attrs() %>% unlist() ,
stringsAsFactors = FALSE )
识别具有附加人员的通知的ID
ID.with.persons <- xml_find_all( doc, ".//Notifications[ persons ]" ) %>%
xml_attrs() %>%
unlist()
创建一个包含人员附加信息的通知节点集。
nodes.persons <- xml_find_all( doc, ".//Notifications[ persons ]"
我还成功地将所有人的姓名(放在一个向量中)获取到了。
persons.name <- nodes.persons %>% xml_attr("name") %>% unlist()
我感觉我离解决方案很接近了,但是我无法理解如何将所有这些数据合并成一个漂亮的数据框(如上所述)。欢迎提出所有建议 :)