在 R 中使用 XML2 解析大 XML

Posted

技术标签:

【中文标题】在 R 中使用 XML2 解析大 XML【英文标题】:Parsing big XML with XML2 in R 【发布时间】:2022-01-06 04:22:44 【问题描述】:

我正在处理有关天气的大型 XML 文件,我需要以某种方式从所有节点获取信息。每个 XML 包含一个月,其中包含以 10 分钟为间隔的每一天。

XML 看起来像这样,但要长得多:

<?xml version= "1.0" encoding="ISO-8859-1" ?>
<mes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="G039_2003_1.xsd">
    <dia Dia="2003-1-01">
        <hora Hora="00:00">
            <Meteoros>
                <Cub.Vto._a_3050cm>0.59</Cub.Vto._a_3050cm>
                <Dir.Med._a_3050cm>215.0</Dir.Med._a_3050cm>
                <Humedad._a_3050cm>56.0</Humedad._a_3050cm>
                <Irradia.._a_800cm>2.0</Irradia.._a_800cm>
                <Precip.._a_174cm>0.0</Precip.._a_174cm>
                <Presión._a_60cm>800.1</Presión._a_60cm>
                <Sig.Dir._a_3050cm>15.0</Sig.Dir._a_3050cm>
                <Sig.Vel._a_3050cm>20.0</Sig.Vel._a_3050cm>
                <Tem.Sue._a_0cm>11.4</Tem.Sue._a_0cm>
                <Tem.Aire._a_164cm>14.5</Tem.Aire._a_164cm>
                <Vel.Max._a_3050cm>13.9</Vel.Max._a_3050cm>
                <Vel.Med._a_3050cm>7.9</Vel.Med._a_3050cm>
            </Meteoros>
        </hora>
        <hora Hora="00:10">
            <Meteoros>
                <Cub.Vto._a_3050cm>0.39</Cub.Vto._a_3050cm>
                <Dir.Med._a_3050cm>211.0</Dir.Med._a_3050cm>
                <Humedad._a_3050cm>58.0</Humedad._a_3050cm>
                <Irradia.._a_800cm>1.0</Irradia.._a_800cm>
                <Precip.._a_174cm>0.0</Precip.._a_174cm>
                <Presión._a_60cm>800.1</Presión._a_60cm>
                <Sig.Dir._a_3050cm>15.0</Sig.Dir._a_3050cm>
                <Sig.Vel._a_3050cm>18.0</Sig.Vel._a_3050cm>
                <Tem.Sue._a_0cm>11.0</Tem.Sue._a_0cm>
                <Tem.Aire._a_164cm>14.5</Tem.Aire._a_164cm>
                <Vel.Max._a_3050cm>12.2</Vel.Max._a_3050cm>
                <Vel.Med._a_3050cm>6.8</Vel.Med._a_3050cm>
            </Meteoros>

所以基本上我需要的是每次输出日期、时间和信息。

到目前为止我已经试过了:

library(XML)
library(xml2)
setwd()
Enero2003 <- read_xml("C039_2003/G039_2003_1.xml")

那,给出这个结果:

我需要一个循环来提供每个节点内的日期、时间和数据。 为此,我已经尝试过,但无法正常工作。

MonthDays <-length(xml_contents(Enero2003))
  for(i in 1:MonthDays) 
    xml_child(xml_child(xml_child(Enero2003, 1), 1), 1)

HourOfTheDay <- xml_attrs(xml_child(xml_child(Enero2003, 1), 1))[["Hora"]]

我将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

这应该让你开始......

library(xml2)
library(magrittr)
# read xml
doc <- xml2::read_xml(xml.text)
# get all  meteoros-nodes
nodes <- xml2::xml_find_all(doc, ".//Meteoros")
# get all possible childersn-names of the meteoros-nodes
cols <- xml_children(nodes) %>% xml2::xml_name() %>% unique()
# initialise matrix
p <- matrix(nrow = length(nodes), ncol = length(cols))
# fill matrix childnodes
for (i in 1:length(cols) ) 
  p[, i] <- xml2::xml_find_first(nodes, paste0( ".//", cols[i])) %>% xml2::xml_text()

colnames(p) <- cols
# get day + time info
q <- matrix(nrow = length(nodes), ncol = 2)
q[, 1] <- xml2::xml_find_first(nodes, "./ancestor::hora") %>% xml2::xml_attr("Hora")
q[, 2] <- xml2::xml_find_first(nodes, "./ancestor::dia") %>% xml2::xml_attr("Dia")
colnames(q) <- c("Hora", "Dia")
final <- as.data.frame(cbind(q, p))

【讨论】:

非常感谢您的回复。我希望它不会打扰你,但在这之后我需要别的东西。现在我需要在 2 个条件下稳定暴风雨: 1.- 每次开始和停止下雨,考虑下一次暴风雨应该超过 24 小时。 2.- 有用的是风暴应该有超过 1 毫米的水。非常感谢。

以上是关于在 R 中使用 XML2 解析大 XML的主要内容,如果未能解决你的问题,请参考以下文章

使用xml2解析xml

R使用XML2将数据从XML提取到数据帧中

Promisifying xml2js 解析函数(ES6 Promises)

从Angular 5更新到6后,我不断收到错误:无法解析xml2js中的计时器

XML的XmlPullParser解析

在 Node.js 中解析大型 XML 文件