#r #xml #for-loop #xml-parsing #xml2
Вопрос:
Я работаю с большими XML-файлами, касающимися погоды, и мне нужно каким-то образом получить информацию со всех узлов. Каждый XML состоит из месяца, который содержит каждый день, разделенный на 10 минут.
XML выглядит так, но намного дольше:
lt;?xml version= "1.0" encoding="ISO-8859-1" ?gt; lt;mes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="G039_2003_1.xsd"gt; lt;dia Dia="2003-1-01"gt; lt;hora Hora="00:00"gt; lt;Meteorosgt; lt;Cub.Vto._a_3050cmgt;0.59lt;/Cub.Vto._a_3050cmgt; lt;Dir.Med._a_3050cmgt;215.0lt;/Dir.Med._a_3050cmgt; lt;Humedad._a_3050cmgt;56.0lt;/Humedad._a_3050cmgt; lt;Irradia.._a_800cmgt;2.0lt;/Irradia.._a_800cmgt; lt;Precip.._a_174cmgt;0.0lt;/Precip.._a_174cmgt; lt;Presión._a_60cmgt;800.1lt;/Presión._a_60cmgt; lt;Sig.Dir._a_3050cmgt;15.0lt;/Sig.Dir._a_3050cmgt; lt;Sig.Vel._a_3050cmgt;20.0lt;/Sig.Vel._a_3050cmgt; lt;Tem.Sue._a_0cmgt;11.4lt;/Tem.Sue._a_0cmgt; lt;Tem.Aire._a_164cmgt;14.5lt;/Tem.Aire._a_164cmgt; lt;Vel.Max._a_3050cmgt;13.9lt;/Vel.Max._a_3050cmgt; lt;Vel.Med._a_3050cmgt;7.9lt;/Vel.Med._a_3050cmgt; lt;/Meteorosgt; lt;/horagt; lt;hora Hora="00:10"gt; lt;Meteorosgt; lt;Cub.Vto._a_3050cmgt;0.39lt;/Cub.Vto._a_3050cmgt; lt;Dir.Med._a_3050cmgt;211.0lt;/Dir.Med._a_3050cmgt; lt;Humedad._a_3050cmgt;58.0lt;/Humedad._a_3050cmgt; lt;Irradia.._a_800cmgt;1.0lt;/Irradia.._a_800cmgt; lt;Precip.._a_174cmgt;0.0lt;/Precip.._a_174cmgt; lt;Presión._a_60cmgt;800.1lt;/Presión._a_60cmgt; lt;Sig.Dir._a_3050cmgt;15.0lt;/Sig.Dir._a_3050cmgt; lt;Sig.Vel._a_3050cmgt;18.0lt;/Sig.Vel._a_3050cmgt; lt;Tem.Sue._a_0cmgt;11.0lt;/Tem.Sue._a_0cmgt; lt;Tem.Aire._a_164cmgt;14.5lt;/Tem.Aire._a_164cmgt; lt;Vel.Max._a_3050cmgt;12.2lt;/Vel.Max._a_3050cmgt; lt;Vel.Med._a_3050cmgt;6.8lt;/Vel.Med._a_3050cmgt; lt;/Meteorosgt;
Так что в основном то, что мне нужно, — это вывод даты, часа и информации каждый раз.
Я пробовал это до сих пор:
library(XML) library(xml2) setwd() Enero2003 lt;- read_xml("C039_2003/G039_2003_1.xml")
Что, дает такой результат:
Мне нужен цикл, который дает мне дату, час и данные внутри каждого узла. Для этого я попробовал это, и это не работает.
MonthDays lt;-length(xml_contents(Enero2003)) for(i in 1:MonthDays) { xml_child(xml_child(xml_child(Enero2003, 1), 1), 1)} HourOfTheDay lt;- xml_attrs(xml_child(xml_child(Enero2003, 1), 1))[["Hora"]]
Я буду признателен за любую помощь. Спасибо.
Ответ №1:
Это должно помочь вам начать….
library(xml2) library(magrittr) # read xml doc lt;- xml2::read_xml(xml.text) # get all meteoros-nodes nodes lt;- xml2::xml_find_all(doc, ".//Meteoros") # get all possible childersn-names of the meteoros-nodes cols lt;- xml_children(nodes) %gt;% xml2::xml_name() %gt;% unique() # initialise matrix p lt;- matrix(nrow = length(nodes), ncol = length(cols)) # fill matrix childnodes for (i in 1:length(cols) ) { p[, i] lt;- xml2::xml_find_first(nodes, paste0( ".//", cols[i])) %gt;% xml2::xml_text() } colnames(p) lt;- cols # get day time info q lt;- matrix(nrow = length(nodes), ncol = 2) q[, 1] lt;- xml2::xml_find_first(nodes, "./ancestor::hora") %gt;% xml2::xml_attr("Hora") q[, 2] lt;- xml2::xml_find_first(nodes, "./ancestor::dia") %gt;% xml2::xml_attr("Dia") colnames(q) lt;- c("Hora", "Dia") final lt;- as.data.frame(cbind(q, p))
Комментарии:
1. Я действительно благодарен за этот ответ. Я надеюсь, что это не будет беспокоить тебя, но мне нужно после этого что-то еще. Теперь мне нужно стабилизировать штормы при 2 условиях: 1.- Каждый раз, когда начинается и прекращается дождь, учитывать, что еще один шторм должен быть более 24 часов. 2.- Чтобы быть полезным, в шторме должно быть более 1 мм воды. Огромное спасибо.