R xml2 извлечь элемент из файла xbrl

Может ли кто-нибудь помочь мне понять, почему я не могу извлечь узел / элемент из этого xml файла? Технически это файл xbrl, но я ожидаю, что библиотека R xml2 будет работать точно так же.

Прочтите в файле. Третий элемент или узел кажется единицей. Этот код работает так, как ожидалось:

library(xml2)
library(tidyverse)


eqr <- read_xml(x = "https://www.sec.gov/Archives/edgar/data/906107/000156459018010687/eqr-20180331.xml")

View(eqr)

xml_child(eqr, 3)

Однако я не могу заставить этот код работать:

xml_find_first(eqr, xpath = "unit")

Поиск других элементов с помощью этого метода работает должным образом:

xml_find_first(eqr, xpath = "us-gaap:OperatingLeasesIncomeStatementLeaseRevenue")
xml_find_first(eqr, xpath = "us-gaap:OperatingLeasesIncomeStatementLeaseRevenue") %>%
 xml_double()    

person Chris Kiniry    schedule 07.05.2018    source источник


Ответы (1)


Очень типичная проблема при работе с XML-файлами, поскольку у документа есть пространство имен по умолчанию, обозначенное без префикса, разделенного двоеточиями: xmlns="http://www.xbrl.org/2003/instance".

В результате узлы, не входящие в локальное пространство имен, связаны с этим значением по умолчанию, и любой XPath должен запускать определяемый пользователем префикс для сопоставления узла с ним. К счастью, xml2 позволяет это, поскольку xml_find_first поддерживает третий аргумент, ns, который принимает именованный вектор или xml_ns() вызов:

# CREATED DOC PREFIX AND INCLUDED IN XPATH
xml_find_first(eqr, xpath = "doc:unit", ns = c(doc="http://www.xbrl.org/2003/instance"))

# {xml_node}
# <unit id="U_shares">
# [1] <measure>shares</measure>

В качестве альтернативы xml2 также позволяет удалять пространства имен по умолчанию:

xml_find_first(xml_ns_strip(eqr), xpath = "unit")

# {xml_node}
# <unit id="U_shares">
# [1] <measure>shares</measure>
person Parfait    schedule 07.05.2018
comment
Оба фрагмента кода работают. Спасибо за объяснение. - person Chris Kiniry; 07.05.2018
comment
Голосование за ответ; Я просто хотел добавить, что рекомендую использовать xbrli в качестве префикса, привязанного к пространству имен http://www.xbrl.org/2003/instance. В то время как в XML префиксы не имеют значения теоретически, сообщество XBRL установило практику глобального согласования способов использования префиксов, особенно для стандартных пространств имен (см., Например, xbrl.us/xbrl-reference/standard-units). Использование этих префиксов упростит понимание кода специалистами XBRL. Некоторые спецификации (OIM) и официальные органы даже официально применяют некоторые префиксы. - person Ghislain Fourny; 08.05.2018