@@ -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