2014-12-04 3 views
1

Duncan Temple Lang의 XML 패키지를 사용하여 R에서 XML을 구문 분석하려고합니다. 내가 가지고있는 코드는 다음과 같습니다 :recursive 함수 내에서 data.frame에 새 행 추가 R

library(XML) 
retrieveStructureInfo <- function(node, tableData) { 
    tableD <- data.frame(path = NA, node = NA, value = NA) 

    for (i in 1 : xmlSize(xmlAttrs(node))) { 
     tableD <- rbind(tableD, c("path", "node", "value")) 
     tableData <<- rbind(tableData, tableD)  
    } 

    #children is the no. of nodes within a node 
    for (i in 1 : children) { 
     #recursive function call 
     retrieveStructureInfo(node[[i]], tableD) 
    } 
} 

#parse xml document 
#xmlfile is the file path 
doc <- xmlParse(xmlfile) 
r <- xmlRoot(doc) 
tableData <- data.frame(path = NA, node = NA, value = NA) 
retrieveStructureInfo(r, tableData) 
tableData 

재귀 함수에서 행해지므로 data.frame에 행을 추가하는 데 문제가 있습니다. 아래 주어진 XML의 경우 마지막 두 속성 값만 data.frame에 추가됩니다. 즉 Source = "b"및 Available = "true"입니다. tableData라는 주 테이블을 만들고 tableD라는 함수 내에서 로컬 테이블로 업데이트하려고 시도하지만 작동하지 않습니다.

<CATALOG> 
    <PLANT> 
     <COMMON Source="a" Available="false">Bloodroot</COMMON> 
    </PLANT> 
    <PLANT> 
     <COMMON Source="b" Available="true">Columbine</COMMON> 
    </PLANT> 
</CATALOG> 

나는 내가 어떤 XML (I 재귀의 아이디어와 함께 갔다 이유이다)를 읽는 기능을 작성하는 것을 목표로하고 있음을 추가하는 것을 잊었다 및 출력 제공 : 일반적으로 답을

    path     node     value parent  type 
    CATALOG/PLANT/COMMON    Source     a PLANT attribute 
    CATALOG/PLANT/COMMON   Available     false PLANT attribute 
    CATALOG/PLANT/COMMON    COMMON    Bloodroot PLANT  text 

답변

0

을 to xml 및 recursion은 xpath를 사용하는 것입니다. 몇 xpath 쿼리 또는 xmlToList와 같은 도우미 함수 중 하나를 사용하여 테이블을 만들 수 있습니다.

x<- '<CATALOG> 
    <PLANT> 
     <COMMON Source="a" Available="false">Bloodroot</COMMON> 
    </PLANT> 
    <PLANT> 
     <COMMON Source="b" Available="true">Columbine</COMMON> 
    </PLANT> 
</CATALOG>' 

doc <- xmlParse(x) 

xpathSApply(doc, "//COMMON", xmlValue) 
[1] "Bloodroot" "Columbine" 
xpathSApply(doc, "//COMMON", xmlGetAttr, "Source") 
[1] "a" "b" 

y <- xmlToList(doc) 
data.frame(path=names(unlist(y)),value=unlist(y)) 
          path  value 
1    PLANT.COMMON.text Bloodroot 
2 PLANT.COMMON..attrs.Source   a 
3 PLANT.COMMON..attrs.Available  false 
4    PLANT.COMMON.text Columbine 
5 PLANT.COMMON..attrs.Source   b 
6 PLANT.COMMON..attrs.Available  true 

library(plyr) 
ldply(y, data.frame) #OR 
ldply(y, function(x) data.frame(x, names(x$COMMON$.attrs) )) 
    .id COMMON.text COMMON..attrs names.x.COMMON..attrs. 
1 PLANT Bloodroot    a     Source 
2 PLANT Bloodroot   false    Available 
3 PLANT Columbine    b     Source 
4 PLANT Columbine   true    Available 
+0

답변 해 주셔서 감사합니다. 내 이해에서 XPath는 경로를 지정해야합니다. 하지만 XML 스크립트가 무엇이든 관계없이 XML을 구문 분석해야하는 함수를 작성 중입니다. 그것은 XML을 구문 분석하고 내 질문에 출력을 생산해야합니다. – user2877232