2014-07-16 3 views
0

R 및 XML 패키지 (xmlTreeParse 등)를 사용하여 xml 파일에서 특정 노드를 성공적으로 읽으려고 최선을 다했습니다. 다음 xml 더미 예제는 내가 사용하고있는 데이터를 나타냅니다.R : XML 데이터에서 특정 노드 내용 추출

<item> 
<title> Mickey Mouse </title> 
<description> Cartoon </description> 
<pubDate> 25 Apr 1965 </pubDate> 
<disney:Filing web="http://www.waltdisney.com/archives"> 
<disney:fileNumber>125364</disney:fileNumber> 
<disney:assignedID>7389</disney:assignedID> 
<disney:Files> 
    <disney:File disney:set="1" disney:file="abc.mov" disney:type="B&W"/> 
    <disney:File disney:set="2" disney:file="def.mov" disney:type="Col"/> 
    <disney:File disney:set="3" disney:file="wzt.mov" disney:type="B&W"/> 
</disney:Files> 
</disney:Filing> 
</item> 

처음 세 개의 노드를 성공적으로 추출하기 위해 xpathApply를 적용했습니다. 그러나 "disney : File"태그가 붙은 노드로 갈 수는 없습니다. 어떤 이유로 디즈니 이상의 모든 것 : 파일을 읽을 수 없습니다 ("보이지 않음").

내 목표는 모든 디즈니를 추출하는 것입니다 : 파일 라인을 데이터 프레임 이상으로 추출하는 것 : 먼저 특정 디즈니 검색 :이 노드의 모든 정보 만 데이터 프레임으로 설정하고 추출하십시오. 어떤 도움이라도 정말 좋을 것입니다. 미리 감사드립니다!

+1

xpath에 네임 스페이스를 사용해야합니다. 자세한 내용은'xmlNamespaces'를보십시오. 문제의 XML 파일과 네임 스페이스 정의가 없으면 도움이되지 않습니다. 예를 들어,'xpathSApply (doc, '// */disney : File', xmlValue)'를 사용하는 것은 충분하지만 어쩌면 추가 네임 스페이스가있을 수 있습니다. – jdharrison

+0

정말로하고 싶은게 있다면'disney : File' 데이터를 얻는 것 뿐이지요. 단 한 줄로되어 있다고 확신 할 수 있습니다.'readLines' +'grep' +'str_extract'로 충분할 것입니다. XML이기 때문에 천천히/메모리 낭비적인 트리 파싱을 할 필요가 없습니다. 물론 복잡한 추출을 위해 (그리고 파일 당 1 비트 이상의 데이터 추출 유형을 사용하는 경우) XML 구문 분석은 상당한 의미를 갖습니다. – hrbrmstr

+0

@jdharrison과 hrbrmstr에게 감사드립니다. 나는 readLines 등으로 갔다. 왜냐하면이 작업을 위해 더 간단하고 직선적으로 보였기 때문이다. 큰 도움이됩니다! – PBolbrinker

답변

2

일부 샘플 데이터

'<?xml version="1.0"?> 
<aw:PurchaseOrder 
    aw:PurchaseOrderNumber="99503" 
aw:OrderDate="1999-10-20" 
xmlns:aw="http://www.adventure-works.com"> 
<aw:Address aw:Type="Shipping"> 
<aw:Name>Ellen Adams</aw:Name> 
<aw:Street>123 Maple Street</aw:Street> 
<aw:City>Mill Valley</aw:City> 
<aw:State>CA</aw:State> 
<aw:Zip>10999</aw:Zip> 
<aw:Country>USA</aw:Country> 
</aw:Address> 
<aw:Address aw:Type="Billing"> 
<aw:Name>Tai Yee</aw:Name> 
<aw:Street>8 Oak Avenue</aw:Street> 
<aw:City>Old Town</aw:City> 
<aw:State>PA</aw:State> 
<aw:Zip>95819</aw:Zip> 
<aw:Country>USA</aw:Country> 
</aw:Address> 
<aw:DeliveryNotes>Please leave packages in shed by driveway.</aw:DeliveryNotes> 
<aw:Items> 
<aw:Item aw:PartNumber="872-AA"> 
<aw:ProductName>Lawnmower</aw:ProductName> 
<aw:Quantity>1</aw:Quantity> 
<aw:USPrice>148.95</aw:USPrice> 
<aw:Comment>Confirm this is electric</aw:Comment> 
</aw:Item> 
<aw:Item aw:PartNumber="926-AA"> 
<aw:ProductName>Baby Monitor</aw:ProductName> 
<aw:Quantity>2</aw:Quantity> 
<aw:USPrice>39.98</aw:USPrice> 
<aw:ShipDate>1999-05-21</aw:ShipDate> 
</aw:Item> 
</aw:Items> 
</aw:PurchaseOrder>' -> xData 

당신은 namespcae를 선언하고 여기에 우리가 ns을 사용 그것에게 태그를 제공 할 수 있습니다. 이 경우에는 aw:Item을 사용할 수 있었지만 예제로 네임 스페이스에 태그를 지정했습니다.

library(XML) 
myData <- xmlParse(xData) 
> xpathSApply(myData, "//*/ns:Item/ns:ProductName" 
       , namespaces = c(ns = "http://www.adventure-works.com") 
       , xmlValue) 
[1] "Lawnmower" "Baby Monitor"