2015-02-11 65 views
2

我试图用R解析Eve killog数据,我遇到了解压缩数据的问题,因为该文件在一次kill内重复使用相同的rowset标记。用R中的重复元素名称解析XML

这是从XML的摘录(完整的例子找到here):

<rowset name="kills" key="killID" columns="killID,solarSystemID,killTime,moonID"> 
    <row killID="63" solarSystemID="30000848" killTime="2007-11-15 15:36:00" moonID="0"> 
    <victim characterID="150340823" characterName="Dieinafire" corporationID="1000169" 
      corporationName="Center for Advanced Studies" allianceID="0" 
      allianceName="" factionID="0" factionName="" 
      damageTaken="6378" shipTypeID="12003" /> 
    <rowset name="attackers" columns="characterID,characterName,corporationID,corporationName,allianceID,allianceName, 
      factionID,factionName,securityStatus,damageDone,finalBlow,weaponTypeID,shipTypeID"> 
     <row characterID="0" characterName="" corporationID="1000127" corporationName="Guristas" 
      allianceID="0" allianceName="" factionID="0" factionName="" securityStatus="0" 
      damageDone="6313" finalBlow="1" weaponTypeID="0" shipTypeID="203" /> 
     <row characterID="0" characterName="" corporationID="150279367" corporationName="Starbase Anchoring Corp" 
      allianceID="0" allianceName="" securityStatus="0" damageDone="65" finalBlow="0" 
      weaponTypeID="0" shipTypeID="16632" /> 
    </rowset> 

我的目标是得到这样的事情,每杀:

killID    63 
solarSystemID  30000848 
victim characterID Dieinafire 
attacker characterID "" 
attacker characterID "" 

我可以提取受害人信息像这样:

xpathSApply(xmlFile, "//victim", xmlGetAttr, 'characterName') 

因为只有一个受害者,但我不知道如何提取攻击者信息。我试过这个:

xpathSApply(xmlFile, "//rowset/row/", xmlGetAttr, 'characterName') 

但我得到了很多空响应。有人可以建议一个干净的方式来提取每个杀人的攻击者信息吗?

+0

你得到了很多的空应答,因为“characterName”很多属性值都是空的。我不知道什么是“攻击者信息”。顺便说一句,你发布的XML代码是坏的(你链接的是有效的)。 – djas 2015-02-12 00:35:35

回答

3

你可以试试这个,我跑它的总XML,而不是摘录:

#finds nodes that have a `killID` attribute 
data<-t(xpathSApply(xmlFile,"//row[@killID]",function(x){ 
    #gets the killI 
    killID<-xpathSApply(x, ".", xmlGetAttr, 'killID') 
    #gets the victimName 
    victimName<-xpathSApply(x, "./victim", xmlGetAttr, 'characterName') 
    #gets the attackers and pastes them together 
    attackersId<-paste0(getNodeSet(x,"rowset[@name='attackers']/row/@characterID"),collapse=",") 
    return(list(killID,victimName,attackersId)) 
} 
)) 
colnames(data)<-c("KillID","victimName","attackersID") 
data 
+0

这就是我所需要的。谢谢! – Rilcon42 2015-02-12 00:14:32