2017-02-25 2 views
2

Ich denke, diese Frage wurde möglicherweise zuvor gestellt, aber nach der Recherche konnte ich nichts finden. Ich bin neu beim Parsen von XML-Dokumenten. Ich versuche, eine XML-Seite zu analysieren, die wie folgt aussieht:Parsing XML in R, kämpfen mit verschiedenen Zeilen Fehler

schedule = xmlParse("MYXML.XML") 

# here's what schedule looks like 
<all-games> 
    <game-schedule> 
    <team name="Knicks"> 
    <outcome winner="OtherTeam"> 
    </game-schedule> 
    <game-schedule> 
    <team name="Lakers"> 
    <outcome winner="HomeTeam"> 
    </game-schedule> 
    <game-schedule> 
    <team name="Celtics"> 
    </game-schedule> 
</all-games> 


# here's my code to parse the XML 
my_df = data.frame(
    team = sapply(schedule["//game-schedule/team/@name"], as, "character"), 
    winner = sapply(schedule["//game-schedule/outcome/@winner"], as, "character") 
) 

und ich erhalte den folgenden erwarteten Fehler (zu erwarten, da es keinen dritter ist:

Error in data.frame(Visitor = sapply(schedule["//game-schedule/team/@name"], : 
arguments imply differing number of rows: 3, 2 

Ich mag den Datenrahmen so analysieren, ., dass vermisste Kinder werden einfach als NA ausgefüllt das heißt, ich versuche, den folgenden Datenrahmen zu erhalten.

my_df 
     team  winner 
1 Knicks OtherTeam 
2 Lakers HomeTeam 
3 Celtics   NA 

die NA im XML-Dokument reflektiert, dass das Spiel noch nicht geschehen ist

Antwort

1

Sie benötigen einen Wrapper, der NA zurückgeben kann, wenn das Tag fehlt, etwas wie xpath2 unten für xpathSApply. Holen Sie dann die Knoten und wenden Sie xpath2 überall auf dem aktuellen Knoten an. ".//"

xpath2 <-function(x, ...){ 
    y <- xpathSApply(x, ...) 
    ifelse(length(y) == 0, NA, paste(y, collapse=", ")) 
} 
nd <- getNodeSet(schedule, "//game-schedule") 
data.frame(
    team = sapply(nd, xpath2, ".//team", xmlGetAttr, "name"), 
winner = sapply(nd, xpath2, ".//outcome", xmlGetAttr, "winner") 
) 
team winner 
1 Knicks OtherTeam 
2 Lakers HomeTeam 
3 Celtics  <NA>