【问题标题】:Extracting nodes by name按名称提取节点
【发布时间】:2016-12-05 15:39:10
【问题描述】:

我正在尝试使用 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")



但是我尝试按名称选择失败了。

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



能以某种方式指出我以某种方式逃避我的解决方案吗?



编辑:

好的,这里是一个数据示例。有了这些数据,我想要的是

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>

【问题讨论】:

    标签: r xml2


    【解决方案1】:

    如果您想从 XML 文件中提取所有 startTimeStamp 值,您可以这样做:

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

    编辑:

    如果你想按名称选择它,那么你需要担心命名空间。

    确实,

    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() 的文档提供了更多信息,并鼓励您使用更多信息名称重命名命名空间。

    【讨论】:

    • 谢谢。但这对我不起作用。我现在添加了一个数据示例。
    • 谢谢!这样可行。但是我不能明确说明该属性路径上的节点吗?我想这样会更有效率。至少在理论上。
    • 只是为了检查我是否根据我最初的尝试测试了你的线路。你的需要两倍的时间。诚然,我必须复制(10000,...)才能获得可衡量的差异,但我仍然想学习定义节点。
    • 我编辑了我的答案以展示如何使用命名空间从其完整路径访问属性
    • 好极了。那是缺失的部分。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多