Struct Element

Source
pub struct Element { /* private fields */ }
Expand description

Represents an XML element. It acts as a pointer to actual element data stored in Document.

This struct only contains a unique usize id and implements trait Copy. So you do not need to bother with having a reference.

Because the actual data of the element is stored in Document, most methods takes &Document or &mut Document as its first argument.

Note that an element may only interact with elements of the same document, but the crate doesn’t know which document an element is from. Trying to push an element from a different Document may result in unexpected errors.

§Examples

Find children nodes with attribute

use xml_doc::{Document, Element};

let doc = Document::parse_str(r#"<?xml version="1.0"?>
<data>
  <item class="value">a</item>
  <item class="value">b</item>
  <item></item>
</data>
"#).unwrap();

let data = doc.root_element().unwrap();
let value_items: Vec<Element> = data.children(&doc)
    .iter()
    .filter_map(|node| node.as_element())
    .filter(|elem| elem.attribute(&doc, "class") == Some("value"))
    .collect();

Implementations§

Source§

impl Element

Source

pub fn new<S: Into<String>>(doc: &mut Document, full_name: S) -> Self

Create a new empty element with full_name.

If full_name contains :, everything before that will be interpreted as a namespace prefix.

Source

pub fn build<S: Into<String>>(doc: &mut Document, name: S) -> ElementBuilder<'_>

Chain methods to build an element easily. The chain can be finished with .finish() or .push_to(parent).

§Example
use xml_doc::{Document, Element, Node};

let mut doc = Document::new();

let elem = Element::build(&mut doc, "root")
    .attribute("id", "main")
    .attribute("class", "main")
    .finish();

doc.push_root_node(elem.as_node());
Source

pub fn is_container(&self) -> bool

Returns true if element is a container.

See Document::container() for more information on ‘container’.

Source

pub fn as_node(&self) -> Node

Equivalent to Node::Element(self)

Source

pub fn separate_prefix_name(full_name: &str) -> (&str, &str)

Seperate full_name by :, returning (prefix, name).

The first str is "" if full_name has no prefix.

Source§

impl Element

Below are methods that take &Document as its first argument.

Source

pub fn is_root(&self, doc: &Document) -> bool

Returns true if this element is the root node of document.

Note that this crate allows Document to have multiple elements, even though it’s not valid xml.

Source

pub fn full_name<'a>(&self, doc: &'a Document) -> &'a str

Get full name of element, including its namespace prefix. Use Element::name() to get its name without the prefix.

Source

pub fn set_full_name<S: Into<String>>(&self, doc: &mut Document, name: S)

Source

pub fn prefix_name<'a>(&self, doc: &'a Document) -> (&'a str, &'a str)

Get prefix and name of element. If it doesn’t have prefix, will return an empty string.

<prefix: name -> ("prefix", "name")

Source

pub fn prefix<'a>(&self, doc: &'a Document) -> &'a str

Get namespace prefix of element, without name.

<prefix:name> -> "prefix"

Source

pub fn set_prefix<S: Into<String>>(&self, doc: &mut Document, prefix: S)

Set prefix of element, preserving its name.

prefix should not have a :, or everything after : will be interpreted as part of element name.

If prefix is an empty string, removes prefix.

Source

pub fn name<'a>(&self, doc: &'a Document) -> &'a str

Get name of element, without its namespace prefix. Use Element::full_name() to get its full name with prefix.

<prefix:name> -> "name"

Source

pub fn set_name<S: Into<String>>(&self, doc: &mut Document, name: S)

Set name of element, preserving its prefix.

name should not have a :, or everything before : may be interpreted as namespace prefix.

Source

pub fn attributes<'a>(&self, doc: &'a Document) -> &'a HashMap<String, String>

Get attributes of element.

The attribute names may have namespace prefix. To strip the prefix and only its name, call Element::separate_prefix_name.

use xml_doc::{Document, Element};

let mut doc = Document::new();
let element = Element::build(&mut doc, "name")
    .attribute("id", "name")
    .attribute("pre:name", "value")
    .finish();

let attrs = element.attributes(&doc);
for (full_name, value) in attrs {
    let (prefix, name) = Element::separate_prefix_name(full_name);
    // ("", "id"), ("pre", "name")
}
Source

pub fn attribute<'a>(&self, doc: &'a Document, name: &str) -> Option<&'a str>

Get attribute value of an element by its full name. (Namespace prefix isn’t stripped)

Source

pub fn set_attribute<S, T>(&self, doc: &mut Document, name: S, value: T)
where S: Into<String>, T: Into<String>,

Add or set attribute.

If name contains a :, everything before : will be interpreted as namespace prefix.

Source

pub fn mut_attributes<'a>( &self, doc: &'a mut Document, ) -> &'a mut HashMap<String, String>

