xml-tei в R: выбор атрибутов в узлах

У меня есть файл xml-tei:

#in R
doc  <- xmlTreeParse("FILE_NAME" , useInternalNodes=TRUE, encoding="UTF-8")
ns  =  c(ns =  "http://www.tei-c.org/ns/1.0")
namespaces = ns
getNodeSet(doc,"//* and //@*", ns) 
doc

Я смотрю на два элемента внутри моего xml-tei: <l> и <w>, а также атрибуты (1) для <l>, @xml:id и (2) для <w> type="verb" и ana="#confrontation #action #ANT":

#example of element <l> and its child <w> in XML-TEI FILE    
<l n="5b-6a" xml:id="ktu1.3_ii_5b-6a">
 <w>[...]</w>
 <w type="verb" ana="#MḪṢ01 #confrontation #action #ANT" xml:id="ktu1-3_ii_l5b-6a_tmtḫṣ" lemmaRef="uga/verb.xml#mḫṣ">tmtḫṣ</w>
 <g>.</g>
</l>

Я использую функцию getNodeSet

#in R
l_cont <- getNodeSet(doc, "//ns:l[(@xml:id)]", ns) 
l_cont

Конечно, он показывает все элементы и атрибуты внутри <l>. Но я хотел бы выбрать только соответствующие атрибуты и их значения, чтобы было что-то вроде этого:

#in R
xml:id="ktu1.3_ii_5b-6a"
type="verb" ana="#confrontation #action #ANT"

Следуя предложению другого сообщения Загрузить XML в Dataframe в R с атрибутами родительского узла, я сделал:

#in R
attrTest <- function(x) {
 attrTest01 <- xmlGetAttr(x, "xml:id")
 w <- xpathApply(x, 'w', function(w) {
  ana <- xmlGetAttr(w, "ana")
  if(is.null(w))
 data.frame(attrTest01, ana)
 })
do.call(rbind, w)
}
res <- xpathApply(doc, "//ns:l[(@xml:id)]", ns ,attrTest)
temp.df <- do.call(rbind, res)

Но это не работает... Я получаю ошибки:

> res <- xpathApply(doc, "//ns:l[(@xml:id)]", ns ,attrTest)
Error in get(as.character(FUN), mode = "function", envir = envir) : 
objet 'http://www.tei-c.org/ns/1.0' de mode 'function' introuvable
> temp.df <- do.call(rbind, res)
Error in do.call(rbind, res) : objet 'res' introuvable

Есть ли у вас предложения? Заранее спасибо


person Vanessa    schedule 13.03.2017    source источник
comment
Содержимое xml уже добавлено выше, 2-й раздел начинается с #example of element <l> and its child <w> in xml-tei file .   -  person Vanessa    schedule 13.03.2017


Ответы (1)


Я бы предложил использовать R-пакет tei2r. (https://rdrr.io/github/michaelgavin/tei2r/) Этот пакет имеет помог мне при работе с файлами в кодировке TEI.

Из этого пакета я бы использовал функцию importTexts для импорта документа и функцию parseTEI для получения именно тех узлов, которые вы ищете.

Другой способ импорта и извлечения может быть таким:

read_tei <- function(folder) {
  list.files(folder, pattern = '\\.xml$', full.names = TRUE) %>%
    map_dfr(~.x %>% parseTEI(.,node = "INSERT_NODE_TO_FIND") %>%tibble())
}

text <- read_tei("/Path/to/file").
person Victor Harbo    schedule 14.07.2021