带有嵌套兄弟节点的xml到R中的数据框

前端之家收集整理的这篇文章主要介绍了带有嵌套兄弟节点的xml到R中的数据框前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是R中解析XML的新手.我正在尝试将XML解析为可行的数据框.我已经尝试了XML包中的一些XPath函数,但似乎无法得出正确的答案.

这是我的XML:

  1. <ResidentialProperty>
  2. <Listing>
  3. <StreetAddress>
  4. <StreetNumber>11111</StreetNumber>
  5. <StreetName>111th</StreetName>
  6. <StreetSuffix>Avenue Ct</StreetSuffix>
  7. <StateOrProvince>WA</StateOrProvince>
  8. </StreetAddress>
  9. <MLSInformation>
  10. <ListingStatus Status="Active"/>
  11. <StatusChangeDate>2015-07-05T23:48:53.410</StatusChangeDate>
  12. </MLSInformation>
  13. <GeographicData>
  14. <Latitude>11.111111</Latitude>
  15. <Longitude>-111.111111</Longitude>
  16. <County>Pierce</County>
  17. </GeographicData>
  18. <SchoolData>
  19. <SchoolDistrict>Puyallup</SchoolDistrict>
  20. </SchoolData>
  21. <View>Territorial</View>
  22. </Listing>
  23. <YearBuilt>1997</YearBuilt>
  24. <InteriorFeatures>Bath Off Master,Dbl Pane/Storm Windw</InteriorFeatures>
  25. <Occupant>
  26. <Name>Vacant</Name>
  27. </Occupant>
  28. <WaterFront/>
  29. <Roof>Composition</Roof>
  30. <Exterior>Brick,Cement Planked,Wood,Wood Products</
  31. </ResidentialProperty>

当我跑:

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

父节点中子节点的值被压缩为:

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

如果我向下移动一个节点,则会发生同样的事情:

  1. 11111111thAvenue CtWA

子节点的值全部粘贴在一起.

我也试过一种有点工作的蛮力方法

  1. StreetAddress <- xmlToDataFrame(nodes=getNodeSet(doc,"//StreetAddress"))
  2. MLSInformation <- xmlToDataFrame(nodes=getNodeSet(doc,"//MLSInformation"))
  3. GeographicData <- xmlToDataFrame(nodes=getNodeSet(doc,"//GeographicData"))
  4. SchoolData <- xmlToDataFrame(nodes=getNodeSet(doc,"//SchoolData"))
  5. YearBuilt <- xmlToDataFrame(nodes=getNodeSet(doc,"//YearBuilt"))
  6. InteriorFeatures <- xmlToDataFrame(nodes=getNodeSet(doc,"//InteriorFeatures"))
  7. Occupant <- xmlToDataFrame(nodes=getNodeSet(doc,"//Occupant"))
  8. Roof <- xmlToDataFrame(nodes=getNodeSet(doc,"//Roof"))
  9. Exterior <- xmlToDataFrame(nodes=getNodeSet(doc,"//Exterior"))
  10. df <- cbind(StreetAddress,MLSInformation,GeographicData,SchoolData,YearBuilt,InteriorFeatures,Occupant,Roof,Exterior)

但是一些列名不符合预期:

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

colnames [11,12,14,15]应分别为“YearBuilt”,“InteriorFeatures”,“Roof”和“Exterior”. (旁注 – 为什么会这样?)

我试图找到一种方法将每个原子值排序到数据框的适当列中,列名称是节点的名称,即使在嵌套的子节点中也是如此.此外,我的数据可能会随着时间的推移而发生变化,所以我正在寻找一种符合数据的动态函数,如果可能的话会产生预期的结果.

我想这是一个有点常见的XML模式(带有嵌套子元素的层),所以我很惊讶没有找到关于这个主题的太多信息,尽管我可能只是在我的搜索中使用了错误的术语.我猜我有一个简单的答案.你有什么建议吗?

考虑到xml保存您的示例字符串,这是具有不同数量项目的住宅物业的另一种策略:
  1. library(XML)
  2. library(plyr)
  3. # xml <- '<ResidentialProperty>........'
  4. doc <- xmlParse(xml,asText = TRUE)
  5. df <- do.call(rbind.fill,lapply(doc['//ResidentialProperty'],function(x) {
  6. names <- xpathSApply(x,'.//.',xmlName)
  7. names <- names[which(names == "text") - 1]
  8. values <- xpathSApply(x,".//text()",xmlValue)
  9. return(as.data.frame(t(setNames(values,names)),stringsAsFactors = FALSE))
  10. }))
  11. df
  12. # StreetNumber StreetName StreetSuffix StateOrProvince StatusChangeDate Latitude Longitude County SchoolDistrict View YearBuilt InteriorFeatures Name Roof Exterior
  13. # 1 11111 111th Avenue Ct WA 2015-07-05T23:48:53.410 11.111111 -111.111111 Pierce Puyallup Territorial 1997 Bath Off Master,Dbl Pane/Storm Windw Vacant Composition Brick,Wood Products

猜你在找的XML相关文章