2016-12-05 6 views
1

Я пытаюсь проанализировать XML-файл с помощью xml2. Но я не могу для жизни понять, как это сделать, указав имя.Извлечение узлов по имени

Это работает:

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> 

И я могу извлечь позиционно как шаг за шагом и с XPath:

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

_

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



Однако мои попытки выбора по имени не выполняются.

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

и

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

и

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



Может как-то мне точку в решение, которое каким-то образом спасаясь меня?



EDIT:

OK вот пример данных. С этими данными я хочу получить

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

Но выбран по названию.

<?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> 

ответ

2

Если вы хотите, чтобы извлечь все startTimeStamp значения из файла XML, вы можете сделать:

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

EDIT:

Если вы хотите, чтобы выбрать его по имени, то вам нужно беспокоиться о пространствах имен.

Действительно,

xml %>% xml_child("mzML") 

вернется

{xml_missing} 
<NA> 

сначала необходимо проверить пространств имен, связанных с файлом XML:

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 

так что вам нужно использовать:

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

Для полного пути к атрибуту вы заинтересованы в:

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

Документация на xml_ns() дает немного больше информации, и призывает вас переименовать пространство имен с более информативными именами.

+0

Спасибо. Но это не сработало для меня. Я добавил пример данных. –

+0

Я обновил ответ, чтобы отразить то, что вы просили. – sinQueso

+0

Спасибо! Это работает. Но не могу ли я быть явным о узлах на пути к этому атрибуту? Я предполагаю, что это будет более эффективно. По крайней мере, в теории. –