2017-05-30 102 views
0

我遇到了问题。我有一个XML文档,我需要到R. 到目前为止,我设法它使用包xmlplyr,做一个简单的XML上传到data.frame将xml文档转换为data.frame中的R

dataframe=ldply(xmlToList("file.xml"), data.frame) 

但是当一个data.frame我运行这个XML:

<BusinessUnitList> 
    <BusinessUnit id="000000195"> 
     <User id="897654322" firstName="Rick" lastName="Test" middleName="R" defaultLanguageName="English"> 
     <RoleList> 
      <Role id="worker"/> 
     </RoleList> 
     <OrgList> 
      <Organization id="1111"/> 
     </OrgList> 
     <Address country="Italy"/> 
     <Employee badgeNumber="575757" Date="2017-01-01" DateNew="2017-01-02" birthDate="1999-01-01"> 
      <Availability val1="5" val2="n" val3="6" HoursPerWeek="33.75" HoursBetweenShifts="10" minHoursPerWeek="00.00"/> 
     </Employee> 
     </User> 
</BusinessUnit> 
    <BusinessUnit id="000000111"> 
     <User id="897652222" firstName="TERI" lastName="tst2" middleName="D" defaultLanguageName="English"> 
     <RoleList> 
      <Role id="worker"/> 
     </RoleList> 
     <OrgList> 
      <Organization id="2222"/> 
     </OrgList> 
     <Address country="Portugal"/> 
     <Employee badgeNumber="575757" Date="2017-02-02" DateNew="2017-02-02" birthDate="1998-01-01"> 
      <Availability val1="5" val2="n" val3="6" HoursPerWeek="33.75" HoursBetweenShifts="10" minHoursPerWeek="00.00"/> 
     </Employee> 
     </User> 
     </BusinessUnit> 
    </BusinessUnitList> 

我收到一个错误:Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 9, 7.

+0

请提供样本数据和代码。 – PhilC

+2

为了能够为您提供帮助,我们需要了解您对输出格式有何期待(您希望在哪个列中输入哪些信息?) – sinQueso

+0

实际上,XML [*] [1]不太可能存在文件。您应该花一些时间来了解错误(至少一列没有相同数量的条目)。您可能需要像XML文件那样经常进行工作。 SO上有大量的XML处理问答。你似乎完全没有做过研究。 – hrbrmstr

回答

0

您试图列表结合这样

list(a=1:2, b=3:5) 
$a 
[1] 1 2 

$b 
[1] 3 4 5 

data.frame(list(a=1:2, b=3:5)) 
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 
    arguments imply differing number of rows: 2, 3 

我可能会取消列出xmlToList结果并格式化列名称。

doc <- xmlParse("file.xml") 
x <- data.frame(t(unlist(xmlToList(doc)))) 
names(x) <- gsub("(..attrs)?.id$", "_id", names(x)) 
names(x) <- gsub(".*\\.", "", names(x)) 

    Role_id Organization_id country val1 val2 val3 HoursPerWeek HoursBetweenShifts minHoursPerWeek badgeNumber  Date DateNew birthDate User_id firstName lastName middleName defaultLanguageName BusinessUnit_id 
1 worker   1111 Italy 5 n 6  33.75     10   00.00  575757 2017-01-01 2017-01-02 1999-01-01 897654322  Rick  Test   R    English  000000195 
+0

嗨Chris,感谢您的时间。我能够运行该示例,它的工作正常,它格式化我期望的数据,但是当我添加第二个孩子时,数据框中的输出仅显示一个记录(最后一个),我将获得更多记录。有趣的是,如果我打印“x”对象控制台打印我的两个记录,所以我不明白为什么这种行为。此外,在某些时候我缺少数据,我会更新XML,以便获得我的观点。 –