Поскольку пространство имен по умолчанию - это пространство NIH (чей URI равен "http://www.ncbi.nlm.nih.gov"), <PC-XRefData_pmid>
(и все остальные элементы в вашем 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:» или префикс «snizzlefritz:» или префикс «» (по умолчанию). Считается, что анализатору XML или процессору XPath не нужно знать, какой префикс привязан к какому пространству именв документе XML.Тем более что может быть несколько разных префиксов, привязанных к одному и тому же пространству имен в разных местах одного и того же документа ... и наоборот.Поэтому, если вы хотите, чтобы ваше выражение XPath совпадало с элементом, который находится в пространстве имен, вы должны объявить это пространство имен процессору XPath.
Редактировать: Есть несколько предостережений, внесенных@Jim Pivarski:
- "Документ" должен быть узлом xml, а не документом (класс "XMLNode" или "XMLInternalElementNode", а не "XMLDocument" или "XMLInternalDocument").
- По крайней мере, в версии Джима (XML_3.93-0) именованный аргумент - это «пространства имен», а не «ns».
Так что, если «doc» является экземпляром класса документа,правильное решение:
xpathApply(xmlRoot(doc), "//nih:PC-XRefData_pmid",
namespaces = c(nih = "http://www.ncbi.nlm.nih.gov"))