1

I want to use xml::reader::EventReader from xml_rs.

I need both the parsed events and their position in the XML file:

use xml::common::{Position, TextPosition};
use xml::reader::{EventReader};

fn main() {
    let s = "<?xml version=\"1.0\"\nencoding=\"UTF-8\"?>\n<ooo></ooo>\n";
    let xml = EventReader::new(s.as_bytes());
    for e in xml {
        println!("event: {:?}", e);
        println!("pos: {:?}", xml.position());
    }
}

But the compiler complains:

error[E0382]: borrow of moved value: `xml`
 --> src/main.rs:9:31
  |
6 |     let xml = EventReader::new(s.as_bytes());
  |         --- move occurs because `xml` has type `xml::reader::EventReader<&[u8]>`, which does not implement the `Copy` trait
7 |     for e in xml {
  |              ---
  |              |
  |              value moved here
  |              help: consider borrowing to avoid moving into the for loop: `&xml`
8 |         println!("event: {:?}", e);
9 |         println!("pos: {:?}", xml.position());
  |                               ^^^ value borrowed here after move

Without the second println! the code works.

[package]
name = "xmlproblem"
version = "0.1.0"
edition = "2018"

[dependencies]
xml-rs = "0.8"

How do I solve this?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
danatel
  • 4,844
  • 11
  • 48
  • 62

1 Answers1

0

The solution is to implement iteration directly:

use xml::common::{Position};
use xml::reader::{EventReader, XmlEvent};

fn main() {
    let s = "<?xml version=\"1.0\"\nencoding=\"UTF-8\"?>\n<ooo></ooo>\n";
    let mut xml = EventReader::new(s.as_bytes());
    loop {
        let e = xml.next();
        println!("event: {:?}", e);
        println!("pos: {:?}", xml.position());
        match e {
            Ok(XmlEvent::EndDocument) => {
                break;
            }
            _ => {}
        }
    }
}
danatel
  • 4,844
  • 11
  • 48
  • 62