Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R';s的XML库?_Xml_R_Xpath_Xquery - Fatal编程技术网

如何使用R';s的XML库?

如何使用R';s的XML库?,xml,r,xpath,xquery,Xml,R,Xpath,Xquery,xml文件包含以下代码段: <?xml version="1.0"?> <PC-AssayContainer xmlns="http://www.ncbi.nlm.nih.gov" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.ncbi.nlm.nih.gov ftp://ftp.ncbi.nlm.nih.gov/pubchem/spe

xml文件包含以下代码段:

<?xml version="1.0"?>
<PC-AssayContainer
    xmlns="http://www.ncbi.nlm.nih.gov"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://www.ncbi.nlm.nih.gov ftp://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem.xsd"
>
....
    <PC-AnnotatedXRef>
      <PC-AnnotatedXRef_xref>
        <PC-XRefData>
          <PC-XRefData_pmid>17959251</PC-XRefData_pmid>
        </PC-XRefData>
      </PC-AnnotatedXRef_xref>
    </PC-AnnotatedXRef>
xpath不应该匹配:

<PC-XRefData_pmid>17959251</PC-XRefData_pmid>
17959251
这是常见问题解答

这:
//PC-XRefData\u pmid

表示:文档中无命名空间或空命名空间下的任何
PC-XRefData\u pmid

它并不意味着默认名称空间下文档中的任何
PC-XRefData\u pmid


另外,您的文档示例尚未完成,但看起来您的
PC-XRefData\u pmid
元素位于
http://www.ncbi.nlm.nih.gov
名称空间

因为默认名称空间是NIH名称空间(其URI为“http://www.ncbi.nlm.nih.gov”,
(以及XML文档中没有名称空间前缀的所有其他元素)都位于该NIH名称空间中

因此,要将它们与XPath匹配,您需要告诉XPath处理器您将为NIH名称空间使用什么前缀,并且您需要在XPath中使用该前缀

所以,在不知道R的情况下,我会尝试

xpathApply(doc, "//nih:PC-XRefData_pmid",
   ns= c(nih = "http://www.ncbi.nlm.nih.gov"))
否则

getNodeSet(doc, "//*[local-name() = 'PC-XRefData_pmid']")
因为后者绕过了名称空间

XML文档将NIH名称空间声明为默认名称空间并不意味着XPath处理器会知道这一点。在XML信息模型中,名称空间前缀并不重要。因此,当我解析XML文档时,NIH名称空间是绑定到“NIH:”前缀还是“Snizzlez:”并不重要前缀或“”(默认值)前缀。XML解析器或XPath处理器不必知道什么前缀绑定到XML文档中的哪个命名空间。特别是因为在同一文档的不同位置可能有多个不同的前缀绑定到同一命名空间…反之亦然。因此,如果要使XPath表达式与,则必须向XPath处理器声明该命名空间

编辑:这里有一些由@Jim Pivarski提供的注意事项:

  • “doc”必须是xml节点,而不是文档(类“XMLNode”或“XMLInternalElementNode”,而不是“XMLDocument”或“XMLInternalDocument”)
  • 至少在Jim的版本(XML_3.93-0)中,命名参数是“名称空间”,而不是“ns”
因此,如果“doc”是文档类的实例,正确的解决方案是:

xpathApply(xmlRoot(doc), "//nih:PC-XRefData_pmid",
   namespaces = c(nih = "http://www.ncbi.nlm.nih.gov"))

我对R一无所知,我假设
ns=“xs”
ns=c(xs…
parts正在声明表达式中使用的名称空间。这可能是问题所在,因为元素
PC-XRefData\u pmid
不是
http://www.w3.org/2001/XMLSchema-instance
名称空间,而不是
http://www.ncbi.nlm.nih.gov
,这是源文档中的默认命名空间。Sear对xs:PC-XRefData\u pmid的检查是错误的。我假设我不需要名称空间,因为默认名称空间是xmlns=“”?xpath查询“//PC-XRefData\u pmid”不应该吗工作?@Alejandro,你能为粗体部分提供一个参考吗?我相信你,但我想确定的是,这不仅适用于XSLT中的XPath,而且适用于一般的XPath,即使将默认名称空间声明传递给XPath处理器。@Alejandro:没关系,我在上看到它。你会说这适用于XPath 1.0,但不适用于XPath 2吗。0?因为XSLT 2.0允许您为XPath表达式声明默认的ns。谢谢,我不知道有关//的XPath查询信息。@Alejandro:再次回答我自己。:-)根据,在XPath 2.0中,非固定的QName在主节点类型为element的轴上用作名称测试时,在表达式上下文中具有默认元素/类型命名空间的命名空间URI;否则,它没有命名空间URI。"但是我们假设@tommy使用的是XPath 1.0。@LarsH:我认为这是正确的部分:
如果两个扩展名具有相同的本地部分,那么它们都是相等的,或者都具有空名称空间URI,或者都具有相等的非空名称空间URI。
另外,看起来正确的术语应该是空名称空间URI。这太棒了,我一直都这么认为WarrenFaith:我很高兴你带来了这些我不知道的额外的注意事项。不过,我想知道,它们是否更适合单独的答案。事实上,这听起来(尤其是最后几句话)好像它是从我这里来的。@LarsH我没有,但我修改了它作为最后一个(删除了一些不重要的东西).WF:哦,我明白了,你刚刚审阅了吉姆的编辑,删除了他的自我归因?我想我会编辑它,以澄清他添加的内容。@JimPivarski:我认为你的警告很有价值,但下次请将它们放在评论或单独的答案中。这次,我将把它们纳入我的答案中,并附上归因。
xpathApply(xmlRoot(doc), "//nih:PC-XRefData_pmid",
   namespaces = c(nih = "http://www.ncbi.nlm.nih.gov"))