From b58fccd5fc1ff4f5bceebb392d2277245a884628 Mon Sep 17 00:00:00 2001 From: NikBel3476 Date: Sun, 15 Feb 2026 00:44:38 +0400 Subject: [PATCH 1/3] feat: handle kml document version and attributes --- src/reader.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index d545ff3..9ccc6df 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -126,7 +126,7 @@ where Event::Start(ref mut e) => { let attrs = Self::read_attrs(e.attributes()); match e.local_name().as_ref() { - b"kml" => elements.push(Kml::KmlDocument(self.read_kml_document()?)), + b"kml" => elements.push(Kml::KmlDocument(self.read_kml_document(attrs)?)), b"Scale" => elements.push(Kml::Scale(self.read_scale(attrs)?)), b"Orientation" => { elements.push(Kml::Orientation(self.read_orientation(attrs)?)) @@ -200,11 +200,15 @@ where Ok(elements) } - fn read_kml_document(&mut self) -> Result, Error> { - // TODO: Should parse version, change version based on NS + fn read_kml_document(&mut self, attrs: HashMap) -> Result, Error> { + let version = match attrs.get("xmlns").or_else(|| attrs.get("xmlns:kml")) { + Some(xmlns) => KmlVersion::from_str(xmlns).unwrap_or_default(), + None => KmlVersion::default() + }; Ok(KmlDocument { - elements: self.read_elements()?, - ..Default::default() + version, + attrs, + elements: self.read_elements()? }) } From 0c8f9a159a3477fcead9470a893b7dcba56211f0 Mon Sep 17 00:00:00 2001 From: NikBel3476 Date: Sun, 15 Feb 2026 10:33:51 +0400 Subject: [PATCH 2/3] chore: formatting --- src/reader.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/reader.rs b/src/reader.rs index 9ccc6df..55f5392 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -200,15 +200,18 @@ where Ok(elements) } - fn read_kml_document(&mut self, attrs: HashMap) -> Result, Error> { + fn read_kml_document( + &mut self, + attrs: HashMap, + ) -> Result, Error> { let version = match attrs.get("xmlns").or_else(|| attrs.get("xmlns:kml")) { Some(xmlns) => KmlVersion::from_str(xmlns).unwrap_or_default(), - None => KmlVersion::default() + None => KmlVersion::default(), }; Ok(KmlDocument { version, attrs, - elements: self.read_elements()? + elements: self.read_elements()?, }) } From b33fd8ec7d3346ae2ed1714985c9165eac9b4903 Mon Sep 17 00:00:00 2001 From: NikBel3476 Date: Tue, 17 Feb 2026 09:26:26 +0400 Subject: [PATCH 3/3] tests: add kml document version parse test --- src/reader.rs | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/src/reader.rs b/src/reader.rs index 55f5392..72a1c1f 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1697,6 +1697,87 @@ mod tests { })) } + #[test] + fn test_parse_kml_document_version() { + let xmlns = "xmlns".to_string(); + let xmlns_kml = "xmlns:kml".to_string(); + let xmlns_v2_2 = "http://www.opengis.net/kml/2.2".to_string(); + let xmlns_v2_3 = "http://www.opengis.net/kml/2.3".to_string(); + let kml_str_v2_2 = format!( + r#" + + + + "# + ); + let kml_str_v2_3 = format!( + r#" + + + + "# + ); + let kml_str_v2_2_xmlns_kml = format!( + r#" + + + + "# + ); + let kml_str_v2_3_xmlns_kml = format!( + r#" + + + + "# + ); + let kml_str_v_unknown = r#" + + + + "#; + + assert_eq!( + Kml::::from_str(&kml_str_v2_2).unwrap(), + Kml::KmlDocument(KmlDocument { + version: KmlVersion::V22, + attrs: HashMap::from([(xmlns.clone(), xmlns_v2_2.clone())]), + ..Default::default() + }) + ); + assert_eq!( + Kml::::from_str(&kml_str_v2_3).unwrap(), + Kml::KmlDocument(KmlDocument { + version: KmlVersion::V23, + attrs: HashMap::from([(xmlns, xmlns_v2_3.clone())]), + ..Default::default() + }) + ); + assert_eq!( + Kml::::from_str(&kml_str_v2_2_xmlns_kml).unwrap(), + Kml::KmlDocument(KmlDocument { + version: KmlVersion::V22, + attrs: HashMap::from([(xmlns_kml.clone(), xmlns_v2_2)]), + ..Default::default() + }) + ); + assert_eq!( + Kml::::from_str(&kml_str_v2_3_xmlns_kml).unwrap(), + Kml::KmlDocument(KmlDocument { + version: KmlVersion::V23, + attrs: HashMap::from([(xmlns_kml, xmlns_v2_3)]), + ..Default::default() + }) + ); + assert_eq!( + Kml::::from_str(kml_str_v_unknown).unwrap(), + Kml::KmlDocument(KmlDocument { + version: KmlVersion::Unknown, + ..Default::default() + }) + ); + } + #[test] fn test_read_str_lossy() { let kml_str = r#"