2016-12-05 29 views
1

xml2でXMLファイルを解析しようとしています。しかし私は私の人生のために名前を指定することによってそれを行う方法を理解することはできません。名前でノードを抽出する

これは動作します:

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") 



しかし、名前で選択する私のattempsは失敗しています。

> 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

あなたはXMLファイルからすべてのstartTimeStamp値を抽出したい場合は、あなたが行うことができます:

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

EDIT:

名前でそれを選択したい場合は、あなたが必要とします名前空間について心配する

実際、

xml %>% xml_child("mzML") 

は、あなたが最初にあなたのXMLファイルに関連付けられた名前空間をチェックする必要があり

{xml_missing} 
<NA> 

返します。

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

ありがとう!それは動作します。しかし、その属性へのパス上のノードについて明示することはできませんか?もっと効率的だと思います。少なくとも理論的には。 –

関連する問題