Source

pub fn namespace<'a>(&self, doc: &'a Document) -> Option<&'a str>

Gets the namespace of this element.

Shorthand for self.namespace_for_prefix(doc, self.prefix(doc)).

Source

pub fn namespace_decls<'a>( &self, doc: &'a Document, ) -> &'a HashMap<String, String>

Gets HashMap of xmlns:prefix=namespace declared in this element’s attributes.

Default namespace has empty string as key.

Source

pub fn mut_namespace_decls<'a>( &self, doc: &'a mut Document, ) -> &'a mut HashMap<String, String>

Source

pub fn set_namespace_decl<S, T>( &self, doc: &mut Document, prefix: S, namespace: T, )
where S: Into<String>, T: Into<String>,

Source

pub fn namespace_for_prefix<'a>( &self, doc: &'a Document, prefix: &str, ) -> Option<&'a str>

Get namespace value given prefix, for this element. “xml” and “xmlns” returns its default namespace.

Source

pub fn text_content(&self, doc: &Document) -> String

Concatenate all text content of this element, including its child elements text_content().

Implementation of Node.textContent

Source

pub fn set_text_content<S: Into<String>>(&self, doc: &mut Document, text: S)

Clears all its children and inserts a Node::Text with given text.

Source§

impl Element

Below are methods related to finding nodes in tree.

Source

pub fn parent(&self, doc: &Document) -> Option<Element>

Source

pub fn has_parent(&self, doc: &Document) -> bool

self.parent(doc).is_some()

Source

pub fn children<'a>(&self, doc: &'a Document) -> &'a Vec<Node>

Get child Nodes of this element.

Source

pub fn children_recursive<'a>(&self, doc: &'a Document) -> Vec<&'a Node>

Get all child nodes recursively. (i.e. includes its children’s children.)

Source

pub fn has_children(&self, doc: &Document) -> bool

!self.children(doc).is_empty()

Source

pub fn child_elements(&self, doc: &Document) -> Vec<Element>

Get only child Elements of this element.

This calls .children().iter().filter_map().collect(). Use Element::children() if performance is important.

Source

pub fn child_elements_recursive(&self, doc: &Document) -> Vec<Element>

Get child Elements recursively. (i.e. includes its child element’s child elements)

Source

pub fn find(&self, doc: &Document, name: &str) -> Option<Element>

Find first direct child element with name name.

Source

pub fn find_all(&self, doc: &Document, name: &str) -> Vec<Element>

Find all direct child element with name name.

Source§

impl Element

Below are functions that modify its tree-structure.

Because an element has reference to both its parent and its children, an element’s parent and children is not directly exposed for modification. But in return, it is not possible for a document to be in an inconsistant state, where an element’s parent doesn’t have the element as its children.

Source

pub fn push_child(&self, doc: &mut Document, node: Node) -> Result<()>

Equivalent to vec.push().

§Errors
  • Error::HasAParent: When you want to replace an element’s parent with another, call element.detatch() to make it parentless first. This is to make it explicit that you are changing an element’s parent, not adding another.
  • Error::ContainerCannotMove: The container element’s parent must always be None.
Source

pub fn push_to(&self, doc: &mut Document, parent: Element) -> Result<()>

Equivalent to parent.push_child().

§Errors
  • Error::HasAParent: When you want to replace an element’s parent with another, call element.detatch() to make it parentless first. This is to make it explicit that you are changing an element’s parent, not adding another.
  • Error::ContainerCannotMove: The container element’s parent must always be None.
Source

pub fn insert_child( &self, doc: &mut Document, index: usize, node: Node, ) -> Result<()>

Equivalent to vec.insert().

§Panics

Panics if index > self.children().len()

§Errors
  • Error::HasAParent: When you want to replace an element’s parent with another, call element.detatch() to make it parentless first. This is to make it explicit that you are changing an element’s parent, not adding another.
  • Error::ContainerCannotMove: The container element’s parent must always be None.
Source

pub fn remove_child(&self, doc: &mut Document, index: usize) -> Node

Equivalent to vec.remove().

§Panics

Panics if index >= self.children().len().

Source

pub fn pop_child(&self, doc: &mut Document) -> Option<Node>

Equivalent to vec.pop().

Source

pub fn clear_children(&self, doc: &mut Document) -> Vec<Node>

Remove all children and return them.

Source

pub fn detatch(&self, doc: &mut Document) -> Result<()>

Removes itself from its parent. Note that you can’t attach this element to other documents.

§Errors

Trait Implementations§

Source§

impl Clone for Element

Source§

fn clone(&self) -> Element

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Element

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Element

Source§

fn eq(&self, other: &Element) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for Element

Source§

impl Eq for Element

Source§

impl StructuralPartialEq for Element

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.