xml com irmãos aninhados no quadro de dados em R

Eu sou novo na análise de XML em R. Estou tentando analisar XML em um quadro de dados viável. Eu tentei algumas funções XPath do pacote XML, mas não consigo chegar à resposta correta.

Aqui está o meu XML:

<ResidentialProperty>
    <Listing>
      <StreetAddress>
        <StreetNumber>11111</StreetNumber>
        <StreetName>111th</StreetName>
        <StreetSuffix>Avenue Ct</StreetSuffix>
        <StateOrProvince>WA</StateOrProvince>
      </StreetAddress>
      <MLSInformation>
        <ListingStatus Status="Active"/>
        <StatusChangeDate>2015-07-05T23:48:53.410</StatusChangeDate>
      </MLSInformation>
      <GeographicData>
        <Latitude>11.111111</Latitude>
        <Longitude>-111.111111</Longitude>
        <County>Pierce</County>
      </GeographicData>
      <SchoolData>
        <SchoolDistrict>Puyallup</SchoolDistrict>
      </SchoolData>
      <View>Territorial</View>
    </Listing>
    <YearBuilt>1997</YearBuilt>
    <InteriorFeatures>Bath Off Master,Dbl Pane/Storm Windw</InteriorFeatures>
    <Occupant>
      <Name>Vacant</Name>
    </Occupant>
    <WaterFront/>
    <Roof>Composition</Roof>
    <Exterior>Brick,Cement Planked,Wood,Wood Products</
</ResidentialProperty>

Quando eu corro:

ResidentialProperty <- xmlToDataFrame(nodes=getNodeSet(doc,"//ResidentialProperty"))

Os valores dos nós filhos no nó pai são compactados para:

11111111thAvenue CtWA2015-07-05T23:48:53.41011.111111-111.111111PiercePuyallupTerritorial

Se eu mover um nó para baixo, acontece o mesmo:

11111111thAvenue CtWA

Os valores dos nós filhos são todos colados.

Eu também tentei um método de força bruta que funcionou um pouco:

StreetAddress <- xmlToDataFrame(nodes=getNodeSet(doc,"//StreetAddress"))
MLSInformation <- xmlToDataFrame(nodes=getNodeSet(doc,"//MLSInformation"))
GeographicData <- xmlToDataFrame(nodes=getNodeSet(doc,"//GeographicData"))
SchoolData <- xmlToDataFrame(nodes=getNodeSet(doc,"//SchoolData"))
YearBuilt <- xmlToDataFrame(nodes=getNodeSet(doc,"//YearBuilt"))
InteriorFeatures <- xmlToDataFrame(nodes=getNodeSet(doc,"//InteriorFeatures"))
Occupant <- xmlToDataFrame(nodes=getNodeSet(doc,"//Occupant"))
Roof <- xmlToDataFrame(nodes=getNodeSet(doc,"//Roof"))
Exterior <- xmlToDataFrame(nodes=getNodeSet(doc,"//Exterior"))
df <- cbind(StreetAddress, MLSInformation, GeographicData, SchoolData, YearBuilt, InteriorFeatures, Occupant, Roof, Exterior)

mas alguns dos nomes de coluna não eram como o esperado:

> colnames(df)
 [1] "StreetNumber"     "StreetName"       "StreetSuffix"     "StateOrProvince"  "ListingStatus"   
 [6] "StatusChangeDate" "Latitude"         "Longitude"        "County"           "SchoolDistrict"  
[11] "text"             "text"             "Name"             "text"             "text"    

colnames[11,12,14,15] deveria estar"YearBuilt", "InteriorFeatures", "Roof", and "Exterior" respectivamente. (Nota lateral - por que isso acontece?)

Estou tentando encontrar uma maneira de classificar cada valor atômico em uma coluna apropriada de um quadro de dados, com os nomes das colunas como os nomes dos nós, mesmo nos nós filhos aninhados. Além disso, meus dados podem mudar ao longo do tempo, por isso estou procurando uma função dinâmica para estar em conformidade com os dados, produzindo resultados esperados, se possível.

Eu imagino que este seja um esquema XML um tanto comum (com camadas de filhos aninhados), por isso estou surpreso por não encontrar muita informação sobre o tópico, embora eu possa simplesmente usar o jargão errado em minhas pesquisas. Acho que existe uma resposta simples. Você tem alguma sugestão?

questionAnswers(1)

yourAnswerToTheQuestion