R xml2 извлечь элемент из файла xbrl - PullRequest
0 голосов
/ 07 мая 2018

Может кто-нибудь помочь мне понять, почему я не могу извлечь узел / элемент из этого 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()    

1 Ответ

0 голосов
/ 07 мая 2018

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

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

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