2016-12-05 3 views
1

Ich versuche, eine XML-Datei mit XML2 zu analysieren. Aber ich kann nicht für das Leben von mir herausfinden, wie man es macht, indem man den Namen angibt.Extrahieren von Knoten nach Name

Dies funktioniert:

library(xml2) 
library(dplyr) 

xml <- read_xml(file) 

->

> xml 
{xml_document} 
<indexedmzML schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.2_idx.xsd" xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
[1] <mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml ... 
[2] <indexList count="2">\n <index name="spectrum">\n <offset idRef="scanId=3027">15181</offset>\n <offset idRef="scanId=3524">30052</offset> ... 
[3] <indexListOffset>73363063</indexListOffset> 
[4] <fileChecksum>b8f69d6276d9c4929e74416bc9e3446a173d1894</fileChecksum> 

Und ich kann von Position extrahieren sowohl Schritt-für-Schritt und mit XPath:

xml_child(xml, 1) %>% xml_child(7) %>% xml_attr("startTimeStamp") 

_

xml_child(xml, "/*[1]/*[7]") %>% xml_attr("startTimeStamp") 



Allerdings versagen meine Versuche, nach Namen zu wählen.

> xml_child(xml, "indexedmzML") 
{xml_missing} 
<NA> 
> xml_child(xml, "mzML") 
{xml_missing} 
<NA> 

und

> xml_child(xml, "/indexedmzML") 
{xml_missing} 
<NA> 
> xml_child(xml, "/mzML") 
{xml_missing} 
<NA> 

und

> xml_child(xml, "/mzML/run") 
{xml_missing} 
<NA> 



Kann mir irgendwie zu der Lösung zeigen, die mich irgendwie zu entkommen ist?



EDIT:

OK hier ist ein Datenbeispiel. Mit diesen Daten, was ich will, ist

xml_child(xml, 1) %>% xml_child(2) %>% xml_attr("startTimeStamp") 

Aber nach Namen ausgewählt.

<?xml version="1.0" encoding="utf-8"?> 
<indexedmzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.2_idx.xsd"> 
    <mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd" id="0001_LIP1p_20150803_008_CHCl3-MeOH_1_1" version="1.1.0"> 

     <dataProcessing id="pwiz_Reader_Agilent_conversion"> 
     <processingMethod order="0" softwareRef="pwiz"> 
      <cvParam cvRef="MS" accession="MS:1000544" name="Conversion to mzML" value=""/> 
     </processingMethod> 
     <processingMethod order="1" softwareRef="pwiz"> 
      <cvParam cvRef="MS" accession="MS:1000035" name="peak picking" value=""/> 
      <userParam name="Agilent/MassHunter peak picking"/> 
     </processingMethod> 
     </dataProcessing> 

    <run id="_x0030_001_LIP1p_20150803_008_CHCl3-MeOH_1_1" defaultInstrumentConfigurationRef="IC1" startTimeStamp="2015-08-03T14:34:14Z" defaultSourceFileRef="MSScan.bin"> 

    </run> 
    </mzML> 
</indexedmzML> 

Antwort

2

Wenn Sie die alle startTimeStamp Werte aus der XML-Datei extrahieren möchten, können Sie tun:

xml %>% xml_find_all("//@startTimeStamp") %>% xml_text() 

EDIT:

Wenn Sie es mit Namen auswählen möchten, dann müssen Sie sich um Namensräume sorgen.

Tat

xml %>% xml_child("mzML") 

zurück

{xml_missing} 
<NA> 

müssen Sie zuerst die Namensräume mit dem XML-Datei zugeordnet überprüfen:

xml_ns(xml) 
# d1 <-> http://psi.hupo.org/ms/mzml 
# d2 <-> http://psi.hupo.org/ms/mzml 
# xsi <-> http://www.w3.org/2001/XMLSchema-instance 
# xsi1 <-> http://www.w3.org/2001/XMLSchema-instance 

so müssen Sie verwenden:

xml %>% xml_child("d1:mzML") 

Für den vollständigen Pfad zu dem Attribut, das Sie interessiert sind:

xml %>% xml_child("d1:mzML") %>% xml_child("d1:run") %>% xml_attr("startTimeStamp") 

Die Dokumentation des xml_ns() gibt ein wenig mehr Informationen, und fordert Sie dazu auf Ihre Namespaces mit informativer Namen umzubenennen.

+0

Danke. Aber das hat nicht für mich funktioniert. Ich habe jetzt ein Datenbeispiel hinzugefügt. –

+0

Ich habe die Antwort aktualisiert, um zu reflektieren, wonach Sie gefragt haben. – sinQueso

+0

Danke! Das funktioniert. Aber kann ich die Knoten auf dem Pfad zu diesem Attribut nicht explizit angeben? Ich denke, das wäre effizienter. Zumindest in der Theorie. –

Verwandte Themen