V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
plko345
V2EX  ›  Rust

请教一个读取修改 xml 文件的问题

  •  
  •   plko345 · 2022-01-19 22:54:53 +08:00 · 1737 次点击
    这是一个创建于 1073 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要读取一个 xml 文件, 并打算修改其中的内容, 再将修改后的内容 http post 到一个服务上.

    使用的是 xml-rs

    fn generate_job_config_xml(git_remote_url: &str, job_config_xml_file_path: &str) -> Result<String, Box<dyn std::error::Error>> {
        let job_config_xml_file: File = fs::File::open(job_config_xml_file_path).unwrap();
        let job_config_xml_file: BufReader<File> = BufReader::new(job_config_xml_file);
        let job_config_xml_parser: EventReader<BufReader<File>> = xml::reader::EventReader::new(job_config_xml_file);
        /*
        	之后我不知道该怎么处理这个变量, 修改其中的某个 `XmlEvent` 的值,
            然后将修改后的内容转成字符串
        */
        for e in job_config_xml_parser {
            // println!("XmlEvent 值为: {:?}", e.unwrap());
            match e {
            	Ok(XmlEvent::Characters(t)) => {
                    match t {
                    	"[email protected]:xx/xx.git".to_string() => {
                        	// 修改 job_config_xml_parser 变量中这个地方的值为 [email protected]:yy/yy.git
                        }
                    }
                }
                // 其它的不管
            }
        }
        Ok("sth".to_string())
    }
    

    我应该怎么处理这个情况? 麻烦给个提示.

    现在我尝试使用其它的库, 比如 minidom, 不知道是否有自带的修改方法, 正在研究文档中.

    初学 rust, 请勿见笑😅

    1 条回复    2022-01-29 11:08:20 +08:00
    krcalc
        1
    krcalc  
       2022-01-29 11:08:20 +08:00   ❤️ 1
    同新手,是我的话可能会用 quick-xml 和 serde
    ```rust
    // serde = { version = "1.0", features = [ "derive" ] }
    // quick-xml = { version = "0.22", features = [ "serialize" ] }
    use std::fs;
    use serde::{Serialize,Deserialize};
    use quick_xml::de::from_str;
    use quick_xml::se::to_string;


    #[derive(Serialize,Deserialize)]
    #[serde(rename = "this_tag")]
    struct Thistag {
    k1: Option<String>,
    k2: Option<String>,
    child: String,
    atag: String
    }


    fn main() {
    //let s = fs::read_to_string("test.xml").unwrap();
    let s = r#"<this_tag k1="v1" k2="v2">
    <child>
    text
    </child>
    <atag>123123</atag>
    </this_tag>"#;
    let mut data: Thistag = from_str(&s).unwrap();
    data.atag = String::from("abc");
    let newxml =to_string(&data).unwrap();
    println!("{}",newxml);
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2847 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:59 · PVG 16:59 · LAX 00:59 · JFK 03:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.