Skip to content

Commit e19edc0

Browse files
authored
feat: KmlDocument's version and attributes handling (#75)
1 parent 8d8fb78 commit e19edc0

File tree

1 file changed

+92
-4
lines changed

1 file changed

+92
-4
lines changed

src/reader.rs

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ where
126126
Event::Start(ref mut e) => {
127127
let attrs = Self::read_attrs(e.attributes());
128128
match e.local_name().as_ref() {
129-
b"kml" => elements.push(Kml::KmlDocument(self.read_kml_document()?)),
129+
b"kml" => elements.push(Kml::KmlDocument(self.read_kml_document(attrs)?)),
130130
b"Scale" => elements.push(Kml::Scale(self.read_scale(attrs)?)),
131131
b"Orientation" => {
132132
elements.push(Kml::Orientation(self.read_orientation(attrs)?))
@@ -200,11 +200,18 @@ where
200200
Ok(elements)
201201
}
202202

203-
fn read_kml_document(&mut self) -> Result<KmlDocument<T>, Error> {
204-
// TODO: Should parse version, change version based on NS
203+
fn read_kml_document(
204+
&mut self,
205+
attrs: HashMap<String, String>,
206+
) -> Result<KmlDocument<T>, Error> {
207+
let version = match attrs.get("xmlns").or_else(|| attrs.get("xmlns:kml")) {
208+
Some(xmlns) => KmlVersion::from_str(xmlns).unwrap_or_default(),
209+
None => KmlVersion::default(),
210+
};
205211
Ok(KmlDocument {
212+
version,
213+
attrs,
206214
elements: self.read_elements()?,
207-
..Default::default()
208215
})
209216
}
210217

@@ -1690,6 +1697,87 @@ mod tests {
16901697
}))
16911698
}
16921699

1700+
#[test]
1701+
fn test_parse_kml_document_version() {
1702+
let xmlns = "xmlns".to_string();
1703+
let xmlns_kml = "xmlns:kml".to_string();
1704+
let xmlns_v2_2 = "http://www.opengis.net/kml/2.2".to_string();
1705+
let xmlns_v2_3 = "http://www.opengis.net/kml/2.3".to_string();
1706+
let kml_str_v2_2 = format!(
1707+
r#"
1708+
<?xml version="1.0" encoding="UTF-8"?>
1709+
<kml {xmlns}="{xmlns_v2_2}">
1710+
</kml>
1711+
"#
1712+
);
1713+
let kml_str_v2_3 = format!(
1714+
r#"
1715+
<?xml version="1.0" encoding="UTF-8"?>
1716+
<kml {xmlns}="{xmlns_v2_3}">
1717+
</kml>
1718+
"#
1719+
);
1720+
let kml_str_v2_2_xmlns_kml = format!(
1721+
r#"
1722+
<?xml version="1.0" encoding="UTF-8"?>
1723+
<kml {xmlns_kml}="{xmlns_v2_2}">
1724+
</kml>
1725+
"#
1726+
);
1727+
let kml_str_v2_3_xmlns_kml = format!(
1728+
r#"
1729+
<?xml version="1.0" encoding="UTF-8"?>
1730+
<kml {xmlns_kml}="{xmlns_v2_3}">
1731+
</kml>
1732+
"#
1733+
);
1734+
let kml_str_v_unknown = r#"
1735+
<?xml version="1.0" encoding="UTF-8"?>
1736+
<kml>
1737+
</kml>
1738+
"#;
1739+
1740+
assert_eq!(
1741+
Kml::<f64>::from_str(&kml_str_v2_2).unwrap(),
1742+
Kml::KmlDocument(KmlDocument {
1743+
version: KmlVersion::V22,
1744+
attrs: HashMap::from([(xmlns.clone(), xmlns_v2_2.clone())]),
1745+
..Default::default()
1746+
})
1747+
);
1748+
assert_eq!(
1749+
Kml::<f64>::from_str(&kml_str_v2_3).unwrap(),
1750+
Kml::KmlDocument(KmlDocument {
1751+
version: KmlVersion::V23,
1752+
attrs: HashMap::from([(xmlns, xmlns_v2_3.clone())]),
1753+
..Default::default()
1754+
})
1755+
);
1756+
assert_eq!(
1757+
Kml::<f64>::from_str(&kml_str_v2_2_xmlns_kml).unwrap(),
1758+
Kml::KmlDocument(KmlDocument {
1759+
version: KmlVersion::V22,
1760+
attrs: HashMap::from([(xmlns_kml.clone(), xmlns_v2_2)]),
1761+
..Default::default()
1762+
})
1763+
);
1764+
assert_eq!(
1765+
Kml::<f64>::from_str(&kml_str_v2_3_xmlns_kml).unwrap(),
1766+
Kml::KmlDocument(KmlDocument {
1767+
version: KmlVersion::V23,
1768+
attrs: HashMap::from([(xmlns_kml, xmlns_v2_3)]),
1769+
..Default::default()
1770+
})
1771+
);
1772+
assert_eq!(
1773+
Kml::<f64>::from_str(kml_str_v_unknown).unwrap(),
1774+
Kml::KmlDocument(KmlDocument {
1775+
version: KmlVersion::Unknown,
1776+
..Default::default()
1777+
})
1778+
);
1779+
}
1780+
16931781
#[test]
16941782
fn test_read_str_lossy() {
16951783
let kml_str = r#"

0 commit comments

Comments
 (0)