R: xmlEventParse con gran entrada XML de nodo variable y conversión a marco de datos
Tengo ~ 100 archivos XML de datos de publicación cada uno> 10 GB con el siguiente formato:
<?xml version="1.0" encoding="UTF-8"?>
<records xmlns="http://website”>
<REC rid=“this is a test”>
<UID>ABCD123</UID>
<data_1>
<fullrecord_metadata>
<references count=“3”>
<reference>
<uid>ABCD2345</uid>
</reference>
<reference>
<uid>ABCD3456</uid>
</reference>
<reference>
<uid>ABCD4567</uid>
</reference>
</references>
</fullrecord_metadata>
</data_1>
</REC>
<REC rid=“this is a test”>
<UID>XYZ0987</UID>
<data_1>
<fullrecord_metadata>
<references count=“N”>
</references>
</fullrecord_metadata>
</data_1>
</REC>
</records>
, con variación en el número de referencias para cada entrada única (indexada por UID), algunas de las cuales pueden ser cero.
El objetivo: crear 1 data.frame simple por archivo XML de la siguiente manera:
UID reference
ABCD123 ABCD2345
ABCD123 ABCD3456
ABCD123 ABCD4567
XYZ0987 NULL
Debido al tamaño de los archivos y la necesidad de un bucle eficiente en muchos archivos, he estado explorando xmlEventParse para limitar el uso de memoria. Puedo extraer con éxito la clave "UID" única para cada "REC" y crear un marco de datos utilizando el siguiente código de preguntas anteriores:
branchFunction <- function() {
store <- new.env()
func <- function(x, ...) {
ns <- getNodeSet(x, path = "//UID")
key <- xmlValue(ns[[1]])
value <- xmlValue(ns[[1]])
print(value)
store[[key]] <- value
}
getStore <- function() { as.list(store) }
list(UID = func, getStore=getStore)
}
myfunctions <- branchFunction()
xmlEventParse(
file = "test.xml",
handlers = NULL,
branches = myfunctions
)
DF <- do.call(rbind.data.frame, myfunctions$getStore())
Pero no puedo almacenar con éxito los datos de referencia ni manejar la variación en los números de referencia para un solo UID. Gracias por cualquier sugerencia!