8 releases

0.3.2 Nov 25, 2022
0.3.1 Oct 27, 2022
0.2.2 Jun 7, 2022
0.2.1 May 21, 2022
0.1.0 Mar 18, 2022

#13 in #xpath

50 downloads per month

MIT/Apache

78KB
1.5K SLoC

Rust-Etree

Rust-Etree on Travis CI

XML DOM library with XPath support.

Usage

Put this in your Cargo.toml:

[dependencies]
etree = "0.1"
use etree::*;
use std::path::Path;

fn create_xml<P:AsRef<Path>>(path:P) {
    let mut tree:ETree = ETree::from(ETreeNode::new("ROOT"));
    tree.set_encoding("UTF-8");
    tree.set_standalone("no");
    let root_pos = tree.root();

    // append first child
    let mut child1:ETreeNode = ETreeNode::new("CHILD-A");
    child1.set_attr("DEST", "CHN");
    let child1_pos = tree.append_child_node(root_pos, child1).unwrap();
    // append another child after first child
    let mut child2:ETreeNode = ETreeNode::new("CHILD-B");
    child2.set_text("Shanghail");
    tree.append_next_node(child1_pos, child2);
    // append another child before first child
    let mut child3:ETreeNode = ETreeNode::new("CHILD-C");
    child3.set_attr("DEST", "CHN");
    child3.set_text("Shanghail");
    tree.append_previous_node(child1_pos, child3);
    // append a child in the first child
    let mut child4:ETreeNode = ETreeNode::new("SUBCHILD-A");
    child4.set_text("EAST");
    let pos = tree.find("//CHILD-A").unwrap(); // after inserting child3, child1_pos becomes invaild
    tree.append_child_node(pos, child4);
    tree.pretty("\n  ");
    tree.write_file(path).ok();
}

fn modify_xml<P:AsRef<Path>>(path_in:P, path_out:P) {
    let mut tree = ETree::parse_file(path_in);
    let subtree_pos = tree.find("//CHILD-A").unwrap();
    let mut subtree = tree.subtree(subtree_pos);
    let subtree_child_pos = subtree.find("/SUBCHILD-A").unwrap();
    if let Some(node) = subtree.node_mut(subtree_child_pos) {
        node.set_text("WEST");
    }
    // tree.append_next_tree(subtree_pos, subtree.clone());
    let parent_pos = tree.parent(subtree_pos).unwrap();
    tree.append_child_tree(parent_pos, subtree);
    tree.write_file(path_out).ok();
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~4.5–6MB
~110K SLoC