2016-05-18 2 views
0

Ich versuche, diese MPEG21 XML file zu analysieren, aber ich habe ein paar Probleme damit. Da es aus der URL zu lesen hat nicht funktioniert, ich die Datei heruntergeladen und lesen Sie die lokale Kopie:Parsing MPEG21 XML-Datei in R

ns <- "http://www.openarchives.org/OAI/2.0/" 
file <- "ddd:010168412.xml" 

xml.content<- xmlTreeParse(file) 
xml.top <- xmlRoot(xml.content) 

Nun, was ich brauche, ist für jede ID (zum Beispiel ddd zu extrahieren: 010168412: MPEG-21: A0003), wie in

<didl:Component dc:identifier="ddd:010168412:mpeg21:a0003:zoning"> 

die IDs der Textblöcke, die zu ihnen gehören, zum Beispiel:

<dcx:TextBlock ID="P1_TB00019"/> 
<dcx:TextBlock ID="P1_TB00020"/> 
<dcx:TextBlock ID="P1_TB00021"/> 
<dcx:TextBlock ID="P1_TB00022"/> 
<dcx:TextBlock ID="P1_TB00023"/> 

jedoch keiner meiner Versuche, etwas von den Baumarbeiten zu extrahieren, zum Beispiel dieses gibt nichts zurück, nicht einmal einen Fehler:

x <- sapply(getNodeSet(xml.top, "//responseDate"), xmlValue) 

Ich habe den Eindruck, dass ich etwas wirklich Grundlegendes übersehe. Irgendeine Idee?

Antwort

0

Es ist aufgrund des nicht deklariert Namespace in dem Root-Tag des XML-Dokuments, in dem die speziellen alias xmlns ist ein Präfix mit Doppelpunkt bezeichnet nicht hat:

xmlns="http://www.openarchives.org/OAI/2.0/" 

Als Ergebnis müssen Sie einen Präfix die erklären Namespace und verwenden es in jedem XPath Aufruf einschließlich getNodeSet und/oder xpathSApply:

namespaces <- c(ns="http://www.openarchives.org/OAI/2.0/") 

x <- sapply(getNodeSet(file, "//ns:responseDate", namespaces), xmlValue) 
x 
# [1] "2016-05-19T03:42:59.576Z" 

# ALTERNATIVE 
x <- xpathSApply(file, "//ns:responseDate", xmlValue, namespaces = namespaces) 
x 
# [1] "2016-05-19T03:42:59.576Z" 

Sie können auch mehrere Namespaces registrieren:

namespaces <- c(ns="http://www.openarchives.org/OAI/2.0/", 
       dc="http://purl.org/dc/elements/1.1/", 
       dcx="http://krait.kb.nl/coop/tel/handbook/telterms.html") 

y <- xpathSApply(file, "//dcx:TextBlock", xmlGetAttr, "ID", 
       namespaces = namespaces) 
head(y) 
# [1] "P1_TB00012" "P1_TB00013" "P1_TB00014" "P1_TB00015" "P1_TB00016" 
# [6] "P1_TB00017"