我向服务器发送http GET请求并收到响应:

let resp = reqwest::blocking::get(req)?.text()?;

resp表示String,如下所示:

<?xml version=\"1.0\" encoding=\"UTF-8\">\n<Document xmlns=...
<datetime>202207102300</datetime>\n\t\t\t\t\t\t<value>320.08</value>\n\t\t\t\t\t<datetime>202207110000</datetime>\n\t\t\t\t\t\t<value>278.00</value>
...</Document>

将该文本解析为包含元组元素的向量的最佳方法如下:

let mut tuple_items: (chrono::DateTime, f32)

推荐答案

以下是我使用QuickXML机箱创建的代码:

use chrono::NaiveDateTime;
use quick_xml::events::Event;
use quick_xml::Reader;

pub struct DatetimeValue {
    pub dt: NaiveDateTime,
    pub val: f32,
}    

pub fn parse_xml_string(&self, xml_string: String) -> Vec<DatetimeValue> {
    let mut response_vector: Vec<DatetimeValue> = vec![];
    let mut reader = Reader::from_str(&xml_string[..]);
    reader.trim_text(true);
    let mut val_flag = false;
    let mut dt_flag = false;
    let mut buf = Vec::new();
    let mut count = 0;
    let mut actual_dt: NaiveDateTime;
    loop {
        match reader.read_event(&mut buf) {
            Ok(Event::Start(ref e)) => {
                if let b"value" = e.name() { val_flag = true }
                else if let b"datetime" = e.name() { dt_flag = true }
            }
            Ok(Event::Text(e)) => {
                if dt_flag {
                    actual_dt = NaiveDateTime::parse_from_str(e
                            .unescape_and_decode(&reader)
                            .unwrap(), "%Y%m%d%H%M").unwrap();
                    dt_flag = false;
                }
                else if val_flag {
                    response_vector.push(DatetimeValue {
                        dt: actual_dt,
                        val: e
                            .unescape_and_decode(&reader)
                            .unwrap()
                            .parse::<f32>()
                            .unwrap(),
                    });
                    val_flag = false;
                }
            }
            Ok(Event::Eof) => break,
            Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e),
            _ => (),
        }
        buf.clear();
    }
    response_vector
}

Rust相关问答推荐

重新导出proc宏导致未解决的extern crate错误""

泛型属性比较

使用Rust s serde_json对混合数据类型进行优化'

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

使用极点数据帧时,找不到枚举结果的方法lazy()

有没有可能让泛型Rust T总是堆分配的?

在文件链实施中绕过borrow 判断器

Rust proc_macro 和 syn:解析空格

随机函数不返回随机值

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

Nom 解析器无法消耗无效输入

Rust 异步循环函数阻塞了其他future 任务的执行

缺失serde的字段无法设置为默认值

Rust 程序中的内存泄漏

为什么要这样编译?

Rust 中的let是做什么的?

在 RefCell 上borrow

通用函数中的生命周期扣除和borrow (通用测试需要)

如何将 while 循环内的用户输入添加到 Rust 中的向量?