Add an Attribute to an XML Element in Rust

October 2025

This is how I'm adding attributes to XML elements in Rust:

---
[dependencies]
anyhow = "1.0.100"
quick-xml = "0.38.3"
---

#![allow(unused)]
use anyhow::Result;
use quick_xml::events::attributes::Attribute;
use quick_xml::events::{BytesEnd, BytesStart, Event};
use quick_xml::reader::Reader;
use quick_xml::writer::Writer;
use std::io::Cursor;

fn main() -> Result<()> {
  let element = "el";
  let key = "alfa";
  let value = "bravo";
  let content = "<el></el>";
  let result = add_attr(element, key, value, content);
  println!("{}", result.unwrap());
  Ok(())
}

pub fn add_attr(element: &str, key: &str, value: &str, content: &str) -> Result<String> {
  let mut reader = Reader::from_str(&content);
  reader.config_mut().trim_text(true);
  let mut writer = Writer::new(Cursor::new(Vec::new()));

  loop {
    match reader.read_event() {
      Ok(Event::Eof) => break,
      Ok(Event::Start(mut e)) if e.name().as_ref() == element.as_bytes() => {
        let new_attr = Attribute::from((key, value));
        e.push_attribute(new_attr);
        assert!(writer.write_event(Event::Start(e)).is_ok());
      }
      Ok(e) => assert!(writer.write_event(e).is_ok()),
      Err(e) => panic!(
        "Error at position {}: {:?}",
        reader.error_position(),
        e
      ),
    }
  }

  let result = writer.into_inner().into_inner();
  let output = String::from_utf8_lossy(&result).to_string();
  Ok(output)
}
Output:
<el alfa="bravo"></el>
end of line