put Attribute into its own module, take into account prefixes when determining namespaces
This commit is contained in:
parent
8663a14040
commit
2d97e2d5d9
2 changed files with 40 additions and 23 deletions
24
src/attribute.rs
Normal file
24
src/attribute.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
use xml::escape::escape_str_attribute;
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub struct Attribute {
|
||||||
|
pub name: String,
|
||||||
|
pub value: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Attribute {
|
||||||
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(fmt, "{}=\"{}\"", self.name, escape_str_attribute(&self.value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Attribute {
|
||||||
|
pub fn new<N: Into<String>, V: Into<String>>(name: N, value: V) -> Attribute {
|
||||||
|
Attribute {
|
||||||
|
name: name.into(),
|
||||||
|
value: value.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
39
src/lib.rs
39
src/lib.rs
|
@ -1,6 +1,7 @@
|
||||||
extern crate xml;
|
extern crate xml;
|
||||||
|
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
pub mod attribute;
|
||||||
|
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
|
|
||||||
|
@ -15,31 +16,11 @@ use std::fmt;
|
||||||
use xml::reader::{XmlEvent as ReaderEvent, EventReader};
|
use xml::reader::{XmlEvent as ReaderEvent, EventReader};
|
||||||
use xml::writer::{XmlEvent as WriterEvent, EventWriter};
|
use xml::writer::{XmlEvent as WriterEvent, EventWriter};
|
||||||
use xml::name::Name;
|
use xml::name::Name;
|
||||||
use xml::escape::escape_str_attribute;
|
|
||||||
use xml::namespace::NS_NO_PREFIX;
|
use xml::namespace::NS_NO_PREFIX;
|
||||||
|
|
||||||
use error::Error;
|
use error::Error;
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
use attribute::Attribute;
|
||||||
pub struct Attribute {
|
|
||||||
pub name: String,
|
|
||||||
pub value: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Attribute {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
write!(fmt, "{}=\"{}\"", self.name, escape_str_attribute(&self.value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Attribute {
|
|
||||||
pub fn new<N: Into<String>, V: Into<String>>(name: N, value: V) -> Attribute {
|
|
||||||
Attribute {
|
|
||||||
name: name.into(),
|
|
||||||
value: value.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq)]
|
#[derive(Clone, PartialEq, Eq)]
|
||||||
pub struct Element {
|
pub struct Element {
|
||||||
|
@ -131,7 +112,13 @@ impl Element {
|
||||||
let attributes = attributes.into_iter()
|
let attributes = attributes.into_iter()
|
||||||
.map(|o| Attribute::new(o.name.local_name, o.value))
|
.map(|o| Attribute::new(o.name.local_name, o.value))
|
||||||
.collect();
|
.collect();
|
||||||
let mut root = Element::new(name.local_name, namespace.get(NS_NO_PREFIX).map(|s| s.to_owned()), attributes);
|
let ns = if let Some(ref prefix) = name.prefix {
|
||||||
|
namespace.get(prefix)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
namespace.get(NS_NO_PREFIX)
|
||||||
|
}.map(|s| s.to_owned());
|
||||||
|
let mut root = Element::new(name.local_name, ns, attributes);
|
||||||
root.from_reader_inner(reader);
|
root.from_reader_inner(reader);
|
||||||
return Ok(root);
|
return Ok(root);
|
||||||
},
|
},
|
||||||
|
@ -151,7 +138,13 @@ impl Element {
|
||||||
let attributes = attributes.into_iter()
|
let attributes = attributes.into_iter()
|
||||||
.map(|o| Attribute::new(o.name.local_name, o.value))
|
.map(|o| Attribute::new(o.name.local_name, o.value))
|
||||||
.collect();
|
.collect();
|
||||||
let elem = Element::new(name.local_name, namespace.get(NS_NO_PREFIX).map(|s| s.to_owned()), attributes);
|
let ns = if let Some(ref prefix) = name.prefix {
|
||||||
|
namespace.get(prefix)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
namespace.get(NS_NO_PREFIX)
|
||||||
|
}.map(|s| s.to_owned());
|
||||||
|
let elem = Element::new(name.local_name, ns, attributes);
|
||||||
let elem_ref = self.append_child(elem);
|
let elem_ref = self.append_child(elem);
|
||||||
elem_ref.from_reader_inner(reader);
|
elem_ref.from_reader_inner(reader);
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue