Skip to main content

ooxml_sml/
generated_parsers.rs

1// Event-based parsers for generated types.
2// ~3x faster than serde-based deserialization.
3
4#![allow(unused_variables)]
5#![allow(unused_imports)]
6#![allow(clippy::single_match)]
7#![allow(clippy::match_single_binding)]
8#![allow(clippy::manual_is_multiple_of)]
9
10use super::generated::*;
11pub use ooxml_xml::{FromXml, ParseError};
12#[cfg(feature = "extra-children")]
13use ooxml_xml::{PositionedNode, RawXmlElement, RawXmlNode};
14use quick_xml::Reader;
15use quick_xml::events::{BytesStart, Event};
16use std::io::BufRead;
17
18#[allow(dead_code)]
19/// Skip an element and all its children.
20fn skip_element<R: BufRead>(reader: &mut Reader<R>) -> Result<(), ParseError> {
21    let mut depth = 1u32;
22    let mut buf = Vec::new();
23    loop {
24        match reader.read_event_into(&mut buf)? {
25            Event::Start(_) => depth += 1,
26            Event::End(_) => {
27                depth -= 1;
28                if depth == 0 {
29                    break;
30                }
31            }
32            Event::Eof => break,
33            _ => {}
34        }
35        buf.clear();
36    }
37    Ok(())
38}
39
40#[allow(dead_code)]
41/// Read the text content of an element until its end tag.
42fn read_text_content<R: BufRead>(reader: &mut Reader<R>) -> Result<String, ParseError> {
43    let mut text = String::new();
44    let mut buf = Vec::new();
45    loop {
46        match reader.read_event_into(&mut buf)? {
47            Event::Text(e) => text.push_str(&e.decode().unwrap_or_default()),
48            Event::CData(e) => text.push_str(&e.decode().unwrap_or_default()),
49            Event::GeneralRef(e) => {
50                let name = e.decode().unwrap_or_default();
51                if let Some(s) = quick_xml::escape::resolve_xml_entity(&name) {
52                    text.push_str(s);
53                }
54            }
55            Event::End(_) => break,
56            Event::Eof => break,
57            _ => {}
58        }
59        buf.clear();
60    }
61    Ok(text)
62}
63
64#[allow(dead_code)]
65/// Decode a hex string to bytes.
66fn decode_hex(s: &str) -> Option<Vec<u8>> {
67    let s = s.trim();
68    if s.len() % 2 != 0 {
69        return None;
70    }
71    (0..s.len())
72        .step_by(2)
73        .map(|i| u8::from_str_radix(&s[i..i + 2], 16).ok())
74        .collect()
75}
76
77#[allow(dead_code)]
78/// Decode a base64 string to bytes.
79fn decode_base64(s: &str) -> Option<Vec<u8>> {
80    use base64::Engine;
81    base64::engine::general_purpose::STANDARD
82        .decode(s.trim())
83        .ok()
84}
85
86impl FromXml for AutoFilter {
87    fn from_xml<R: BufRead>(
88        reader: &mut Reader<R>,
89        start_tag: &BytesStart,
90        is_empty: bool,
91    ) -> Result<Self, ParseError> {
92        #[cfg(feature = "sml-filtering")]
93        let mut f_reference = None;
94        #[cfg(feature = "sml-filtering")]
95        let mut f_filter_column = Vec::new();
96        #[cfg(feature = "sml-filtering")]
97        let mut f_sort_state = None;
98        #[cfg(feature = "sml-extensions")]
99        let mut f_extension_list = None;
100        #[cfg(feature = "extra-attrs")]
101        let mut extra_attrs = std::collections::HashMap::new();
102        #[cfg(feature = "extra-children")]
103        let mut extra_children = Vec::new();
104        #[cfg(feature = "extra-children")]
105        let mut child_idx: usize = 0;
106
107        // Parse attributes
108        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
109            let val = String::from_utf8_lossy(&attr.value);
110            match attr.key.local_name().as_ref() {
111                #[cfg(feature = "sml-filtering")]
112                b"ref" => {
113                    f_reference = Some(val.into_owned());
114                }
115                #[cfg(feature = "extra-attrs")]
116                unknown => {
117                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
118                    extra_attrs.insert(key, val.into_owned());
119                }
120                #[cfg(not(feature = "extra-attrs"))]
121                _ => {}
122            }
123        }
124
125        // Parse child elements
126        if !is_empty {
127            let mut buf = Vec::new();
128            loop {
129                match reader.read_event_into(&mut buf)? {
130                    Event::Start(e) => {
131                        match e.local_name().as_ref() {
132                            #[cfg(feature = "sml-filtering")]
133                            b"filterColumn" => {
134                                f_filter_column.push(FilterColumn::from_xml(reader, &e, false)?);
135                                #[cfg(feature = "extra-children")]
136                                {
137                                    child_idx += 1;
138                                }
139                            }
140                            #[cfg(feature = "sml-filtering")]
141                            b"sortState" => {
142                                f_sort_state =
143                                    Some(Box::new(SortState::from_xml(reader, &e, false)?));
144                                #[cfg(feature = "extra-children")]
145                                {
146                                    child_idx += 1;
147                                }
148                            }
149                            #[cfg(feature = "sml-extensions")]
150                            b"extLst" => {
151                                f_extension_list =
152                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
153                                #[cfg(feature = "extra-children")]
154                                {
155                                    child_idx += 1;
156                                }
157                            }
158                            #[cfg(feature = "extra-children")]
159                            _ => {
160                                // Capture unknown element for roundtrip
161                                let elem = RawXmlElement::from_reader(reader, &e)?;
162                                extra_children.push(PositionedNode::new(
163                                    child_idx,
164                                    RawXmlNode::Element(elem),
165                                ));
166                                child_idx += 1;
167                            }
168                            #[cfg(not(feature = "extra-children"))]
169                            _ => {
170                                // Skip unknown element
171                                skip_element(reader)?;
172                            }
173                        }
174                    }
175                    Event::Empty(e) => {
176                        match e.local_name().as_ref() {
177                            #[cfg(feature = "sml-filtering")]
178                            b"filterColumn" => {
179                                f_filter_column.push(FilterColumn::from_xml(reader, &e, true)?);
180                                #[cfg(feature = "extra-children")]
181                                {
182                                    child_idx += 1;
183                                }
184                            }
185                            #[cfg(feature = "sml-filtering")]
186                            b"sortState" => {
187                                f_sort_state =
188                                    Some(Box::new(SortState::from_xml(reader, &e, true)?));
189                                #[cfg(feature = "extra-children")]
190                                {
191                                    child_idx += 1;
192                                }
193                            }
194                            #[cfg(feature = "sml-extensions")]
195                            b"extLst" => {
196                                f_extension_list =
197                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
198                                #[cfg(feature = "extra-children")]
199                                {
200                                    child_idx += 1;
201                                }
202                            }
203                            #[cfg(feature = "extra-children")]
204                            _ => {
205                                // Capture unknown empty element for roundtrip
206                                let elem = RawXmlElement::from_empty(&e);
207                                extra_children.push(PositionedNode::new(
208                                    child_idx,
209                                    RawXmlNode::Element(elem),
210                                ));
211                                child_idx += 1;
212                            }
213                            #[cfg(not(feature = "extra-children"))]
214                            _ => {}
215                        }
216                    }
217                    Event::End(_) => break,
218                    Event::Eof => break,
219                    _ => {}
220                }
221                buf.clear();
222            }
223        }
224
225        Ok(Self {
226            #[cfg(feature = "sml-filtering")]
227            reference: f_reference,
228            #[cfg(feature = "sml-filtering")]
229            filter_column: f_filter_column,
230            #[cfg(feature = "sml-filtering")]
231            sort_state: f_sort_state,
232            #[cfg(feature = "sml-extensions")]
233            extension_list: f_extension_list,
234            #[cfg(feature = "extra-attrs")]
235            extra_attrs,
236            #[cfg(feature = "extra-children")]
237            extra_children,
238        })
239    }
240}
241
242impl FromXml for FilterColumn {
243    fn from_xml<R: BufRead>(
244        reader: &mut Reader<R>,
245        start_tag: &BytesStart,
246        is_empty: bool,
247    ) -> Result<Self, ParseError> {
248        #[cfg(feature = "sml-filtering")]
249        let mut f_column_id: Option<u32> = None;
250        #[cfg(feature = "sml-filtering")]
251        let mut f_hidden_button = None;
252        #[cfg(feature = "sml-filtering")]
253        let mut f_show_button = None;
254        #[cfg(feature = "sml-filtering")]
255        let mut f_filters = None;
256        #[cfg(feature = "sml-filtering")]
257        let mut f_top10 = None;
258        #[cfg(feature = "sml-filtering")]
259        let mut f_custom_filters = None;
260        #[cfg(feature = "sml-filtering")]
261        let mut f_dynamic_filter = None;
262        #[cfg(feature = "sml-filtering")]
263        let mut f_color_filter = None;
264        #[cfg(feature = "sml-filtering")]
265        let mut f_icon_filter = None;
266        #[cfg(feature = "sml-extensions")]
267        let mut f_extension_list = None;
268        #[cfg(feature = "extra-attrs")]
269        let mut extra_attrs = std::collections::HashMap::new();
270        #[cfg(feature = "extra-children")]
271        let mut extra_children = Vec::new();
272        #[cfg(feature = "extra-children")]
273        let mut child_idx: usize = 0;
274
275        // Parse attributes
276        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
277            let val = String::from_utf8_lossy(&attr.value);
278            match attr.key.local_name().as_ref() {
279                #[cfg(feature = "sml-filtering")]
280                b"colId" => {
281                    f_column_id = val.parse().ok();
282                }
283                #[cfg(feature = "sml-filtering")]
284                b"hiddenButton" => {
285                    f_hidden_button = Some(val == "true" || val == "1");
286                }
287                #[cfg(feature = "sml-filtering")]
288                b"showButton" => {
289                    f_show_button = Some(val == "true" || val == "1");
290                }
291                #[cfg(feature = "extra-attrs")]
292                unknown => {
293                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
294                    extra_attrs.insert(key, val.into_owned());
295                }
296                #[cfg(not(feature = "extra-attrs"))]
297                _ => {}
298            }
299        }
300
301        // Parse child elements
302        if !is_empty {
303            let mut buf = Vec::new();
304            loop {
305                match reader.read_event_into(&mut buf)? {
306                    Event::Start(e) => {
307                        match e.local_name().as_ref() {
308                            #[cfg(feature = "sml-filtering")]
309                            b"filters" => {
310                                f_filters = Some(Box::new(Filters::from_xml(reader, &e, false)?));
311                                #[cfg(feature = "extra-children")]
312                                {
313                                    child_idx += 1;
314                                }
315                            }
316                            #[cfg(feature = "sml-filtering")]
317                            b"top10" => {
318                                f_top10 = Some(Box::new(Top10Filter::from_xml(reader, &e, false)?));
319                                #[cfg(feature = "extra-children")]
320                                {
321                                    child_idx += 1;
322                                }
323                            }
324                            #[cfg(feature = "sml-filtering")]
325                            b"customFilters" => {
326                                f_custom_filters =
327                                    Some(Box::new(CustomFilters::from_xml(reader, &e, false)?));
328                                #[cfg(feature = "extra-children")]
329                                {
330                                    child_idx += 1;
331                                }
332                            }
333                            #[cfg(feature = "sml-filtering")]
334                            b"dynamicFilter" => {
335                                f_dynamic_filter =
336                                    Some(Box::new(DynamicFilter::from_xml(reader, &e, false)?));
337                                #[cfg(feature = "extra-children")]
338                                {
339                                    child_idx += 1;
340                                }
341                            }
342                            #[cfg(feature = "sml-filtering")]
343                            b"colorFilter" => {
344                                f_color_filter =
345                                    Some(Box::new(ColorFilter::from_xml(reader, &e, false)?));
346                                #[cfg(feature = "extra-children")]
347                                {
348                                    child_idx += 1;
349                                }
350                            }
351                            #[cfg(feature = "sml-filtering")]
352                            b"iconFilter" => {
353                                f_icon_filter =
354                                    Some(Box::new(IconFilter::from_xml(reader, &e, false)?));
355                                #[cfg(feature = "extra-children")]
356                                {
357                                    child_idx += 1;
358                                }
359                            }
360                            #[cfg(feature = "sml-extensions")]
361                            b"extLst" => {
362                                f_extension_list =
363                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
364                                #[cfg(feature = "extra-children")]
365                                {
366                                    child_idx += 1;
367                                }
368                            }
369                            #[cfg(feature = "extra-children")]
370                            _ => {
371                                // Capture unknown element for roundtrip
372                                let elem = RawXmlElement::from_reader(reader, &e)?;
373                                extra_children.push(PositionedNode::new(
374                                    child_idx,
375                                    RawXmlNode::Element(elem),
376                                ));
377                                child_idx += 1;
378                            }
379                            #[cfg(not(feature = "extra-children"))]
380                            _ => {
381                                // Skip unknown element
382                                skip_element(reader)?;
383                            }
384                        }
385                    }
386                    Event::Empty(e) => {
387                        match e.local_name().as_ref() {
388                            #[cfg(feature = "sml-filtering")]
389                            b"filters" => {
390                                f_filters = Some(Box::new(Filters::from_xml(reader, &e, true)?));
391                                #[cfg(feature = "extra-children")]
392                                {
393                                    child_idx += 1;
394                                }
395                            }
396                            #[cfg(feature = "sml-filtering")]
397                            b"top10" => {
398                                f_top10 = Some(Box::new(Top10Filter::from_xml(reader, &e, true)?));
399                                #[cfg(feature = "extra-children")]
400                                {
401                                    child_idx += 1;
402                                }
403                            }
404                            #[cfg(feature = "sml-filtering")]
405                            b"customFilters" => {
406                                f_custom_filters =
407                                    Some(Box::new(CustomFilters::from_xml(reader, &e, true)?));
408                                #[cfg(feature = "extra-children")]
409                                {
410                                    child_idx += 1;
411                                }
412                            }
413                            #[cfg(feature = "sml-filtering")]
414                            b"dynamicFilter" => {
415                                f_dynamic_filter =
416                                    Some(Box::new(DynamicFilter::from_xml(reader, &e, true)?));
417                                #[cfg(feature = "extra-children")]
418                                {
419                                    child_idx += 1;
420                                }
421                            }
422                            #[cfg(feature = "sml-filtering")]
423                            b"colorFilter" => {
424                                f_color_filter =
425                                    Some(Box::new(ColorFilter::from_xml(reader, &e, true)?));
426                                #[cfg(feature = "extra-children")]
427                                {
428                                    child_idx += 1;
429                                }
430                            }
431                            #[cfg(feature = "sml-filtering")]
432                            b"iconFilter" => {
433                                f_icon_filter =
434                                    Some(Box::new(IconFilter::from_xml(reader, &e, true)?));
435                                #[cfg(feature = "extra-children")]
436                                {
437                                    child_idx += 1;
438                                }
439                            }
440                            #[cfg(feature = "sml-extensions")]
441                            b"extLst" => {
442                                f_extension_list =
443                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
444                                #[cfg(feature = "extra-children")]
445                                {
446                                    child_idx += 1;
447                                }
448                            }
449                            #[cfg(feature = "extra-children")]
450                            _ => {
451                                // Capture unknown empty element for roundtrip
452                                let elem = RawXmlElement::from_empty(&e);
453                                extra_children.push(PositionedNode::new(
454                                    child_idx,
455                                    RawXmlNode::Element(elem),
456                                ));
457                                child_idx += 1;
458                            }
459                            #[cfg(not(feature = "extra-children"))]
460                            _ => {}
461                        }
462                    }
463                    Event::End(_) => break,
464                    Event::Eof => break,
465                    _ => {}
466                }
467                buf.clear();
468            }
469        }
470
471        Ok(Self {
472            #[cfg(feature = "sml-filtering")]
473            column_id: f_column_id
474                .ok_or_else(|| ParseError::MissingAttribute("colId".to_string()))?,
475            #[cfg(feature = "sml-filtering")]
476            hidden_button: f_hidden_button,
477            #[cfg(feature = "sml-filtering")]
478            show_button: f_show_button,
479            #[cfg(feature = "sml-filtering")]
480            filters: f_filters,
481            #[cfg(feature = "sml-filtering")]
482            top10: f_top10,
483            #[cfg(feature = "sml-filtering")]
484            custom_filters: f_custom_filters,
485            #[cfg(feature = "sml-filtering")]
486            dynamic_filter: f_dynamic_filter,
487            #[cfg(feature = "sml-filtering")]
488            color_filter: f_color_filter,
489            #[cfg(feature = "sml-filtering")]
490            icon_filter: f_icon_filter,
491            #[cfg(feature = "sml-extensions")]
492            extension_list: f_extension_list,
493            #[cfg(feature = "extra-attrs")]
494            extra_attrs,
495            #[cfg(feature = "extra-children")]
496            extra_children,
497        })
498    }
499}
500
501impl FromXml for Filters {
502    fn from_xml<R: BufRead>(
503        reader: &mut Reader<R>,
504        start_tag: &BytesStart,
505        is_empty: bool,
506    ) -> Result<Self, ParseError> {
507        let mut f_blank = None;
508        let mut f_calendar_type = None;
509        let mut f_filter = Vec::new();
510        let mut f_date_group_item = Vec::new();
511        #[cfg(feature = "extra-attrs")]
512        let mut extra_attrs = std::collections::HashMap::new();
513        #[cfg(feature = "extra-children")]
514        let mut extra_children = Vec::new();
515        #[cfg(feature = "extra-children")]
516        let mut child_idx: usize = 0;
517
518        // Parse attributes
519        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
520            let val = String::from_utf8_lossy(&attr.value);
521            match attr.key.local_name().as_ref() {
522                b"blank" => {
523                    f_blank = Some(val == "true" || val == "1");
524                }
525                b"calendarType" => {
526                    f_calendar_type = val.parse().ok();
527                }
528                #[cfg(feature = "extra-attrs")]
529                unknown => {
530                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
531                    extra_attrs.insert(key, val.into_owned());
532                }
533                #[cfg(not(feature = "extra-attrs"))]
534                _ => {}
535            }
536        }
537
538        // Parse child elements
539        if !is_empty {
540            let mut buf = Vec::new();
541            loop {
542                match reader.read_event_into(&mut buf)? {
543                    Event::Start(e) => {
544                        match e.local_name().as_ref() {
545                            b"filter" => {
546                                f_filter.push(Filter::from_xml(reader, &e, false)?);
547                                #[cfg(feature = "extra-children")]
548                                {
549                                    child_idx += 1;
550                                }
551                            }
552                            b"dateGroupItem" => {
553                                f_date_group_item.push(DateGroupItem::from_xml(reader, &e, false)?);
554                                #[cfg(feature = "extra-children")]
555                                {
556                                    child_idx += 1;
557                                }
558                            }
559                            #[cfg(feature = "extra-children")]
560                            _ => {
561                                // Capture unknown element for roundtrip
562                                let elem = RawXmlElement::from_reader(reader, &e)?;
563                                extra_children.push(PositionedNode::new(
564                                    child_idx,
565                                    RawXmlNode::Element(elem),
566                                ));
567                                child_idx += 1;
568                            }
569                            #[cfg(not(feature = "extra-children"))]
570                            _ => {
571                                // Skip unknown element
572                                skip_element(reader)?;
573                            }
574                        }
575                    }
576                    Event::Empty(e) => {
577                        match e.local_name().as_ref() {
578                            b"filter" => {
579                                f_filter.push(Filter::from_xml(reader, &e, true)?);
580                                #[cfg(feature = "extra-children")]
581                                {
582                                    child_idx += 1;
583                                }
584                            }
585                            b"dateGroupItem" => {
586                                f_date_group_item.push(DateGroupItem::from_xml(reader, &e, true)?);
587                                #[cfg(feature = "extra-children")]
588                                {
589                                    child_idx += 1;
590                                }
591                            }
592                            #[cfg(feature = "extra-children")]
593                            _ => {
594                                // Capture unknown empty element for roundtrip
595                                let elem = RawXmlElement::from_empty(&e);
596                                extra_children.push(PositionedNode::new(
597                                    child_idx,
598                                    RawXmlNode::Element(elem),
599                                ));
600                                child_idx += 1;
601                            }
602                            #[cfg(not(feature = "extra-children"))]
603                            _ => {}
604                        }
605                    }
606                    Event::End(_) => break,
607                    Event::Eof => break,
608                    _ => {}
609                }
610                buf.clear();
611            }
612        }
613
614        Ok(Self {
615            blank: f_blank,
616            calendar_type: f_calendar_type,
617            filter: f_filter,
618            date_group_item: f_date_group_item,
619            #[cfg(feature = "extra-attrs")]
620            extra_attrs,
621            #[cfg(feature = "extra-children")]
622            extra_children,
623        })
624    }
625}
626
627impl FromXml for Filter {
628    fn from_xml<R: BufRead>(
629        reader: &mut Reader<R>,
630        start_tag: &BytesStart,
631        is_empty: bool,
632    ) -> Result<Self, ParseError> {
633        let mut f_value = None;
634        #[cfg(feature = "extra-attrs")]
635        let mut extra_attrs = std::collections::HashMap::new();
636
637        // Parse attributes
638        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
639            let val = String::from_utf8_lossy(&attr.value);
640            match attr.key.local_name().as_ref() {
641                b"val" => {
642                    f_value = Some(val.into_owned());
643                }
644                #[cfg(feature = "extra-attrs")]
645                unknown => {
646                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
647                    extra_attrs.insert(key, val.into_owned());
648                }
649                #[cfg(not(feature = "extra-attrs"))]
650                _ => {}
651            }
652        }
653
654        if !is_empty {
655            let mut buf = Vec::new();
656            loop {
657                match reader.read_event_into(&mut buf)? {
658                    Event::End(_) => break,
659                    Event::Eof => break,
660                    _ => {}
661                }
662                buf.clear();
663            }
664        }
665
666        Ok(Self {
667            value: f_value,
668            #[cfg(feature = "extra-attrs")]
669            extra_attrs,
670        })
671    }
672}
673
674impl FromXml for CustomFilters {
675    fn from_xml<R: BufRead>(
676        reader: &mut Reader<R>,
677        start_tag: &BytesStart,
678        is_empty: bool,
679    ) -> Result<Self, ParseError> {
680        let mut f_and = None;
681        let mut f_custom_filter = Vec::new();
682        #[cfg(feature = "extra-attrs")]
683        let mut extra_attrs = std::collections::HashMap::new();
684        #[cfg(feature = "extra-children")]
685        let mut extra_children = Vec::new();
686        #[cfg(feature = "extra-children")]
687        let mut child_idx: usize = 0;
688
689        // Parse attributes
690        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
691            let val = String::from_utf8_lossy(&attr.value);
692            match attr.key.local_name().as_ref() {
693                b"and" => {
694                    f_and = Some(val == "true" || val == "1");
695                }
696                #[cfg(feature = "extra-attrs")]
697                unknown => {
698                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
699                    extra_attrs.insert(key, val.into_owned());
700                }
701                #[cfg(not(feature = "extra-attrs"))]
702                _ => {}
703            }
704        }
705
706        // Parse child elements
707        if !is_empty {
708            let mut buf = Vec::new();
709            loop {
710                match reader.read_event_into(&mut buf)? {
711                    Event::Start(e) => {
712                        match e.local_name().as_ref() {
713                            b"customFilter" => {
714                                f_custom_filter.push(CustomFilter::from_xml(reader, &e, false)?);
715                                #[cfg(feature = "extra-children")]
716                                {
717                                    child_idx += 1;
718                                }
719                            }
720                            #[cfg(feature = "extra-children")]
721                            _ => {
722                                // Capture unknown element for roundtrip
723                                let elem = RawXmlElement::from_reader(reader, &e)?;
724                                extra_children.push(PositionedNode::new(
725                                    child_idx,
726                                    RawXmlNode::Element(elem),
727                                ));
728                                child_idx += 1;
729                            }
730                            #[cfg(not(feature = "extra-children"))]
731                            _ => {
732                                // Skip unknown element
733                                skip_element(reader)?;
734                            }
735                        }
736                    }
737                    Event::Empty(e) => {
738                        match e.local_name().as_ref() {
739                            b"customFilter" => {
740                                f_custom_filter.push(CustomFilter::from_xml(reader, &e, true)?);
741                                #[cfg(feature = "extra-children")]
742                                {
743                                    child_idx += 1;
744                                }
745                            }
746                            #[cfg(feature = "extra-children")]
747                            _ => {
748                                // Capture unknown empty element for roundtrip
749                                let elem = RawXmlElement::from_empty(&e);
750                                extra_children.push(PositionedNode::new(
751                                    child_idx,
752                                    RawXmlNode::Element(elem),
753                                ));
754                                child_idx += 1;
755                            }
756                            #[cfg(not(feature = "extra-children"))]
757                            _ => {}
758                        }
759                    }
760                    Event::End(_) => break,
761                    Event::Eof => break,
762                    _ => {}
763                }
764                buf.clear();
765            }
766        }
767
768        Ok(Self {
769            and: f_and,
770            custom_filter: f_custom_filter,
771            #[cfg(feature = "extra-attrs")]
772            extra_attrs,
773            #[cfg(feature = "extra-children")]
774            extra_children,
775        })
776    }
777}
778
779impl FromXml for CustomFilter {
780    fn from_xml<R: BufRead>(
781        reader: &mut Reader<R>,
782        start_tag: &BytesStart,
783        is_empty: bool,
784    ) -> Result<Self, ParseError> {
785        let mut f_operator = None;
786        let mut f_value = None;
787        #[cfg(feature = "extra-attrs")]
788        let mut extra_attrs = std::collections::HashMap::new();
789
790        // Parse attributes
791        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
792            let val = String::from_utf8_lossy(&attr.value);
793            match attr.key.local_name().as_ref() {
794                b"operator" => {
795                    f_operator = val.parse().ok();
796                }
797                b"val" => {
798                    f_value = Some(val.into_owned());
799                }
800                #[cfg(feature = "extra-attrs")]
801                unknown => {
802                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
803                    extra_attrs.insert(key, val.into_owned());
804                }
805                #[cfg(not(feature = "extra-attrs"))]
806                _ => {}
807            }
808        }
809
810        if !is_empty {
811            let mut buf = Vec::new();
812            loop {
813                match reader.read_event_into(&mut buf)? {
814                    Event::End(_) => break,
815                    Event::Eof => break,
816                    _ => {}
817                }
818                buf.clear();
819            }
820        }
821
822        Ok(Self {
823            operator: f_operator,
824            value: f_value,
825            #[cfg(feature = "extra-attrs")]
826            extra_attrs,
827        })
828    }
829}
830
831impl FromXml for Top10Filter {
832    fn from_xml<R: BufRead>(
833        reader: &mut Reader<R>,
834        start_tag: &BytesStart,
835        is_empty: bool,
836    ) -> Result<Self, ParseError> {
837        let mut f_top = None;
838        let mut f_percent = None;
839        let mut f_value: Option<f64> = None;
840        let mut f_filter_val = None;
841        #[cfg(feature = "extra-attrs")]
842        let mut extra_attrs = std::collections::HashMap::new();
843
844        // Parse attributes
845        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
846            let val = String::from_utf8_lossy(&attr.value);
847            match attr.key.local_name().as_ref() {
848                b"top" => {
849                    f_top = Some(val == "true" || val == "1");
850                }
851                b"percent" => {
852                    f_percent = Some(val == "true" || val == "1");
853                }
854                b"val" => {
855                    f_value = val.parse().ok();
856                }
857                b"filterVal" => {
858                    f_filter_val = val.parse().ok();
859                }
860                #[cfg(feature = "extra-attrs")]
861                unknown => {
862                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
863                    extra_attrs.insert(key, val.into_owned());
864                }
865                #[cfg(not(feature = "extra-attrs"))]
866                _ => {}
867            }
868        }
869
870        if !is_empty {
871            let mut buf = Vec::new();
872            loop {
873                match reader.read_event_into(&mut buf)? {
874                    Event::End(_) => break,
875                    Event::Eof => break,
876                    _ => {}
877                }
878                buf.clear();
879            }
880        }
881
882        Ok(Self {
883            top: f_top,
884            percent: f_percent,
885            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
886            filter_val: f_filter_val,
887            #[cfg(feature = "extra-attrs")]
888            extra_attrs,
889        })
890    }
891}
892
893impl FromXml for ColorFilter {
894    fn from_xml<R: BufRead>(
895        reader: &mut Reader<R>,
896        start_tag: &BytesStart,
897        is_empty: bool,
898    ) -> Result<Self, ParseError> {
899        let mut f_dxf_id = None;
900        let mut f_cell_color = None;
901        #[cfg(feature = "extra-attrs")]
902        let mut extra_attrs = std::collections::HashMap::new();
903
904        // Parse attributes
905        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
906            let val = String::from_utf8_lossy(&attr.value);
907            match attr.key.local_name().as_ref() {
908                b"dxfId" => {
909                    f_dxf_id = val.parse().ok();
910                }
911                b"cellColor" => {
912                    f_cell_color = Some(val == "true" || val == "1");
913                }
914                #[cfg(feature = "extra-attrs")]
915                unknown => {
916                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
917                    extra_attrs.insert(key, val.into_owned());
918                }
919                #[cfg(not(feature = "extra-attrs"))]
920                _ => {}
921            }
922        }
923
924        if !is_empty {
925            let mut buf = Vec::new();
926            loop {
927                match reader.read_event_into(&mut buf)? {
928                    Event::End(_) => break,
929                    Event::Eof => break,
930                    _ => {}
931                }
932                buf.clear();
933            }
934        }
935
936        Ok(Self {
937            dxf_id: f_dxf_id,
938            cell_color: f_cell_color,
939            #[cfg(feature = "extra-attrs")]
940            extra_attrs,
941        })
942    }
943}
944
945impl FromXml for IconFilter {
946    fn from_xml<R: BufRead>(
947        reader: &mut Reader<R>,
948        start_tag: &BytesStart,
949        is_empty: bool,
950    ) -> Result<Self, ParseError> {
951        let mut f_icon_set: Option<IconSetType> = None;
952        let mut f_icon_id = None;
953        #[cfg(feature = "extra-attrs")]
954        let mut extra_attrs = std::collections::HashMap::new();
955
956        // Parse attributes
957        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
958            let val = String::from_utf8_lossy(&attr.value);
959            match attr.key.local_name().as_ref() {
960                b"iconSet" => {
961                    f_icon_set = val.parse().ok();
962                }
963                b"iconId" => {
964                    f_icon_id = val.parse().ok();
965                }
966                #[cfg(feature = "extra-attrs")]
967                unknown => {
968                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
969                    extra_attrs.insert(key, val.into_owned());
970                }
971                #[cfg(not(feature = "extra-attrs"))]
972                _ => {}
973            }
974        }
975
976        if !is_empty {
977            let mut buf = Vec::new();
978            loop {
979                match reader.read_event_into(&mut buf)? {
980                    Event::End(_) => break,
981                    Event::Eof => break,
982                    _ => {}
983                }
984                buf.clear();
985            }
986        }
987
988        Ok(Self {
989            icon_set: f_icon_set
990                .ok_or_else(|| ParseError::MissingAttribute("iconSet".to_string()))?,
991            icon_id: f_icon_id,
992            #[cfg(feature = "extra-attrs")]
993            extra_attrs,
994        })
995    }
996}
997
998impl FromXml for DynamicFilter {
999    fn from_xml<R: BufRead>(
1000        reader: &mut Reader<R>,
1001        start_tag: &BytesStart,
1002        is_empty: bool,
1003    ) -> Result<Self, ParseError> {
1004        let mut f_type: Option<DynamicFilterType> = None;
1005        let mut f_value = None;
1006        let mut f_val_iso = None;
1007        let mut f_max_val = None;
1008        let mut f_max_val_iso = None;
1009        #[cfg(feature = "extra-attrs")]
1010        let mut extra_attrs = std::collections::HashMap::new();
1011
1012        // Parse attributes
1013        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1014            let val = String::from_utf8_lossy(&attr.value);
1015            match attr.key.local_name().as_ref() {
1016                b"type" => {
1017                    f_type = val.parse().ok();
1018                }
1019                b"val" => {
1020                    f_value = val.parse().ok();
1021                }
1022                b"valIso" => {
1023                    f_val_iso = Some(val.into_owned());
1024                }
1025                b"maxVal" => {
1026                    f_max_val = val.parse().ok();
1027                }
1028                b"maxValIso" => {
1029                    f_max_val_iso = Some(val.into_owned());
1030                }
1031                #[cfg(feature = "extra-attrs")]
1032                unknown => {
1033                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1034                    extra_attrs.insert(key, val.into_owned());
1035                }
1036                #[cfg(not(feature = "extra-attrs"))]
1037                _ => {}
1038            }
1039        }
1040
1041        if !is_empty {
1042            let mut buf = Vec::new();
1043            loop {
1044                match reader.read_event_into(&mut buf)? {
1045                    Event::End(_) => break,
1046                    Event::Eof => break,
1047                    _ => {}
1048                }
1049                buf.clear();
1050            }
1051        }
1052
1053        Ok(Self {
1054            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
1055            value: f_value,
1056            val_iso: f_val_iso,
1057            max_val: f_max_val,
1058            max_val_iso: f_max_val_iso,
1059            #[cfg(feature = "extra-attrs")]
1060            extra_attrs,
1061        })
1062    }
1063}
1064
1065impl FromXml for SortState {
1066    fn from_xml<R: BufRead>(
1067        reader: &mut Reader<R>,
1068        start_tag: &BytesStart,
1069        is_empty: bool,
1070    ) -> Result<Self, ParseError> {
1071        let mut f_column_sort = None;
1072        let mut f_case_sensitive = None;
1073        let mut f_sort_method = None;
1074        let mut f_reference: Option<Reference> = None;
1075        let mut f_sort_condition = Vec::new();
1076        let mut f_extension_list = None;
1077        #[cfg(feature = "extra-attrs")]
1078        let mut extra_attrs = std::collections::HashMap::new();
1079        #[cfg(feature = "extra-children")]
1080        let mut extra_children = Vec::new();
1081        #[cfg(feature = "extra-children")]
1082        let mut child_idx: usize = 0;
1083
1084        // Parse attributes
1085        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1086            let val = String::from_utf8_lossy(&attr.value);
1087            match attr.key.local_name().as_ref() {
1088                b"columnSort" => {
1089                    f_column_sort = Some(val == "true" || val == "1");
1090                }
1091                b"caseSensitive" => {
1092                    f_case_sensitive = Some(val == "true" || val == "1");
1093                }
1094                b"sortMethod" => {
1095                    f_sort_method = val.parse().ok();
1096                }
1097                b"ref" => {
1098                    f_reference = Some(val.into_owned());
1099                }
1100                #[cfg(feature = "extra-attrs")]
1101                unknown => {
1102                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1103                    extra_attrs.insert(key, val.into_owned());
1104                }
1105                #[cfg(not(feature = "extra-attrs"))]
1106                _ => {}
1107            }
1108        }
1109
1110        // Parse child elements
1111        if !is_empty {
1112            let mut buf = Vec::new();
1113            loop {
1114                match reader.read_event_into(&mut buf)? {
1115                    Event::Start(e) => {
1116                        match e.local_name().as_ref() {
1117                            b"sortCondition" => {
1118                                f_sort_condition.push(SortCondition::from_xml(reader, &e, false)?);
1119                                #[cfg(feature = "extra-children")]
1120                                {
1121                                    child_idx += 1;
1122                                }
1123                            }
1124                            b"extLst" => {
1125                                f_extension_list =
1126                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
1127                                #[cfg(feature = "extra-children")]
1128                                {
1129                                    child_idx += 1;
1130                                }
1131                            }
1132                            #[cfg(feature = "extra-children")]
1133                            _ => {
1134                                // Capture unknown element for roundtrip
1135                                let elem = RawXmlElement::from_reader(reader, &e)?;
1136                                extra_children.push(PositionedNode::new(
1137                                    child_idx,
1138                                    RawXmlNode::Element(elem),
1139                                ));
1140                                child_idx += 1;
1141                            }
1142                            #[cfg(not(feature = "extra-children"))]
1143                            _ => {
1144                                // Skip unknown element
1145                                skip_element(reader)?;
1146                            }
1147                        }
1148                    }
1149                    Event::Empty(e) => {
1150                        match e.local_name().as_ref() {
1151                            b"sortCondition" => {
1152                                f_sort_condition.push(SortCondition::from_xml(reader, &e, true)?);
1153                                #[cfg(feature = "extra-children")]
1154                                {
1155                                    child_idx += 1;
1156                                }
1157                            }
1158                            b"extLst" => {
1159                                f_extension_list =
1160                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
1161                                #[cfg(feature = "extra-children")]
1162                                {
1163                                    child_idx += 1;
1164                                }
1165                            }
1166                            #[cfg(feature = "extra-children")]
1167                            _ => {
1168                                // Capture unknown empty element for roundtrip
1169                                let elem = RawXmlElement::from_empty(&e);
1170                                extra_children.push(PositionedNode::new(
1171                                    child_idx,
1172                                    RawXmlNode::Element(elem),
1173                                ));
1174                                child_idx += 1;
1175                            }
1176                            #[cfg(not(feature = "extra-children"))]
1177                            _ => {}
1178                        }
1179                    }
1180                    Event::End(_) => break,
1181                    Event::Eof => break,
1182                    _ => {}
1183                }
1184                buf.clear();
1185            }
1186        }
1187
1188        Ok(Self {
1189            column_sort: f_column_sort,
1190            case_sensitive: f_case_sensitive,
1191            sort_method: f_sort_method,
1192            reference: f_reference
1193                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
1194            sort_condition: f_sort_condition,
1195            extension_list: f_extension_list,
1196            #[cfg(feature = "extra-attrs")]
1197            extra_attrs,
1198            #[cfg(feature = "extra-children")]
1199            extra_children,
1200        })
1201    }
1202}
1203
1204impl FromXml for SortCondition {
1205    fn from_xml<R: BufRead>(
1206        reader: &mut Reader<R>,
1207        start_tag: &BytesStart,
1208        is_empty: bool,
1209    ) -> Result<Self, ParseError> {
1210        let mut f_descending = None;
1211        let mut f_sort_by = None;
1212        let mut f_reference: Option<Reference> = None;
1213        let mut f_custom_list = None;
1214        let mut f_dxf_id = None;
1215        let mut f_icon_set = None;
1216        let mut f_icon_id = None;
1217        #[cfg(feature = "extra-attrs")]
1218        let mut extra_attrs = std::collections::HashMap::new();
1219
1220        // Parse attributes
1221        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1222            let val = String::from_utf8_lossy(&attr.value);
1223            match attr.key.local_name().as_ref() {
1224                b"descending" => {
1225                    f_descending = Some(val == "true" || val == "1");
1226                }
1227                b"sortBy" => {
1228                    f_sort_by = val.parse().ok();
1229                }
1230                b"ref" => {
1231                    f_reference = Some(val.into_owned());
1232                }
1233                b"customList" => {
1234                    f_custom_list = Some(val.into_owned());
1235                }
1236                b"dxfId" => {
1237                    f_dxf_id = val.parse().ok();
1238                }
1239                b"iconSet" => {
1240                    f_icon_set = val.parse().ok();
1241                }
1242                b"iconId" => {
1243                    f_icon_id = val.parse().ok();
1244                }
1245                #[cfg(feature = "extra-attrs")]
1246                unknown => {
1247                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1248                    extra_attrs.insert(key, val.into_owned());
1249                }
1250                #[cfg(not(feature = "extra-attrs"))]
1251                _ => {}
1252            }
1253        }
1254
1255        if !is_empty {
1256            let mut buf = Vec::new();
1257            loop {
1258                match reader.read_event_into(&mut buf)? {
1259                    Event::End(_) => break,
1260                    Event::Eof => break,
1261                    _ => {}
1262                }
1263                buf.clear();
1264            }
1265        }
1266
1267        Ok(Self {
1268            descending: f_descending,
1269            sort_by: f_sort_by,
1270            reference: f_reference
1271                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
1272            custom_list: f_custom_list,
1273            dxf_id: f_dxf_id,
1274            icon_set: f_icon_set,
1275            icon_id: f_icon_id,
1276            #[cfg(feature = "extra-attrs")]
1277            extra_attrs,
1278        })
1279    }
1280}
1281
1282impl FromXml for DateGroupItem {
1283    fn from_xml<R: BufRead>(
1284        reader: &mut Reader<R>,
1285        start_tag: &BytesStart,
1286        is_empty: bool,
1287    ) -> Result<Self, ParseError> {
1288        let mut f_year: Option<u16> = None;
1289        let mut f_month = None;
1290        let mut f_day = None;
1291        let mut f_hour = None;
1292        let mut f_minute = None;
1293        let mut f_second = None;
1294        let mut f_date_time_grouping: Option<STDateTimeGrouping> = None;
1295        #[cfg(feature = "extra-attrs")]
1296        let mut extra_attrs = std::collections::HashMap::new();
1297
1298        // Parse attributes
1299        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1300            let val = String::from_utf8_lossy(&attr.value);
1301            match attr.key.local_name().as_ref() {
1302                b"year" => {
1303                    f_year = val.parse().ok();
1304                }
1305                b"month" => {
1306                    f_month = val.parse().ok();
1307                }
1308                b"day" => {
1309                    f_day = val.parse().ok();
1310                }
1311                b"hour" => {
1312                    f_hour = val.parse().ok();
1313                }
1314                b"minute" => {
1315                    f_minute = val.parse().ok();
1316                }
1317                b"second" => {
1318                    f_second = val.parse().ok();
1319                }
1320                b"dateTimeGrouping" => {
1321                    f_date_time_grouping = val.parse().ok();
1322                }
1323                #[cfg(feature = "extra-attrs")]
1324                unknown => {
1325                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1326                    extra_attrs.insert(key, val.into_owned());
1327                }
1328                #[cfg(not(feature = "extra-attrs"))]
1329                _ => {}
1330            }
1331        }
1332
1333        if !is_empty {
1334            let mut buf = Vec::new();
1335            loop {
1336                match reader.read_event_into(&mut buf)? {
1337                    Event::End(_) => break,
1338                    Event::Eof => break,
1339                    _ => {}
1340                }
1341                buf.clear();
1342            }
1343        }
1344
1345        Ok(Self {
1346            year: f_year.ok_or_else(|| ParseError::MissingAttribute("year".to_string()))?,
1347            month: f_month,
1348            day: f_day,
1349            hour: f_hour,
1350            minute: f_minute,
1351            second: f_second,
1352            date_time_grouping: f_date_time_grouping
1353                .ok_or_else(|| ParseError::MissingAttribute("dateTimeGrouping".to_string()))?,
1354            #[cfg(feature = "extra-attrs")]
1355            extra_attrs,
1356        })
1357    }
1358}
1359
1360impl FromXml for CTXStringElement {
1361    fn from_xml<R: BufRead>(
1362        reader: &mut Reader<R>,
1363        start_tag: &BytesStart,
1364        is_empty: bool,
1365    ) -> Result<Self, ParseError> {
1366        let mut f_value: Option<XmlString> = None;
1367        #[cfg(feature = "extra-attrs")]
1368        let mut extra_attrs = std::collections::HashMap::new();
1369
1370        // Parse attributes
1371        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1372            let val = String::from_utf8_lossy(&attr.value);
1373            match attr.key.local_name().as_ref() {
1374                b"v" => {
1375                    f_value = Some(val.into_owned());
1376                }
1377                #[cfg(feature = "extra-attrs")]
1378                unknown => {
1379                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1380                    extra_attrs.insert(key, val.into_owned());
1381                }
1382                #[cfg(not(feature = "extra-attrs"))]
1383                _ => {}
1384            }
1385        }
1386
1387        if !is_empty {
1388            let mut buf = Vec::new();
1389            loop {
1390                match reader.read_event_into(&mut buf)? {
1391                    Event::End(_) => break,
1392                    Event::Eof => break,
1393                    _ => {}
1394                }
1395                buf.clear();
1396            }
1397        }
1398
1399        Ok(Self {
1400            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
1401            #[cfg(feature = "extra-attrs")]
1402            extra_attrs,
1403        })
1404    }
1405}
1406
1407impl FromXml for Extension {
1408    fn from_xml<R: BufRead>(
1409        reader: &mut Reader<R>,
1410        start_tag: &BytesStart,
1411        is_empty: bool,
1412    ) -> Result<Self, ParseError> {
1413        let mut f_uri = None;
1414        #[cfg(feature = "extra-attrs")]
1415        let mut extra_attrs = std::collections::HashMap::new();
1416
1417        // Parse attributes
1418        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1419            let val = String::from_utf8_lossy(&attr.value);
1420            match attr.key.local_name().as_ref() {
1421                b"uri" => {
1422                    f_uri = Some(val.into_owned());
1423                }
1424                #[cfg(feature = "extra-attrs")]
1425                unknown => {
1426                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1427                    extra_attrs.insert(key, val.into_owned());
1428                }
1429                #[cfg(not(feature = "extra-attrs"))]
1430                _ => {}
1431            }
1432        }
1433
1434        if !is_empty {
1435            let mut buf = Vec::new();
1436            loop {
1437                match reader.read_event_into(&mut buf)? {
1438                    Event::End(_) => break,
1439                    Event::Eof => break,
1440                    _ => {}
1441                }
1442                buf.clear();
1443            }
1444        }
1445
1446        Ok(Self {
1447            uri: f_uri,
1448            #[cfg(feature = "extra-attrs")]
1449            extra_attrs,
1450        })
1451    }
1452}
1453
1454impl FromXml for ObjectAnchor {
1455    fn from_xml<R: BufRead>(
1456        reader: &mut Reader<R>,
1457        start_tag: &BytesStart,
1458        is_empty: bool,
1459    ) -> Result<Self, ParseError> {
1460        let mut f_move_with_cells = None;
1461        let mut f_size_with_cells = None;
1462        #[cfg(feature = "extra-attrs")]
1463        let mut extra_attrs = std::collections::HashMap::new();
1464
1465        // Parse attributes
1466        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1467            let val = String::from_utf8_lossy(&attr.value);
1468            match attr.key.local_name().as_ref() {
1469                b"moveWithCells" => {
1470                    f_move_with_cells = Some(val == "true" || val == "1");
1471                }
1472                b"sizeWithCells" => {
1473                    f_size_with_cells = Some(val == "true" || val == "1");
1474                }
1475                #[cfg(feature = "extra-attrs")]
1476                unknown => {
1477                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1478                    extra_attrs.insert(key, val.into_owned());
1479                }
1480                #[cfg(not(feature = "extra-attrs"))]
1481                _ => {}
1482            }
1483        }
1484
1485        if !is_empty {
1486            let mut buf = Vec::new();
1487            loop {
1488                match reader.read_event_into(&mut buf)? {
1489                    Event::End(_) => break,
1490                    Event::Eof => break,
1491                    _ => {}
1492                }
1493                buf.clear();
1494            }
1495        }
1496
1497        Ok(Self {
1498            move_with_cells: f_move_with_cells,
1499            size_with_cells: f_size_with_cells,
1500            #[cfg(feature = "extra-attrs")]
1501            extra_attrs,
1502        })
1503    }
1504}
1505
1506impl FromXml for EGExtensionList {
1507    fn from_xml<R: BufRead>(
1508        reader: &mut Reader<R>,
1509        start_tag: &BytesStart,
1510        is_empty: bool,
1511    ) -> Result<Self, ParseError> {
1512        let mut f_ext = Vec::new();
1513        #[cfg(feature = "extra-children")]
1514        let mut extra_children = Vec::new();
1515        #[cfg(feature = "extra-children")]
1516        let mut child_idx: usize = 0;
1517
1518        // Parse child elements
1519        if !is_empty {
1520            let mut buf = Vec::new();
1521            loop {
1522                match reader.read_event_into(&mut buf)? {
1523                    Event::Start(e) => {
1524                        match e.local_name().as_ref() {
1525                            b"ext" => {
1526                                f_ext.push(Extension::from_xml(reader, &e, false)?);
1527                                #[cfg(feature = "extra-children")]
1528                                {
1529                                    child_idx += 1;
1530                                }
1531                            }
1532                            #[cfg(feature = "extra-children")]
1533                            _ => {
1534                                // Capture unknown element for roundtrip
1535                                let elem = RawXmlElement::from_reader(reader, &e)?;
1536                                extra_children.push(PositionedNode::new(
1537                                    child_idx,
1538                                    RawXmlNode::Element(elem),
1539                                ));
1540                                child_idx += 1;
1541                            }
1542                            #[cfg(not(feature = "extra-children"))]
1543                            _ => {
1544                                // Skip unknown element
1545                                skip_element(reader)?;
1546                            }
1547                        }
1548                    }
1549                    Event::Empty(e) => {
1550                        match e.local_name().as_ref() {
1551                            b"ext" => {
1552                                f_ext.push(Extension::from_xml(reader, &e, true)?);
1553                                #[cfg(feature = "extra-children")]
1554                                {
1555                                    child_idx += 1;
1556                                }
1557                            }
1558                            #[cfg(feature = "extra-children")]
1559                            _ => {
1560                                // Capture unknown empty element for roundtrip
1561                                let elem = RawXmlElement::from_empty(&e);
1562                                extra_children.push(PositionedNode::new(
1563                                    child_idx,
1564                                    RawXmlNode::Element(elem),
1565                                ));
1566                                child_idx += 1;
1567                            }
1568                            #[cfg(not(feature = "extra-children"))]
1569                            _ => {}
1570                        }
1571                    }
1572                    Event::End(_) => break,
1573                    Event::Eof => break,
1574                    _ => {}
1575                }
1576                buf.clear();
1577            }
1578        }
1579
1580        Ok(Self {
1581            ext: f_ext,
1582            #[cfg(feature = "extra-children")]
1583            extra_children,
1584        })
1585    }
1586}
1587
1588impl FromXml for ExtensionList {
1589    fn from_xml<R: BufRead>(
1590        reader: &mut Reader<R>,
1591        start_tag: &BytesStart,
1592        is_empty: bool,
1593    ) -> Result<Self, ParseError> {
1594        let mut f_ext = Vec::new();
1595        #[cfg(feature = "extra-children")]
1596        let mut extra_children = Vec::new();
1597        #[cfg(feature = "extra-children")]
1598        let mut child_idx: usize = 0;
1599
1600        // Parse child elements
1601        if !is_empty {
1602            let mut buf = Vec::new();
1603            loop {
1604                match reader.read_event_into(&mut buf)? {
1605                    Event::Start(e) => {
1606                        match e.local_name().as_ref() {
1607                            b"ext" => {
1608                                f_ext.push(Extension::from_xml(reader, &e, false)?);
1609                                #[cfg(feature = "extra-children")]
1610                                {
1611                                    child_idx += 1;
1612                                }
1613                            }
1614                            #[cfg(feature = "extra-children")]
1615                            _ => {
1616                                // Capture unknown element for roundtrip
1617                                let elem = RawXmlElement::from_reader(reader, &e)?;
1618                                extra_children.push(PositionedNode::new(
1619                                    child_idx,
1620                                    RawXmlNode::Element(elem),
1621                                ));
1622                                child_idx += 1;
1623                            }
1624                            #[cfg(not(feature = "extra-children"))]
1625                            _ => {
1626                                // Skip unknown element
1627                                skip_element(reader)?;
1628                            }
1629                        }
1630                    }
1631                    Event::Empty(e) => {
1632                        match e.local_name().as_ref() {
1633                            b"ext" => {
1634                                f_ext.push(Extension::from_xml(reader, &e, true)?);
1635                                #[cfg(feature = "extra-children")]
1636                                {
1637                                    child_idx += 1;
1638                                }
1639                            }
1640                            #[cfg(feature = "extra-children")]
1641                            _ => {
1642                                // Capture unknown empty element for roundtrip
1643                                let elem = RawXmlElement::from_empty(&e);
1644                                extra_children.push(PositionedNode::new(
1645                                    child_idx,
1646                                    RawXmlNode::Element(elem),
1647                                ));
1648                                child_idx += 1;
1649                            }
1650                            #[cfg(not(feature = "extra-children"))]
1651                            _ => {}
1652                        }
1653                    }
1654                    Event::End(_) => break,
1655                    Event::Eof => break,
1656                    _ => {}
1657                }
1658                buf.clear();
1659            }
1660        }
1661
1662        Ok(Self {
1663            ext: f_ext,
1664            #[cfg(feature = "extra-children")]
1665            extra_children,
1666        })
1667    }
1668}
1669
1670impl FromXml for CalcChain {
1671    fn from_xml<R: BufRead>(
1672        reader: &mut Reader<R>,
1673        start_tag: &BytesStart,
1674        is_empty: bool,
1675    ) -> Result<Self, ParseError> {
1676        #[cfg(feature = "sml-formulas")]
1677        let mut f_cells = Vec::new();
1678        #[cfg(feature = "sml-extensions")]
1679        let mut f_extension_list = None;
1680        #[cfg(feature = "extra-children")]
1681        let mut extra_children = Vec::new();
1682        #[cfg(feature = "extra-children")]
1683        let mut child_idx: usize = 0;
1684
1685        // Parse child elements
1686        if !is_empty {
1687            let mut buf = Vec::new();
1688            loop {
1689                match reader.read_event_into(&mut buf)? {
1690                    Event::Start(e) => {
1691                        match e.local_name().as_ref() {
1692                            #[cfg(feature = "sml-formulas")]
1693                            b"c" => {
1694                                f_cells.push(CalcCell::from_xml(reader, &e, false)?);
1695                                #[cfg(feature = "extra-children")]
1696                                {
1697                                    child_idx += 1;
1698                                }
1699                            }
1700                            #[cfg(feature = "sml-extensions")]
1701                            b"extLst" => {
1702                                f_extension_list =
1703                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
1704                                #[cfg(feature = "extra-children")]
1705                                {
1706                                    child_idx += 1;
1707                                }
1708                            }
1709                            #[cfg(feature = "extra-children")]
1710                            _ => {
1711                                // Capture unknown element for roundtrip
1712                                let elem = RawXmlElement::from_reader(reader, &e)?;
1713                                extra_children.push(PositionedNode::new(
1714                                    child_idx,
1715                                    RawXmlNode::Element(elem),
1716                                ));
1717                                child_idx += 1;
1718                            }
1719                            #[cfg(not(feature = "extra-children"))]
1720                            _ => {
1721                                // Skip unknown element
1722                                skip_element(reader)?;
1723                            }
1724                        }
1725                    }
1726                    Event::Empty(e) => {
1727                        match e.local_name().as_ref() {
1728                            #[cfg(feature = "sml-formulas")]
1729                            b"c" => {
1730                                f_cells.push(CalcCell::from_xml(reader, &e, true)?);
1731                                #[cfg(feature = "extra-children")]
1732                                {
1733                                    child_idx += 1;
1734                                }
1735                            }
1736                            #[cfg(feature = "sml-extensions")]
1737                            b"extLst" => {
1738                                f_extension_list =
1739                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
1740                                #[cfg(feature = "extra-children")]
1741                                {
1742                                    child_idx += 1;
1743                                }
1744                            }
1745                            #[cfg(feature = "extra-children")]
1746                            _ => {
1747                                // Capture unknown empty element for roundtrip
1748                                let elem = RawXmlElement::from_empty(&e);
1749                                extra_children.push(PositionedNode::new(
1750                                    child_idx,
1751                                    RawXmlNode::Element(elem),
1752                                ));
1753                                child_idx += 1;
1754                            }
1755                            #[cfg(not(feature = "extra-children"))]
1756                            _ => {}
1757                        }
1758                    }
1759                    Event::End(_) => break,
1760                    Event::Eof => break,
1761                    _ => {}
1762                }
1763                buf.clear();
1764            }
1765        }
1766
1767        Ok(Self {
1768            #[cfg(feature = "sml-formulas")]
1769            cells: f_cells,
1770            #[cfg(feature = "sml-extensions")]
1771            extension_list: f_extension_list,
1772            #[cfg(feature = "extra-children")]
1773            extra_children,
1774        })
1775    }
1776}
1777
1778impl FromXml for CalcCell {
1779    fn from_xml<R: BufRead>(
1780        reader: &mut Reader<R>,
1781        start_tag: &BytesStart,
1782        is_empty: bool,
1783    ) -> Result<Self, ParseError> {
1784        let mut f_any: Option<CellRef> = None;
1785        #[cfg(feature = "sml-formulas")]
1786        let mut f_i = None;
1787        #[cfg(feature = "sml-formulas")]
1788        let mut f_style_index = None;
1789        #[cfg(feature = "sml-formulas")]
1790        let mut f_l = None;
1791        #[cfg(feature = "sml-formulas")]
1792        let mut f_cell_type = None;
1793        #[cfg(feature = "sml-formulas")]
1794        let mut f_a = None;
1795        #[cfg(feature = "extra-attrs")]
1796        let mut extra_attrs = std::collections::HashMap::new();
1797
1798        // Parse attributes
1799        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
1800            let val = String::from_utf8_lossy(&attr.value);
1801            match attr.key.local_name().as_ref() {
1802                b"_any" => {
1803                    f_any = Some(val.into_owned());
1804                }
1805                #[cfg(feature = "sml-formulas")]
1806                b"i" => {
1807                    f_i = val.parse().ok();
1808                }
1809                #[cfg(feature = "sml-formulas")]
1810                b"s" => {
1811                    f_style_index = Some(val == "true" || val == "1");
1812                }
1813                #[cfg(feature = "sml-formulas")]
1814                b"l" => {
1815                    f_l = Some(val == "true" || val == "1");
1816                }
1817                #[cfg(feature = "sml-formulas")]
1818                b"t" => {
1819                    f_cell_type = Some(val == "true" || val == "1");
1820                }
1821                #[cfg(feature = "sml-formulas")]
1822                b"a" => {
1823                    f_a = Some(val == "true" || val == "1");
1824                }
1825                #[cfg(feature = "extra-attrs")]
1826                unknown => {
1827                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
1828                    extra_attrs.insert(key, val.into_owned());
1829                }
1830                #[cfg(not(feature = "extra-attrs"))]
1831                _ => {}
1832            }
1833        }
1834
1835        if !is_empty {
1836            let mut buf = Vec::new();
1837            loop {
1838                match reader.read_event_into(&mut buf)? {
1839                    Event::End(_) => break,
1840                    Event::Eof => break,
1841                    _ => {}
1842                }
1843                buf.clear();
1844            }
1845        }
1846
1847        Ok(Self {
1848            _any: f_any.ok_or_else(|| ParseError::MissingAttribute("_any".to_string()))?,
1849            #[cfg(feature = "sml-formulas")]
1850            i: f_i,
1851            #[cfg(feature = "sml-formulas")]
1852            style_index: f_style_index,
1853            #[cfg(feature = "sml-formulas")]
1854            l: f_l,
1855            #[cfg(feature = "sml-formulas")]
1856            cell_type: f_cell_type,
1857            #[cfg(feature = "sml-formulas")]
1858            a: f_a,
1859            #[cfg(feature = "extra-attrs")]
1860            extra_attrs,
1861        })
1862    }
1863}
1864
1865impl FromXml for Comments {
1866    fn from_xml<R: BufRead>(
1867        reader: &mut Reader<R>,
1868        start_tag: &BytesStart,
1869        is_empty: bool,
1870    ) -> Result<Self, ParseError> {
1871        let mut f_authors: Option<Box<Authors>> = None;
1872        let mut f_comment_list: Option<Box<CommentList>> = None;
1873        let mut f_extension_list = None;
1874        #[cfg(feature = "extra-children")]
1875        let mut extra_children = Vec::new();
1876        #[cfg(feature = "extra-children")]
1877        let mut child_idx: usize = 0;
1878
1879        // Parse child elements
1880        if !is_empty {
1881            let mut buf = Vec::new();
1882            loop {
1883                match reader.read_event_into(&mut buf)? {
1884                    Event::Start(e) => {
1885                        match e.local_name().as_ref() {
1886                            b"authors" => {
1887                                f_authors = Some(Box::new(Authors::from_xml(reader, &e, false)?));
1888                                #[cfg(feature = "extra-children")]
1889                                {
1890                                    child_idx += 1;
1891                                }
1892                            }
1893                            b"commentList" => {
1894                                f_comment_list =
1895                                    Some(Box::new(CommentList::from_xml(reader, &e, false)?));
1896                                #[cfg(feature = "extra-children")]
1897                                {
1898                                    child_idx += 1;
1899                                }
1900                            }
1901                            b"extLst" => {
1902                                f_extension_list =
1903                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
1904                                #[cfg(feature = "extra-children")]
1905                                {
1906                                    child_idx += 1;
1907                                }
1908                            }
1909                            #[cfg(feature = "extra-children")]
1910                            _ => {
1911                                // Capture unknown element for roundtrip
1912                                let elem = RawXmlElement::from_reader(reader, &e)?;
1913                                extra_children.push(PositionedNode::new(
1914                                    child_idx,
1915                                    RawXmlNode::Element(elem),
1916                                ));
1917                                child_idx += 1;
1918                            }
1919                            #[cfg(not(feature = "extra-children"))]
1920                            _ => {
1921                                // Skip unknown element
1922                                skip_element(reader)?;
1923                            }
1924                        }
1925                    }
1926                    Event::Empty(e) => {
1927                        match e.local_name().as_ref() {
1928                            b"authors" => {
1929                                f_authors = Some(Box::new(Authors::from_xml(reader, &e, true)?));
1930                                #[cfg(feature = "extra-children")]
1931                                {
1932                                    child_idx += 1;
1933                                }
1934                            }
1935                            b"commentList" => {
1936                                f_comment_list =
1937                                    Some(Box::new(CommentList::from_xml(reader, &e, true)?));
1938                                #[cfg(feature = "extra-children")]
1939                                {
1940                                    child_idx += 1;
1941                                }
1942                            }
1943                            b"extLst" => {
1944                                f_extension_list =
1945                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
1946                                #[cfg(feature = "extra-children")]
1947                                {
1948                                    child_idx += 1;
1949                                }
1950                            }
1951                            #[cfg(feature = "extra-children")]
1952                            _ => {
1953                                // Capture unknown empty element for roundtrip
1954                                let elem = RawXmlElement::from_empty(&e);
1955                                extra_children.push(PositionedNode::new(
1956                                    child_idx,
1957                                    RawXmlNode::Element(elem),
1958                                ));
1959                                child_idx += 1;
1960                            }
1961                            #[cfg(not(feature = "extra-children"))]
1962                            _ => {}
1963                        }
1964                    }
1965                    Event::End(_) => break,
1966                    Event::Eof => break,
1967                    _ => {}
1968                }
1969                buf.clear();
1970            }
1971        }
1972
1973        Ok(Self {
1974            authors: f_authors
1975                .ok_or_else(|| ParseError::MissingAttribute("authors".to_string()))?,
1976            comment_list: f_comment_list
1977                .ok_or_else(|| ParseError::MissingAttribute("commentList".to_string()))?,
1978            extension_list: f_extension_list,
1979            #[cfg(feature = "extra-children")]
1980            extra_children,
1981        })
1982    }
1983}
1984
1985impl FromXml for Authors {
1986    fn from_xml<R: BufRead>(
1987        reader: &mut Reader<R>,
1988        start_tag: &BytesStart,
1989        is_empty: bool,
1990    ) -> Result<Self, ParseError> {
1991        let mut f_author = Vec::new();
1992        #[cfg(feature = "extra-children")]
1993        let mut extra_children = Vec::new();
1994        #[cfg(feature = "extra-children")]
1995        let mut child_idx: usize = 0;
1996
1997        // Parse child elements
1998        if !is_empty {
1999            let mut buf = Vec::new();
2000            loop {
2001                match reader.read_event_into(&mut buf)? {
2002                    Event::Start(e) => {
2003                        match e.local_name().as_ref() {
2004                            b"author" => {
2005                                f_author.push(read_text_content(reader)?);
2006                                #[cfg(feature = "extra-children")]
2007                                {
2008                                    child_idx += 1;
2009                                }
2010                            }
2011                            #[cfg(feature = "extra-children")]
2012                            _ => {
2013                                // Capture unknown element for roundtrip
2014                                let elem = RawXmlElement::from_reader(reader, &e)?;
2015                                extra_children.push(PositionedNode::new(
2016                                    child_idx,
2017                                    RawXmlNode::Element(elem),
2018                                ));
2019                                child_idx += 1;
2020                            }
2021                            #[cfg(not(feature = "extra-children"))]
2022                            _ => {
2023                                // Skip unknown element
2024                                skip_element(reader)?;
2025                            }
2026                        }
2027                    }
2028                    Event::Empty(e) => {
2029                        match e.local_name().as_ref() {
2030                            b"author" => {
2031                                f_author.push(String::new());
2032                                #[cfg(feature = "extra-children")]
2033                                {
2034                                    child_idx += 1;
2035                                }
2036                            }
2037                            #[cfg(feature = "extra-children")]
2038                            _ => {
2039                                // Capture unknown empty element for roundtrip
2040                                let elem = RawXmlElement::from_empty(&e);
2041                                extra_children.push(PositionedNode::new(
2042                                    child_idx,
2043                                    RawXmlNode::Element(elem),
2044                                ));
2045                                child_idx += 1;
2046                            }
2047                            #[cfg(not(feature = "extra-children"))]
2048                            _ => {}
2049                        }
2050                    }
2051                    Event::End(_) => break,
2052                    Event::Eof => break,
2053                    _ => {}
2054                }
2055                buf.clear();
2056            }
2057        }
2058
2059        Ok(Self {
2060            author: f_author,
2061            #[cfg(feature = "extra-children")]
2062            extra_children,
2063        })
2064    }
2065}
2066
2067impl FromXml for CommentList {
2068    fn from_xml<R: BufRead>(
2069        reader: &mut Reader<R>,
2070        start_tag: &BytesStart,
2071        is_empty: bool,
2072    ) -> Result<Self, ParseError> {
2073        let mut f_comment = Vec::new();
2074        #[cfg(feature = "extra-children")]
2075        let mut extra_children = Vec::new();
2076        #[cfg(feature = "extra-children")]
2077        let mut child_idx: usize = 0;
2078
2079        // Parse child elements
2080        if !is_empty {
2081            let mut buf = Vec::new();
2082            loop {
2083                match reader.read_event_into(&mut buf)? {
2084                    Event::Start(e) => {
2085                        match e.local_name().as_ref() {
2086                            b"comment" => {
2087                                f_comment.push(Comment::from_xml(reader, &e, false)?);
2088                                #[cfg(feature = "extra-children")]
2089                                {
2090                                    child_idx += 1;
2091                                }
2092                            }
2093                            #[cfg(feature = "extra-children")]
2094                            _ => {
2095                                // Capture unknown element for roundtrip
2096                                let elem = RawXmlElement::from_reader(reader, &e)?;
2097                                extra_children.push(PositionedNode::new(
2098                                    child_idx,
2099                                    RawXmlNode::Element(elem),
2100                                ));
2101                                child_idx += 1;
2102                            }
2103                            #[cfg(not(feature = "extra-children"))]
2104                            _ => {
2105                                // Skip unknown element
2106                                skip_element(reader)?;
2107                            }
2108                        }
2109                    }
2110                    Event::Empty(e) => {
2111                        match e.local_name().as_ref() {
2112                            b"comment" => {
2113                                f_comment.push(Comment::from_xml(reader, &e, true)?);
2114                                #[cfg(feature = "extra-children")]
2115                                {
2116                                    child_idx += 1;
2117                                }
2118                            }
2119                            #[cfg(feature = "extra-children")]
2120                            _ => {
2121                                // Capture unknown empty element for roundtrip
2122                                let elem = RawXmlElement::from_empty(&e);
2123                                extra_children.push(PositionedNode::new(
2124                                    child_idx,
2125                                    RawXmlNode::Element(elem),
2126                                ));
2127                                child_idx += 1;
2128                            }
2129                            #[cfg(not(feature = "extra-children"))]
2130                            _ => {}
2131                        }
2132                    }
2133                    Event::End(_) => break,
2134                    Event::Eof => break,
2135                    _ => {}
2136                }
2137                buf.clear();
2138            }
2139        }
2140
2141        Ok(Self {
2142            comment: f_comment,
2143            #[cfg(feature = "extra-children")]
2144            extra_children,
2145        })
2146    }
2147}
2148
2149impl FromXml for Comment {
2150    fn from_xml<R: BufRead>(
2151        reader: &mut Reader<R>,
2152        start_tag: &BytesStart,
2153        is_empty: bool,
2154    ) -> Result<Self, ParseError> {
2155        #[cfg(feature = "sml-comments")]
2156        let mut f_reference: Option<Reference> = None;
2157        #[cfg(feature = "sml-comments")]
2158        let mut f_author_id: Option<u32> = None;
2159        #[cfg(feature = "sml-comments")]
2160        let mut f_guid = None;
2161        #[cfg(feature = "sml-comments")]
2162        let mut f_shape_id = None;
2163        #[cfg(feature = "sml-comments")]
2164        let mut f_text: Option<Box<RichString>> = None;
2165        let mut f_comment_pr = None;
2166        #[cfg(feature = "extra-attrs")]
2167        let mut extra_attrs = std::collections::HashMap::new();
2168        #[cfg(feature = "extra-children")]
2169        let mut extra_children = Vec::new();
2170        #[cfg(feature = "extra-children")]
2171        let mut child_idx: usize = 0;
2172
2173        // Parse attributes
2174        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2175            let val = String::from_utf8_lossy(&attr.value);
2176            match attr.key.local_name().as_ref() {
2177                #[cfg(feature = "sml-comments")]
2178                b"ref" => {
2179                    f_reference = Some(val.into_owned());
2180                }
2181                #[cfg(feature = "sml-comments")]
2182                b"authorId" => {
2183                    f_author_id = val.parse().ok();
2184                }
2185                #[cfg(feature = "sml-comments")]
2186                b"guid" => {
2187                    f_guid = Some(val.into_owned());
2188                }
2189                #[cfg(feature = "sml-comments")]
2190                b"shapeId" => {
2191                    f_shape_id = val.parse().ok();
2192                }
2193                #[cfg(feature = "extra-attrs")]
2194                unknown => {
2195                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
2196                    extra_attrs.insert(key, val.into_owned());
2197                }
2198                #[cfg(not(feature = "extra-attrs"))]
2199                _ => {}
2200            }
2201        }
2202
2203        // Parse child elements
2204        if !is_empty {
2205            let mut buf = Vec::new();
2206            loop {
2207                match reader.read_event_into(&mut buf)? {
2208                    Event::Start(e) => {
2209                        match e.local_name().as_ref() {
2210                            #[cfg(feature = "sml-comments")]
2211                            b"text" => {
2212                                f_text = Some(Box::new(RichString::from_xml(reader, &e, false)?));
2213                                #[cfg(feature = "extra-children")]
2214                                {
2215                                    child_idx += 1;
2216                                }
2217                            }
2218                            b"commentPr" => {
2219                                f_comment_pr =
2220                                    Some(Box::new(CTCommentPr::from_xml(reader, &e, false)?));
2221                                #[cfg(feature = "extra-children")]
2222                                {
2223                                    child_idx += 1;
2224                                }
2225                            }
2226                            #[cfg(feature = "extra-children")]
2227                            _ => {
2228                                // Capture unknown element for roundtrip
2229                                let elem = RawXmlElement::from_reader(reader, &e)?;
2230                                extra_children.push(PositionedNode::new(
2231                                    child_idx,
2232                                    RawXmlNode::Element(elem),
2233                                ));
2234                                child_idx += 1;
2235                            }
2236                            #[cfg(not(feature = "extra-children"))]
2237                            _ => {
2238                                // Skip unknown element
2239                                skip_element(reader)?;
2240                            }
2241                        }
2242                    }
2243                    Event::Empty(e) => {
2244                        match e.local_name().as_ref() {
2245                            #[cfg(feature = "sml-comments")]
2246                            b"text" => {
2247                                f_text = Some(Box::new(RichString::from_xml(reader, &e, true)?));
2248                                #[cfg(feature = "extra-children")]
2249                                {
2250                                    child_idx += 1;
2251                                }
2252                            }
2253                            b"commentPr" => {
2254                                f_comment_pr =
2255                                    Some(Box::new(CTCommentPr::from_xml(reader, &e, true)?));
2256                                #[cfg(feature = "extra-children")]
2257                                {
2258                                    child_idx += 1;
2259                                }
2260                            }
2261                            #[cfg(feature = "extra-children")]
2262                            _ => {
2263                                // Capture unknown empty element for roundtrip
2264                                let elem = RawXmlElement::from_empty(&e);
2265                                extra_children.push(PositionedNode::new(
2266                                    child_idx,
2267                                    RawXmlNode::Element(elem),
2268                                ));
2269                                child_idx += 1;
2270                            }
2271                            #[cfg(not(feature = "extra-children"))]
2272                            _ => {}
2273                        }
2274                    }
2275                    Event::End(_) => break,
2276                    Event::Eof => break,
2277                    _ => {}
2278                }
2279                buf.clear();
2280            }
2281        }
2282
2283        Ok(Self {
2284            #[cfg(feature = "sml-comments")]
2285            reference: f_reference
2286                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
2287            #[cfg(feature = "sml-comments")]
2288            author_id: f_author_id
2289                .ok_or_else(|| ParseError::MissingAttribute("authorId".to_string()))?,
2290            #[cfg(feature = "sml-comments")]
2291            guid: f_guid,
2292            #[cfg(feature = "sml-comments")]
2293            shape_id: f_shape_id,
2294            #[cfg(feature = "sml-comments")]
2295            text: f_text.ok_or_else(|| ParseError::MissingAttribute("text".to_string()))?,
2296            comment_pr: f_comment_pr,
2297            #[cfg(feature = "extra-attrs")]
2298            extra_attrs,
2299            #[cfg(feature = "extra-children")]
2300            extra_children,
2301        })
2302    }
2303}
2304
2305impl FromXml for CTCommentPr {
2306    fn from_xml<R: BufRead>(
2307        reader: &mut Reader<R>,
2308        start_tag: &BytesStart,
2309        is_empty: bool,
2310    ) -> Result<Self, ParseError> {
2311        let mut f_locked = None;
2312        let mut f_default_size = None;
2313        let mut f_print = None;
2314        let mut f_disabled = None;
2315        let mut f_auto_fill = None;
2316        let mut f_auto_line = None;
2317        let mut f_alt_text = None;
2318        let mut f_text_h_align = None;
2319        let mut f_text_v_align = None;
2320        let mut f_lock_text = None;
2321        let mut f_just_last_x = None;
2322        let mut f_auto_scale = None;
2323        let mut f_anchor: Option<Box<ObjectAnchor>> = None;
2324        #[cfg(feature = "extra-attrs")]
2325        let mut extra_attrs = std::collections::HashMap::new();
2326        #[cfg(feature = "extra-children")]
2327        let mut extra_children = Vec::new();
2328        #[cfg(feature = "extra-children")]
2329        let mut child_idx: usize = 0;
2330
2331        // Parse attributes
2332        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2333            let val = String::from_utf8_lossy(&attr.value);
2334            match attr.key.local_name().as_ref() {
2335                b"locked" => {
2336                    f_locked = Some(val == "true" || val == "1");
2337                }
2338                b"defaultSize" => {
2339                    f_default_size = Some(val == "true" || val == "1");
2340                }
2341                b"print" => {
2342                    f_print = Some(val == "true" || val == "1");
2343                }
2344                b"disabled" => {
2345                    f_disabled = Some(val == "true" || val == "1");
2346                }
2347                b"autoFill" => {
2348                    f_auto_fill = Some(val == "true" || val == "1");
2349                }
2350                b"autoLine" => {
2351                    f_auto_line = Some(val == "true" || val == "1");
2352                }
2353                b"altText" => {
2354                    f_alt_text = Some(val.into_owned());
2355                }
2356                b"textHAlign" => {
2357                    f_text_h_align = val.parse().ok();
2358                }
2359                b"textVAlign" => {
2360                    f_text_v_align = val.parse().ok();
2361                }
2362                b"lockText" => {
2363                    f_lock_text = Some(val == "true" || val == "1");
2364                }
2365                b"justLastX" => {
2366                    f_just_last_x = Some(val == "true" || val == "1");
2367                }
2368                b"autoScale" => {
2369                    f_auto_scale = Some(val == "true" || val == "1");
2370                }
2371                #[cfg(feature = "extra-attrs")]
2372                unknown => {
2373                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
2374                    extra_attrs.insert(key, val.into_owned());
2375                }
2376                #[cfg(not(feature = "extra-attrs"))]
2377                _ => {}
2378            }
2379        }
2380
2381        // Parse child elements
2382        if !is_empty {
2383            let mut buf = Vec::new();
2384            loop {
2385                match reader.read_event_into(&mut buf)? {
2386                    Event::Start(e) => {
2387                        match e.local_name().as_ref() {
2388                            b"anchor" => {
2389                                f_anchor =
2390                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, false)?));
2391                                #[cfg(feature = "extra-children")]
2392                                {
2393                                    child_idx += 1;
2394                                }
2395                            }
2396                            #[cfg(feature = "extra-children")]
2397                            _ => {
2398                                // Capture unknown element for roundtrip
2399                                let elem = RawXmlElement::from_reader(reader, &e)?;
2400                                extra_children.push(PositionedNode::new(
2401                                    child_idx,
2402                                    RawXmlNode::Element(elem),
2403                                ));
2404                                child_idx += 1;
2405                            }
2406                            #[cfg(not(feature = "extra-children"))]
2407                            _ => {
2408                                // Skip unknown element
2409                                skip_element(reader)?;
2410                            }
2411                        }
2412                    }
2413                    Event::Empty(e) => {
2414                        match e.local_name().as_ref() {
2415                            b"anchor" => {
2416                                f_anchor =
2417                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, true)?));
2418                                #[cfg(feature = "extra-children")]
2419                                {
2420                                    child_idx += 1;
2421                                }
2422                            }
2423                            #[cfg(feature = "extra-children")]
2424                            _ => {
2425                                // Capture unknown empty element for roundtrip
2426                                let elem = RawXmlElement::from_empty(&e);
2427                                extra_children.push(PositionedNode::new(
2428                                    child_idx,
2429                                    RawXmlNode::Element(elem),
2430                                ));
2431                                child_idx += 1;
2432                            }
2433                            #[cfg(not(feature = "extra-children"))]
2434                            _ => {}
2435                        }
2436                    }
2437                    Event::End(_) => break,
2438                    Event::Eof => break,
2439                    _ => {}
2440                }
2441                buf.clear();
2442            }
2443        }
2444
2445        Ok(Self {
2446            locked: f_locked,
2447            default_size: f_default_size,
2448            print: f_print,
2449            disabled: f_disabled,
2450            auto_fill: f_auto_fill,
2451            auto_line: f_auto_line,
2452            alt_text: f_alt_text,
2453            text_h_align: f_text_h_align,
2454            text_v_align: f_text_v_align,
2455            lock_text: f_lock_text,
2456            just_last_x: f_just_last_x,
2457            auto_scale: f_auto_scale,
2458            anchor: f_anchor.ok_or_else(|| ParseError::MissingAttribute("anchor".to_string()))?,
2459            #[cfg(feature = "extra-attrs")]
2460            extra_attrs,
2461            #[cfg(feature = "extra-children")]
2462            extra_children,
2463        })
2464    }
2465}
2466
2467impl FromXml for MapInfo {
2468    fn from_xml<R: BufRead>(
2469        reader: &mut Reader<R>,
2470        start_tag: &BytesStart,
2471        is_empty: bool,
2472    ) -> Result<Self, ParseError> {
2473        let mut f_selection_namespaces: Option<String> = None;
2474        let mut f_schema = Vec::new();
2475        let mut f_map = Vec::new();
2476        #[cfg(feature = "extra-attrs")]
2477        let mut extra_attrs = std::collections::HashMap::new();
2478        #[cfg(feature = "extra-children")]
2479        let mut extra_children = Vec::new();
2480        #[cfg(feature = "extra-children")]
2481        let mut child_idx: usize = 0;
2482
2483        // Parse attributes
2484        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2485            let val = String::from_utf8_lossy(&attr.value);
2486            match attr.key.local_name().as_ref() {
2487                b"SelectionNamespaces" => {
2488                    f_selection_namespaces = Some(val.into_owned());
2489                }
2490                #[cfg(feature = "extra-attrs")]
2491                unknown => {
2492                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
2493                    extra_attrs.insert(key, val.into_owned());
2494                }
2495                #[cfg(not(feature = "extra-attrs"))]
2496                _ => {}
2497            }
2498        }
2499
2500        // Parse child elements
2501        if !is_empty {
2502            let mut buf = Vec::new();
2503            loop {
2504                match reader.read_event_into(&mut buf)? {
2505                    Event::Start(e) => {
2506                        match e.local_name().as_ref() {
2507                            b"Schema" => {
2508                                f_schema.push(XmlSchema::from_xml(reader, &e, false)?);
2509                                #[cfg(feature = "extra-children")]
2510                                {
2511                                    child_idx += 1;
2512                                }
2513                            }
2514                            b"Map" => {
2515                                f_map.push(XmlMap::from_xml(reader, &e, false)?);
2516                                #[cfg(feature = "extra-children")]
2517                                {
2518                                    child_idx += 1;
2519                                }
2520                            }
2521                            #[cfg(feature = "extra-children")]
2522                            _ => {
2523                                // Capture unknown element for roundtrip
2524                                let elem = RawXmlElement::from_reader(reader, &e)?;
2525                                extra_children.push(PositionedNode::new(
2526                                    child_idx,
2527                                    RawXmlNode::Element(elem),
2528                                ));
2529                                child_idx += 1;
2530                            }
2531                            #[cfg(not(feature = "extra-children"))]
2532                            _ => {
2533                                // Skip unknown element
2534                                skip_element(reader)?;
2535                            }
2536                        }
2537                    }
2538                    Event::Empty(e) => {
2539                        match e.local_name().as_ref() {
2540                            b"Schema" => {
2541                                f_schema.push(XmlSchema::from_xml(reader, &e, true)?);
2542                                #[cfg(feature = "extra-children")]
2543                                {
2544                                    child_idx += 1;
2545                                }
2546                            }
2547                            b"Map" => {
2548                                f_map.push(XmlMap::from_xml(reader, &e, true)?);
2549                                #[cfg(feature = "extra-children")]
2550                                {
2551                                    child_idx += 1;
2552                                }
2553                            }
2554                            #[cfg(feature = "extra-children")]
2555                            _ => {
2556                                // Capture unknown empty element for roundtrip
2557                                let elem = RawXmlElement::from_empty(&e);
2558                                extra_children.push(PositionedNode::new(
2559                                    child_idx,
2560                                    RawXmlNode::Element(elem),
2561                                ));
2562                                child_idx += 1;
2563                            }
2564                            #[cfg(not(feature = "extra-children"))]
2565                            _ => {}
2566                        }
2567                    }
2568                    Event::End(_) => break,
2569                    Event::Eof => break,
2570                    _ => {}
2571                }
2572                buf.clear();
2573            }
2574        }
2575
2576        Ok(Self {
2577            selection_namespaces: f_selection_namespaces
2578                .ok_or_else(|| ParseError::MissingAttribute("SelectionNamespaces".to_string()))?,
2579            schema: f_schema,
2580            map: f_map,
2581            #[cfg(feature = "extra-attrs")]
2582            extra_attrs,
2583            #[cfg(feature = "extra-children")]
2584            extra_children,
2585        })
2586    }
2587}
2588
2589impl FromXml for XmlSchema {
2590    fn from_xml<R: BufRead>(
2591        reader: &mut Reader<R>,
2592        start_tag: &BytesStart,
2593        is_empty: bool,
2594    ) -> Result<Self, ParseError> {
2595        #[cfg(feature = "extra-children")]
2596        let mut extra_children = Vec::new();
2597        #[cfg(feature = "extra-children")]
2598        let mut child_idx: usize = 0;
2599        if !is_empty {
2600            let mut buf = Vec::new();
2601            loop {
2602                match reader.read_event_into(&mut buf)? {
2603                    #[cfg(feature = "extra-children")]
2604                    Event::Start(e) => {
2605                        let elem = RawXmlElement::from_reader(reader, &e)?;
2606                        extra_children
2607                            .push(PositionedNode::new(child_idx, RawXmlNode::Element(elem)));
2608                        child_idx += 1;
2609                    }
2610                    #[cfg(not(feature = "extra-children"))]
2611                    Event::Start(_) => {
2612                        skip_element(reader)?;
2613                    }
2614                    #[cfg(feature = "extra-children")]
2615                    Event::Empty(e) => {
2616                        let elem = RawXmlElement::from_empty(&e);
2617                        extra_children
2618                            .push(PositionedNode::new(child_idx, RawXmlNode::Element(elem)));
2619                        child_idx += 1;
2620                    }
2621                    #[cfg(not(feature = "extra-children"))]
2622                    Event::Empty(_) => {}
2623                    Event::End(_) => break,
2624                    Event::Eof => break,
2625                    _ => {}
2626                }
2627                buf.clear();
2628            }
2629        }
2630        Ok(Self {
2631            #[cfg(feature = "extra-children")]
2632            extra_children,
2633        })
2634    }
2635}
2636
2637impl FromXml for XmlMap {
2638    fn from_xml<R: BufRead>(
2639        reader: &mut Reader<R>,
2640        start_tag: &BytesStart,
2641        is_empty: bool,
2642    ) -> Result<Self, ParseError> {
2643        let mut f_i_d: Option<u32> = None;
2644        let mut f_name: Option<String> = None;
2645        let mut f_root_element: Option<String> = None;
2646        let mut f_schema_i_d: Option<String> = None;
2647        let mut f_show_import_export_validation_errors: Option<bool> = None;
2648        let mut f_auto_fit: Option<bool> = None;
2649        let mut f_append: Option<bool> = None;
2650        let mut f_preserve_sort_a_f_layout: Option<bool> = None;
2651        let mut f_preserve_format: Option<bool> = None;
2652        let mut f_data_binding = None;
2653        #[cfg(feature = "extra-attrs")]
2654        let mut extra_attrs = std::collections::HashMap::new();
2655        #[cfg(feature = "extra-children")]
2656        let mut extra_children = Vec::new();
2657        #[cfg(feature = "extra-children")]
2658        let mut child_idx: usize = 0;
2659
2660        // Parse attributes
2661        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2662            let val = String::from_utf8_lossy(&attr.value);
2663            match attr.key.local_name().as_ref() {
2664                b"ID" => {
2665                    f_i_d = val.parse().ok();
2666                }
2667                b"Name" => {
2668                    f_name = Some(val.into_owned());
2669                }
2670                b"RootElement" => {
2671                    f_root_element = Some(val.into_owned());
2672                }
2673                b"SchemaID" => {
2674                    f_schema_i_d = Some(val.into_owned());
2675                }
2676                b"ShowImportExportValidationErrors" => {
2677                    f_show_import_export_validation_errors = Some(val == "true" || val == "1");
2678                }
2679                b"AutoFit" => {
2680                    f_auto_fit = Some(val == "true" || val == "1");
2681                }
2682                b"Append" => {
2683                    f_append = Some(val == "true" || val == "1");
2684                }
2685                b"PreserveSortAFLayout" => {
2686                    f_preserve_sort_a_f_layout = Some(val == "true" || val == "1");
2687                }
2688                b"PreserveFormat" => {
2689                    f_preserve_format = Some(val == "true" || val == "1");
2690                }
2691                #[cfg(feature = "extra-attrs")]
2692                unknown => {
2693                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
2694                    extra_attrs.insert(key, val.into_owned());
2695                }
2696                #[cfg(not(feature = "extra-attrs"))]
2697                _ => {}
2698            }
2699        }
2700
2701        // Parse child elements
2702        if !is_empty {
2703            let mut buf = Vec::new();
2704            loop {
2705                match reader.read_event_into(&mut buf)? {
2706                    Event::Start(e) => {
2707                        match e.local_name().as_ref() {
2708                            b"DataBinding" => {
2709                                f_data_binding =
2710                                    Some(Box::new(DataBinding::from_xml(reader, &e, false)?));
2711                                #[cfg(feature = "extra-children")]
2712                                {
2713                                    child_idx += 1;
2714                                }
2715                            }
2716                            #[cfg(feature = "extra-children")]
2717                            _ => {
2718                                // Capture unknown element for roundtrip
2719                                let elem = RawXmlElement::from_reader(reader, &e)?;
2720                                extra_children.push(PositionedNode::new(
2721                                    child_idx,
2722                                    RawXmlNode::Element(elem),
2723                                ));
2724                                child_idx += 1;
2725                            }
2726                            #[cfg(not(feature = "extra-children"))]
2727                            _ => {
2728                                // Skip unknown element
2729                                skip_element(reader)?;
2730                            }
2731                        }
2732                    }
2733                    Event::Empty(e) => {
2734                        match e.local_name().as_ref() {
2735                            b"DataBinding" => {
2736                                f_data_binding =
2737                                    Some(Box::new(DataBinding::from_xml(reader, &e, true)?));
2738                                #[cfg(feature = "extra-children")]
2739                                {
2740                                    child_idx += 1;
2741                                }
2742                            }
2743                            #[cfg(feature = "extra-children")]
2744                            _ => {
2745                                // Capture unknown empty element for roundtrip
2746                                let elem = RawXmlElement::from_empty(&e);
2747                                extra_children.push(PositionedNode::new(
2748                                    child_idx,
2749                                    RawXmlNode::Element(elem),
2750                                ));
2751                                child_idx += 1;
2752                            }
2753                            #[cfg(not(feature = "extra-children"))]
2754                            _ => {}
2755                        }
2756                    }
2757                    Event::End(_) => break,
2758                    Event::Eof => break,
2759                    _ => {}
2760                }
2761                buf.clear();
2762            }
2763        }
2764
2765        Ok(Self {
2766            i_d: f_i_d.ok_or_else(|| ParseError::MissingAttribute("ID".to_string()))?,
2767            name: f_name.ok_or_else(|| ParseError::MissingAttribute("Name".to_string()))?,
2768            root_element: f_root_element
2769                .ok_or_else(|| ParseError::MissingAttribute("RootElement".to_string()))?,
2770            schema_i_d: f_schema_i_d
2771                .ok_or_else(|| ParseError::MissingAttribute("SchemaID".to_string()))?,
2772            show_import_export_validation_errors: f_show_import_export_validation_errors
2773                .ok_or_else(|| {
2774                    ParseError::MissingAttribute("ShowImportExportValidationErrors".to_string())
2775                })?,
2776            auto_fit: f_auto_fit
2777                .ok_or_else(|| ParseError::MissingAttribute("AutoFit".to_string()))?,
2778            append: f_append.ok_or_else(|| ParseError::MissingAttribute("Append".to_string()))?,
2779            preserve_sort_a_f_layout: f_preserve_sort_a_f_layout
2780                .ok_or_else(|| ParseError::MissingAttribute("PreserveSortAFLayout".to_string()))?,
2781            preserve_format: f_preserve_format
2782                .ok_or_else(|| ParseError::MissingAttribute("PreserveFormat".to_string()))?,
2783            data_binding: f_data_binding,
2784            #[cfg(feature = "extra-attrs")]
2785            extra_attrs,
2786            #[cfg(feature = "extra-children")]
2787            extra_children,
2788        })
2789    }
2790}
2791
2792impl FromXml for DataBinding {
2793    fn from_xml<R: BufRead>(
2794        reader: &mut Reader<R>,
2795        start_tag: &BytesStart,
2796        is_empty: bool,
2797    ) -> Result<Self, ParseError> {
2798        let mut f_data_binding_name = None;
2799        let mut f_file_binding = None;
2800        let mut f_connection_i_d = None;
2801        let mut f_file_binding_name = None;
2802        let mut f_data_binding_load_mode: Option<u32> = None;
2803        #[cfg(feature = "extra-attrs")]
2804        let mut extra_attrs = std::collections::HashMap::new();
2805
2806        // Parse attributes
2807        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2808            let val = String::from_utf8_lossy(&attr.value);
2809            match attr.key.local_name().as_ref() {
2810                b"DataBindingName" => {
2811                    f_data_binding_name = Some(val.into_owned());
2812                }
2813                b"FileBinding" => {
2814                    f_file_binding = Some(val == "true" || val == "1");
2815                }
2816                b"ConnectionID" => {
2817                    f_connection_i_d = val.parse().ok();
2818                }
2819                b"FileBindingName" => {
2820                    f_file_binding_name = Some(val.into_owned());
2821                }
2822                b"DataBindingLoadMode" => {
2823                    f_data_binding_load_mode = val.parse().ok();
2824                }
2825                #[cfg(feature = "extra-attrs")]
2826                unknown => {
2827                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
2828                    extra_attrs.insert(key, val.into_owned());
2829                }
2830                #[cfg(not(feature = "extra-attrs"))]
2831                _ => {}
2832            }
2833        }
2834
2835        if !is_empty {
2836            let mut buf = Vec::new();
2837            loop {
2838                match reader.read_event_into(&mut buf)? {
2839                    Event::End(_) => break,
2840                    Event::Eof => break,
2841                    _ => {}
2842                }
2843                buf.clear();
2844            }
2845        }
2846
2847        Ok(Self {
2848            data_binding_name: f_data_binding_name,
2849            file_binding: f_file_binding,
2850            connection_i_d: f_connection_i_d,
2851            file_binding_name: f_file_binding_name,
2852            data_binding_load_mode: f_data_binding_load_mode
2853                .ok_or_else(|| ParseError::MissingAttribute("DataBindingLoadMode".to_string()))?,
2854            #[cfg(feature = "extra-attrs")]
2855            extra_attrs,
2856        })
2857    }
2858}
2859
2860impl FromXml for Connections {
2861    fn from_xml<R: BufRead>(
2862        reader: &mut Reader<R>,
2863        start_tag: &BytesStart,
2864        is_empty: bool,
2865    ) -> Result<Self, ParseError> {
2866        let mut f_connection = Vec::new();
2867        #[cfg(feature = "extra-children")]
2868        let mut extra_children = Vec::new();
2869        #[cfg(feature = "extra-children")]
2870        let mut child_idx: usize = 0;
2871
2872        // Parse child elements
2873        if !is_empty {
2874            let mut buf = Vec::new();
2875            loop {
2876                match reader.read_event_into(&mut buf)? {
2877                    Event::Start(e) => {
2878                        match e.local_name().as_ref() {
2879                            b"connection" => {
2880                                f_connection.push(Connection::from_xml(reader, &e, false)?);
2881                                #[cfg(feature = "extra-children")]
2882                                {
2883                                    child_idx += 1;
2884                                }
2885                            }
2886                            #[cfg(feature = "extra-children")]
2887                            _ => {
2888                                // Capture unknown element for roundtrip
2889                                let elem = RawXmlElement::from_reader(reader, &e)?;
2890                                extra_children.push(PositionedNode::new(
2891                                    child_idx,
2892                                    RawXmlNode::Element(elem),
2893                                ));
2894                                child_idx += 1;
2895                            }
2896                            #[cfg(not(feature = "extra-children"))]
2897                            _ => {
2898                                // Skip unknown element
2899                                skip_element(reader)?;
2900                            }
2901                        }
2902                    }
2903                    Event::Empty(e) => {
2904                        match e.local_name().as_ref() {
2905                            b"connection" => {
2906                                f_connection.push(Connection::from_xml(reader, &e, true)?);
2907                                #[cfg(feature = "extra-children")]
2908                                {
2909                                    child_idx += 1;
2910                                }
2911                            }
2912                            #[cfg(feature = "extra-children")]
2913                            _ => {
2914                                // Capture unknown empty element for roundtrip
2915                                let elem = RawXmlElement::from_empty(&e);
2916                                extra_children.push(PositionedNode::new(
2917                                    child_idx,
2918                                    RawXmlNode::Element(elem),
2919                                ));
2920                                child_idx += 1;
2921                            }
2922                            #[cfg(not(feature = "extra-children"))]
2923                            _ => {}
2924                        }
2925                    }
2926                    Event::End(_) => break,
2927                    Event::Eof => break,
2928                    _ => {}
2929                }
2930                buf.clear();
2931            }
2932        }
2933
2934        Ok(Self {
2935            connection: f_connection,
2936            #[cfg(feature = "extra-children")]
2937            extra_children,
2938        })
2939    }
2940}
2941
2942impl FromXml for Connection {
2943    fn from_xml<R: BufRead>(
2944        reader: &mut Reader<R>,
2945        start_tag: &BytesStart,
2946        is_empty: bool,
2947    ) -> Result<Self, ParseError> {
2948        let mut f_id: Option<u32> = None;
2949        let mut f_source_file = None;
2950        let mut f_odc_file = None;
2951        let mut f_keep_alive = None;
2952        let mut f_interval = None;
2953        let mut f_name = None;
2954        let mut f_description = None;
2955        let mut f_type = None;
2956        let mut f_reconnection_method = None;
2957        let mut f_refreshed_version: Option<u8> = None;
2958        let mut f_min_refreshable_version = None;
2959        let mut f_save_password = None;
2960        let mut f_new = None;
2961        let mut f_deleted = None;
2962        let mut f_only_use_connection_file = None;
2963        let mut f_background = None;
2964        let mut f_refresh_on_load = None;
2965        let mut f_save_data = None;
2966        let mut f_credentials = None;
2967        let mut f_single_sign_on_id = None;
2968        let mut f_db_pr = None;
2969        let mut f_olap_pr = None;
2970        let mut f_web_pr = None;
2971        let mut f_text_pr = None;
2972        let mut f_parameters = None;
2973        let mut f_extension_list = None;
2974        #[cfg(feature = "extra-attrs")]
2975        let mut extra_attrs = std::collections::HashMap::new();
2976        #[cfg(feature = "extra-children")]
2977        let mut extra_children = Vec::new();
2978        #[cfg(feature = "extra-children")]
2979        let mut child_idx: usize = 0;
2980
2981        // Parse attributes
2982        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
2983            let val = String::from_utf8_lossy(&attr.value);
2984            match attr.key.local_name().as_ref() {
2985                b"id" => {
2986                    f_id = val.parse().ok();
2987                }
2988                b"sourceFile" => {
2989                    f_source_file = Some(val.into_owned());
2990                }
2991                b"odcFile" => {
2992                    f_odc_file = Some(val.into_owned());
2993                }
2994                b"keepAlive" => {
2995                    f_keep_alive = Some(val == "true" || val == "1");
2996                }
2997                b"interval" => {
2998                    f_interval = val.parse().ok();
2999                }
3000                b"name" => {
3001                    f_name = Some(val.into_owned());
3002                }
3003                b"description" => {
3004                    f_description = Some(val.into_owned());
3005                }
3006                b"type" => {
3007                    f_type = val.parse().ok();
3008                }
3009                b"reconnectionMethod" => {
3010                    f_reconnection_method = val.parse().ok();
3011                }
3012                b"refreshedVersion" => {
3013                    f_refreshed_version = val.parse().ok();
3014                }
3015                b"minRefreshableVersion" => {
3016                    f_min_refreshable_version = val.parse().ok();
3017                }
3018                b"savePassword" => {
3019                    f_save_password = Some(val == "true" || val == "1");
3020                }
3021                b"new" => {
3022                    f_new = Some(val == "true" || val == "1");
3023                }
3024                b"deleted" => {
3025                    f_deleted = Some(val == "true" || val == "1");
3026                }
3027                b"onlyUseConnectionFile" => {
3028                    f_only_use_connection_file = Some(val == "true" || val == "1");
3029                }
3030                b"background" => {
3031                    f_background = Some(val == "true" || val == "1");
3032                }
3033                b"refreshOnLoad" => {
3034                    f_refresh_on_load = Some(val == "true" || val == "1");
3035                }
3036                b"saveData" => {
3037                    f_save_data = Some(val == "true" || val == "1");
3038                }
3039                b"credentials" => {
3040                    f_credentials = val.parse().ok();
3041                }
3042                b"singleSignOnId" => {
3043                    f_single_sign_on_id = Some(val.into_owned());
3044                }
3045                #[cfg(feature = "extra-attrs")]
3046                unknown => {
3047                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3048                    extra_attrs.insert(key, val.into_owned());
3049                }
3050                #[cfg(not(feature = "extra-attrs"))]
3051                _ => {}
3052            }
3053        }
3054
3055        // Parse child elements
3056        if !is_empty {
3057            let mut buf = Vec::new();
3058            loop {
3059                match reader.read_event_into(&mut buf)? {
3060                    Event::Start(e) => {
3061                        match e.local_name().as_ref() {
3062                            b"dbPr" => {
3063                                f_db_pr = Some(Box::new(DatabaseProperties::from_xml(
3064                                    reader, &e, false,
3065                                )?));
3066                                #[cfg(feature = "extra-children")]
3067                                {
3068                                    child_idx += 1;
3069                                }
3070                            }
3071                            b"olapPr" => {
3072                                f_olap_pr =
3073                                    Some(Box::new(OlapProperties::from_xml(reader, &e, false)?));
3074                                #[cfg(feature = "extra-children")]
3075                                {
3076                                    child_idx += 1;
3077                                }
3078                            }
3079                            b"webPr" => {
3080                                f_web_pr = Some(Box::new(WebQueryProperties::from_xml(
3081                                    reader, &e, false,
3082                                )?));
3083                                #[cfg(feature = "extra-children")]
3084                                {
3085                                    child_idx += 1;
3086                                }
3087                            }
3088                            b"textPr" => {
3089                                f_text_pr = Some(Box::new(TextImportProperties::from_xml(
3090                                    reader, &e, false,
3091                                )?));
3092                                #[cfg(feature = "extra-children")]
3093                                {
3094                                    child_idx += 1;
3095                                }
3096                            }
3097                            b"parameters" => {
3098                                f_parameters =
3099                                    Some(Box::new(Parameters::from_xml(reader, &e, false)?));
3100                                #[cfg(feature = "extra-children")]
3101                                {
3102                                    child_idx += 1;
3103                                }
3104                            }
3105                            b"extLst" => {
3106                                f_extension_list =
3107                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
3108                                #[cfg(feature = "extra-children")]
3109                                {
3110                                    child_idx += 1;
3111                                }
3112                            }
3113                            #[cfg(feature = "extra-children")]
3114                            _ => {
3115                                // Capture unknown element for roundtrip
3116                                let elem = RawXmlElement::from_reader(reader, &e)?;
3117                                extra_children.push(PositionedNode::new(
3118                                    child_idx,
3119                                    RawXmlNode::Element(elem),
3120                                ));
3121                                child_idx += 1;
3122                            }
3123                            #[cfg(not(feature = "extra-children"))]
3124                            _ => {
3125                                // Skip unknown element
3126                                skip_element(reader)?;
3127                            }
3128                        }
3129                    }
3130                    Event::Empty(e) => {
3131                        match e.local_name().as_ref() {
3132                            b"dbPr" => {
3133                                f_db_pr =
3134                                    Some(Box::new(DatabaseProperties::from_xml(reader, &e, true)?));
3135                                #[cfg(feature = "extra-children")]
3136                                {
3137                                    child_idx += 1;
3138                                }
3139                            }
3140                            b"olapPr" => {
3141                                f_olap_pr =
3142                                    Some(Box::new(OlapProperties::from_xml(reader, &e, true)?));
3143                                #[cfg(feature = "extra-children")]
3144                                {
3145                                    child_idx += 1;
3146                                }
3147                            }
3148                            b"webPr" => {
3149                                f_web_pr =
3150                                    Some(Box::new(WebQueryProperties::from_xml(reader, &e, true)?));
3151                                #[cfg(feature = "extra-children")]
3152                                {
3153                                    child_idx += 1;
3154                                }
3155                            }
3156                            b"textPr" => {
3157                                f_text_pr = Some(Box::new(TextImportProperties::from_xml(
3158                                    reader, &e, true,
3159                                )?));
3160                                #[cfg(feature = "extra-children")]
3161                                {
3162                                    child_idx += 1;
3163                                }
3164                            }
3165                            b"parameters" => {
3166                                f_parameters =
3167                                    Some(Box::new(Parameters::from_xml(reader, &e, true)?));
3168                                #[cfg(feature = "extra-children")]
3169                                {
3170                                    child_idx += 1;
3171                                }
3172                            }
3173                            b"extLst" => {
3174                                f_extension_list =
3175                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
3176                                #[cfg(feature = "extra-children")]
3177                                {
3178                                    child_idx += 1;
3179                                }
3180                            }
3181                            #[cfg(feature = "extra-children")]
3182                            _ => {
3183                                // Capture unknown empty element for roundtrip
3184                                let elem = RawXmlElement::from_empty(&e);
3185                                extra_children.push(PositionedNode::new(
3186                                    child_idx,
3187                                    RawXmlNode::Element(elem),
3188                                ));
3189                                child_idx += 1;
3190                            }
3191                            #[cfg(not(feature = "extra-children"))]
3192                            _ => {}
3193                        }
3194                    }
3195                    Event::End(_) => break,
3196                    Event::Eof => break,
3197                    _ => {}
3198                }
3199                buf.clear();
3200            }
3201        }
3202
3203        Ok(Self {
3204            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
3205            source_file: f_source_file,
3206            odc_file: f_odc_file,
3207            keep_alive: f_keep_alive,
3208            interval: f_interval,
3209            name: f_name,
3210            description: f_description,
3211            r#type: f_type,
3212            reconnection_method: f_reconnection_method,
3213            refreshed_version: f_refreshed_version
3214                .ok_or_else(|| ParseError::MissingAttribute("refreshedVersion".to_string()))?,
3215            min_refreshable_version: f_min_refreshable_version,
3216            save_password: f_save_password,
3217            new: f_new,
3218            deleted: f_deleted,
3219            only_use_connection_file: f_only_use_connection_file,
3220            background: f_background,
3221            refresh_on_load: f_refresh_on_load,
3222            save_data: f_save_data,
3223            credentials: f_credentials,
3224            single_sign_on_id: f_single_sign_on_id,
3225            db_pr: f_db_pr,
3226            olap_pr: f_olap_pr,
3227            web_pr: f_web_pr,
3228            text_pr: f_text_pr,
3229            parameters: f_parameters,
3230            extension_list: f_extension_list,
3231            #[cfg(feature = "extra-attrs")]
3232            extra_attrs,
3233            #[cfg(feature = "extra-children")]
3234            extra_children,
3235        })
3236    }
3237}
3238
3239impl FromXml for DatabaseProperties {
3240    fn from_xml<R: BufRead>(
3241        reader: &mut Reader<R>,
3242        start_tag: &BytesStart,
3243        is_empty: bool,
3244    ) -> Result<Self, ParseError> {
3245        let mut f_connection: Option<XmlString> = None;
3246        let mut f_command = None;
3247        let mut f_server_command = None;
3248        let mut f_command_type = None;
3249        #[cfg(feature = "extra-attrs")]
3250        let mut extra_attrs = std::collections::HashMap::new();
3251
3252        // Parse attributes
3253        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3254            let val = String::from_utf8_lossy(&attr.value);
3255            match attr.key.local_name().as_ref() {
3256                b"connection" => {
3257                    f_connection = Some(val.into_owned());
3258                }
3259                b"command" => {
3260                    f_command = Some(val.into_owned());
3261                }
3262                b"serverCommand" => {
3263                    f_server_command = Some(val.into_owned());
3264                }
3265                b"commandType" => {
3266                    f_command_type = val.parse().ok();
3267                }
3268                #[cfg(feature = "extra-attrs")]
3269                unknown => {
3270                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3271                    extra_attrs.insert(key, val.into_owned());
3272                }
3273                #[cfg(not(feature = "extra-attrs"))]
3274                _ => {}
3275            }
3276        }
3277
3278        if !is_empty {
3279            let mut buf = Vec::new();
3280            loop {
3281                match reader.read_event_into(&mut buf)? {
3282                    Event::End(_) => break,
3283                    Event::Eof => break,
3284                    _ => {}
3285                }
3286                buf.clear();
3287            }
3288        }
3289
3290        Ok(Self {
3291            connection: f_connection
3292                .ok_or_else(|| ParseError::MissingAttribute("connection".to_string()))?,
3293            command: f_command,
3294            server_command: f_server_command,
3295            command_type: f_command_type,
3296            #[cfg(feature = "extra-attrs")]
3297            extra_attrs,
3298        })
3299    }
3300}
3301
3302impl FromXml for OlapProperties {
3303    fn from_xml<R: BufRead>(
3304        reader: &mut Reader<R>,
3305        start_tag: &BytesStart,
3306        is_empty: bool,
3307    ) -> Result<Self, ParseError> {
3308        let mut f_local = None;
3309        let mut f_local_connection = None;
3310        let mut f_local_refresh = None;
3311        let mut f_send_locale = None;
3312        let mut f_row_drill_count = None;
3313        let mut f_server_fill = None;
3314        let mut f_server_number_format = None;
3315        let mut f_server_font = None;
3316        let mut f_server_font_color = None;
3317        #[cfg(feature = "extra-attrs")]
3318        let mut extra_attrs = std::collections::HashMap::new();
3319
3320        // Parse attributes
3321        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3322            let val = String::from_utf8_lossy(&attr.value);
3323            match attr.key.local_name().as_ref() {
3324                b"local" => {
3325                    f_local = Some(val == "true" || val == "1");
3326                }
3327                b"localConnection" => {
3328                    f_local_connection = Some(val.into_owned());
3329                }
3330                b"localRefresh" => {
3331                    f_local_refresh = Some(val == "true" || val == "1");
3332                }
3333                b"sendLocale" => {
3334                    f_send_locale = Some(val == "true" || val == "1");
3335                }
3336                b"rowDrillCount" => {
3337                    f_row_drill_count = val.parse().ok();
3338                }
3339                b"serverFill" => {
3340                    f_server_fill = Some(val == "true" || val == "1");
3341                }
3342                b"serverNumberFormat" => {
3343                    f_server_number_format = Some(val == "true" || val == "1");
3344                }
3345                b"serverFont" => {
3346                    f_server_font = Some(val == "true" || val == "1");
3347                }
3348                b"serverFontColor" => {
3349                    f_server_font_color = Some(val == "true" || val == "1");
3350                }
3351                #[cfg(feature = "extra-attrs")]
3352                unknown => {
3353                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3354                    extra_attrs.insert(key, val.into_owned());
3355                }
3356                #[cfg(not(feature = "extra-attrs"))]
3357                _ => {}
3358            }
3359        }
3360
3361        if !is_empty {
3362            let mut buf = Vec::new();
3363            loop {
3364                match reader.read_event_into(&mut buf)? {
3365                    Event::End(_) => break,
3366                    Event::Eof => break,
3367                    _ => {}
3368                }
3369                buf.clear();
3370            }
3371        }
3372
3373        Ok(Self {
3374            local: f_local,
3375            local_connection: f_local_connection,
3376            local_refresh: f_local_refresh,
3377            send_locale: f_send_locale,
3378            row_drill_count: f_row_drill_count,
3379            server_fill: f_server_fill,
3380            server_number_format: f_server_number_format,
3381            server_font: f_server_font,
3382            server_font_color: f_server_font_color,
3383            #[cfg(feature = "extra-attrs")]
3384            extra_attrs,
3385        })
3386    }
3387}
3388
3389impl FromXml for WebQueryProperties {
3390    fn from_xml<R: BufRead>(
3391        reader: &mut Reader<R>,
3392        start_tag: &BytesStart,
3393        is_empty: bool,
3394    ) -> Result<Self, ParseError> {
3395        let mut f_xml = None;
3396        let mut f_source_data = None;
3397        let mut f_parse_pre = None;
3398        let mut f_consecutive = None;
3399        let mut f_first_row = None;
3400        let mut f_xl97 = None;
3401        let mut f_text_dates = None;
3402        let mut f_xl2000 = None;
3403        let mut f_url = None;
3404        let mut f_post = None;
3405        let mut f_html_tables = None;
3406        let mut f_html_format = None;
3407        let mut f_edit_page = None;
3408        let mut f_tables = None;
3409        #[cfg(feature = "extra-attrs")]
3410        let mut extra_attrs = std::collections::HashMap::new();
3411        #[cfg(feature = "extra-children")]
3412        let mut extra_children = Vec::new();
3413        #[cfg(feature = "extra-children")]
3414        let mut child_idx: usize = 0;
3415
3416        // Parse attributes
3417        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3418            let val = String::from_utf8_lossy(&attr.value);
3419            match attr.key.local_name().as_ref() {
3420                b"xml" => {
3421                    f_xml = Some(val == "true" || val == "1");
3422                }
3423                b"sourceData" => {
3424                    f_source_data = Some(val == "true" || val == "1");
3425                }
3426                b"parsePre" => {
3427                    f_parse_pre = Some(val == "true" || val == "1");
3428                }
3429                b"consecutive" => {
3430                    f_consecutive = Some(val == "true" || val == "1");
3431                }
3432                b"firstRow" => {
3433                    f_first_row = Some(val == "true" || val == "1");
3434                }
3435                b"xl97" => {
3436                    f_xl97 = Some(val == "true" || val == "1");
3437                }
3438                b"textDates" => {
3439                    f_text_dates = Some(val == "true" || val == "1");
3440                }
3441                b"xl2000" => {
3442                    f_xl2000 = Some(val == "true" || val == "1");
3443                }
3444                b"url" => {
3445                    f_url = Some(val.into_owned());
3446                }
3447                b"post" => {
3448                    f_post = Some(val.into_owned());
3449                }
3450                b"htmlTables" => {
3451                    f_html_tables = Some(val == "true" || val == "1");
3452                }
3453                b"htmlFormat" => {
3454                    f_html_format = val.parse().ok();
3455                }
3456                b"editPage" => {
3457                    f_edit_page = Some(val.into_owned());
3458                }
3459                #[cfg(feature = "extra-attrs")]
3460                unknown => {
3461                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3462                    extra_attrs.insert(key, val.into_owned());
3463                }
3464                #[cfg(not(feature = "extra-attrs"))]
3465                _ => {}
3466            }
3467        }
3468
3469        // Parse child elements
3470        if !is_empty {
3471            let mut buf = Vec::new();
3472            loop {
3473                match reader.read_event_into(&mut buf)? {
3474                    Event::Start(e) => {
3475                        match e.local_name().as_ref() {
3476                            b"tables" => {
3477                                f_tables = Some(Box::new(DataTables::from_xml(reader, &e, false)?));
3478                                #[cfg(feature = "extra-children")]
3479                                {
3480                                    child_idx += 1;
3481                                }
3482                            }
3483                            #[cfg(feature = "extra-children")]
3484                            _ => {
3485                                // Capture unknown element for roundtrip
3486                                let elem = RawXmlElement::from_reader(reader, &e)?;
3487                                extra_children.push(PositionedNode::new(
3488                                    child_idx,
3489                                    RawXmlNode::Element(elem),
3490                                ));
3491                                child_idx += 1;
3492                            }
3493                            #[cfg(not(feature = "extra-children"))]
3494                            _ => {
3495                                // Skip unknown element
3496                                skip_element(reader)?;
3497                            }
3498                        }
3499                    }
3500                    Event::Empty(e) => {
3501                        match e.local_name().as_ref() {
3502                            b"tables" => {
3503                                f_tables = Some(Box::new(DataTables::from_xml(reader, &e, true)?));
3504                                #[cfg(feature = "extra-children")]
3505                                {
3506                                    child_idx += 1;
3507                                }
3508                            }
3509                            #[cfg(feature = "extra-children")]
3510                            _ => {
3511                                // Capture unknown empty element for roundtrip
3512                                let elem = RawXmlElement::from_empty(&e);
3513                                extra_children.push(PositionedNode::new(
3514                                    child_idx,
3515                                    RawXmlNode::Element(elem),
3516                                ));
3517                                child_idx += 1;
3518                            }
3519                            #[cfg(not(feature = "extra-children"))]
3520                            _ => {}
3521                        }
3522                    }
3523                    Event::End(_) => break,
3524                    Event::Eof => break,
3525                    _ => {}
3526                }
3527                buf.clear();
3528            }
3529        }
3530
3531        Ok(Self {
3532            xml: f_xml,
3533            source_data: f_source_data,
3534            parse_pre: f_parse_pre,
3535            consecutive: f_consecutive,
3536            first_row: f_first_row,
3537            xl97: f_xl97,
3538            text_dates: f_text_dates,
3539            xl2000: f_xl2000,
3540            url: f_url,
3541            post: f_post,
3542            html_tables: f_html_tables,
3543            html_format: f_html_format,
3544            edit_page: f_edit_page,
3545            tables: f_tables,
3546            #[cfg(feature = "extra-attrs")]
3547            extra_attrs,
3548            #[cfg(feature = "extra-children")]
3549            extra_children,
3550        })
3551    }
3552}
3553
3554impl FromXml for Parameters {
3555    fn from_xml<R: BufRead>(
3556        reader: &mut Reader<R>,
3557        start_tag: &BytesStart,
3558        is_empty: bool,
3559    ) -> Result<Self, ParseError> {
3560        let mut f_count = None;
3561        let mut f_parameter = Vec::new();
3562        #[cfg(feature = "extra-attrs")]
3563        let mut extra_attrs = std::collections::HashMap::new();
3564        #[cfg(feature = "extra-children")]
3565        let mut extra_children = Vec::new();
3566        #[cfg(feature = "extra-children")]
3567        let mut child_idx: usize = 0;
3568
3569        // Parse attributes
3570        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3571            let val = String::from_utf8_lossy(&attr.value);
3572            match attr.key.local_name().as_ref() {
3573                b"count" => {
3574                    f_count = val.parse().ok();
3575                }
3576                #[cfg(feature = "extra-attrs")]
3577                unknown => {
3578                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3579                    extra_attrs.insert(key, val.into_owned());
3580                }
3581                #[cfg(not(feature = "extra-attrs"))]
3582                _ => {}
3583            }
3584        }
3585
3586        // Parse child elements
3587        if !is_empty {
3588            let mut buf = Vec::new();
3589            loop {
3590                match reader.read_event_into(&mut buf)? {
3591                    Event::Start(e) => {
3592                        match e.local_name().as_ref() {
3593                            b"parameter" => {
3594                                f_parameter.push(Parameter::from_xml(reader, &e, false)?);
3595                                #[cfg(feature = "extra-children")]
3596                                {
3597                                    child_idx += 1;
3598                                }
3599                            }
3600                            #[cfg(feature = "extra-children")]
3601                            _ => {
3602                                // Capture unknown element for roundtrip
3603                                let elem = RawXmlElement::from_reader(reader, &e)?;
3604                                extra_children.push(PositionedNode::new(
3605                                    child_idx,
3606                                    RawXmlNode::Element(elem),
3607                                ));
3608                                child_idx += 1;
3609                            }
3610                            #[cfg(not(feature = "extra-children"))]
3611                            _ => {
3612                                // Skip unknown element
3613                                skip_element(reader)?;
3614                            }
3615                        }
3616                    }
3617                    Event::Empty(e) => {
3618                        match e.local_name().as_ref() {
3619                            b"parameter" => {
3620                                f_parameter.push(Parameter::from_xml(reader, &e, true)?);
3621                                #[cfg(feature = "extra-children")]
3622                                {
3623                                    child_idx += 1;
3624                                }
3625                            }
3626                            #[cfg(feature = "extra-children")]
3627                            _ => {
3628                                // Capture unknown empty element for roundtrip
3629                                let elem = RawXmlElement::from_empty(&e);
3630                                extra_children.push(PositionedNode::new(
3631                                    child_idx,
3632                                    RawXmlNode::Element(elem),
3633                                ));
3634                                child_idx += 1;
3635                            }
3636                            #[cfg(not(feature = "extra-children"))]
3637                            _ => {}
3638                        }
3639                    }
3640                    Event::End(_) => break,
3641                    Event::Eof => break,
3642                    _ => {}
3643                }
3644                buf.clear();
3645            }
3646        }
3647
3648        Ok(Self {
3649            count: f_count,
3650            parameter: f_parameter,
3651            #[cfg(feature = "extra-attrs")]
3652            extra_attrs,
3653            #[cfg(feature = "extra-children")]
3654            extra_children,
3655        })
3656    }
3657}
3658
3659impl FromXml for Parameter {
3660    fn from_xml<R: BufRead>(
3661        reader: &mut Reader<R>,
3662        start_tag: &BytesStart,
3663        is_empty: bool,
3664    ) -> Result<Self, ParseError> {
3665        let mut f_name = None;
3666        let mut f_sql_type = None;
3667        let mut f_parameter_type = None;
3668        let mut f_refresh_on_change = None;
3669        let mut f_prompt = None;
3670        let mut f_boolean = None;
3671        let mut f_double = None;
3672        let mut f_integer = None;
3673        let mut f_string = None;
3674        let mut f_cell = None;
3675        #[cfg(feature = "extra-attrs")]
3676        let mut extra_attrs = std::collections::HashMap::new();
3677
3678        // Parse attributes
3679        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3680            let val = String::from_utf8_lossy(&attr.value);
3681            match attr.key.local_name().as_ref() {
3682                b"name" => {
3683                    f_name = Some(val.into_owned());
3684                }
3685                b"sqlType" => {
3686                    f_sql_type = val.parse().ok();
3687                }
3688                b"parameterType" => {
3689                    f_parameter_type = val.parse().ok();
3690                }
3691                b"refreshOnChange" => {
3692                    f_refresh_on_change = Some(val == "true" || val == "1");
3693                }
3694                b"prompt" => {
3695                    f_prompt = Some(val.into_owned());
3696                }
3697                b"boolean" => {
3698                    f_boolean = Some(val == "true" || val == "1");
3699                }
3700                b"double" => {
3701                    f_double = val.parse().ok();
3702                }
3703                b"integer" => {
3704                    f_integer = val.parse().ok();
3705                }
3706                b"string" => {
3707                    f_string = Some(val.into_owned());
3708                }
3709                b"cell" => {
3710                    f_cell = Some(val.into_owned());
3711                }
3712                #[cfg(feature = "extra-attrs")]
3713                unknown => {
3714                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3715                    extra_attrs.insert(key, val.into_owned());
3716                }
3717                #[cfg(not(feature = "extra-attrs"))]
3718                _ => {}
3719            }
3720        }
3721
3722        if !is_empty {
3723            let mut buf = Vec::new();
3724            loop {
3725                match reader.read_event_into(&mut buf)? {
3726                    Event::End(_) => break,
3727                    Event::Eof => break,
3728                    _ => {}
3729                }
3730                buf.clear();
3731            }
3732        }
3733
3734        Ok(Self {
3735            name: f_name,
3736            sql_type: f_sql_type,
3737            parameter_type: f_parameter_type,
3738            refresh_on_change: f_refresh_on_change,
3739            prompt: f_prompt,
3740            boolean: f_boolean,
3741            double: f_double,
3742            integer: f_integer,
3743            string: f_string,
3744            cell: f_cell,
3745            #[cfg(feature = "extra-attrs")]
3746            extra_attrs,
3747        })
3748    }
3749}
3750
3751impl FromXml for DataTables {
3752    fn from_xml<R: BufRead>(
3753        reader: &mut Reader<R>,
3754        start_tag: &BytesStart,
3755        is_empty: bool,
3756    ) -> Result<Self, ParseError> {
3757        let mut f_count = None;
3758        let mut f_m = Vec::new();
3759        let mut f_style_index = Vec::new();
3760        let mut f_x = Vec::new();
3761        #[cfg(feature = "extra-attrs")]
3762        let mut extra_attrs = std::collections::HashMap::new();
3763        #[cfg(feature = "extra-children")]
3764        let mut extra_children = Vec::new();
3765        #[cfg(feature = "extra-children")]
3766        let mut child_idx: usize = 0;
3767
3768        // Parse attributes
3769        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3770            let val = String::from_utf8_lossy(&attr.value);
3771            match attr.key.local_name().as_ref() {
3772                b"count" => {
3773                    f_count = val.parse().ok();
3774                }
3775                #[cfg(feature = "extra-attrs")]
3776                unknown => {
3777                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
3778                    extra_attrs.insert(key, val.into_owned());
3779                }
3780                #[cfg(not(feature = "extra-attrs"))]
3781                _ => {}
3782            }
3783        }
3784
3785        // Parse child elements
3786        if !is_empty {
3787            let mut buf = Vec::new();
3788            loop {
3789                match reader.read_event_into(&mut buf)? {
3790                    Event::Start(e) => {
3791                        match e.local_name().as_ref() {
3792                            b"m" => {
3793                                f_m.push(TableMissing::from_xml(reader, &e, false)?);
3794                                #[cfg(feature = "extra-children")]
3795                                {
3796                                    child_idx += 1;
3797                                }
3798                            }
3799                            b"s" => {
3800                                f_style_index.push(CTXStringElement::from_xml(reader, &e, false)?);
3801                                #[cfg(feature = "extra-children")]
3802                                {
3803                                    child_idx += 1;
3804                                }
3805                            }
3806                            b"x" => {
3807                                f_x.push(CTIndex::from_xml(reader, &e, false)?);
3808                                #[cfg(feature = "extra-children")]
3809                                {
3810                                    child_idx += 1;
3811                                }
3812                            }
3813                            #[cfg(feature = "extra-children")]
3814                            _ => {
3815                                // Capture unknown element for roundtrip
3816                                let elem = RawXmlElement::from_reader(reader, &e)?;
3817                                extra_children.push(PositionedNode::new(
3818                                    child_idx,
3819                                    RawXmlNode::Element(elem),
3820                                ));
3821                                child_idx += 1;
3822                            }
3823                            #[cfg(not(feature = "extra-children"))]
3824                            _ => {
3825                                // Skip unknown element
3826                                skip_element(reader)?;
3827                            }
3828                        }
3829                    }
3830                    Event::Empty(e) => {
3831                        match e.local_name().as_ref() {
3832                            b"m" => {
3833                                f_m.push(TableMissing::from_xml(reader, &e, true)?);
3834                                #[cfg(feature = "extra-children")]
3835                                {
3836                                    child_idx += 1;
3837                                }
3838                            }
3839                            b"s" => {
3840                                f_style_index.push(CTXStringElement::from_xml(reader, &e, true)?);
3841                                #[cfg(feature = "extra-children")]
3842                                {
3843                                    child_idx += 1;
3844                                }
3845                            }
3846                            b"x" => {
3847                                f_x.push(CTIndex::from_xml(reader, &e, true)?);
3848                                #[cfg(feature = "extra-children")]
3849                                {
3850                                    child_idx += 1;
3851                                }
3852                            }
3853                            #[cfg(feature = "extra-children")]
3854                            _ => {
3855                                // Capture unknown empty element for roundtrip
3856                                let elem = RawXmlElement::from_empty(&e);
3857                                extra_children.push(PositionedNode::new(
3858                                    child_idx,
3859                                    RawXmlNode::Element(elem),
3860                                ));
3861                                child_idx += 1;
3862                            }
3863                            #[cfg(not(feature = "extra-children"))]
3864                            _ => {}
3865                        }
3866                    }
3867                    Event::End(_) => break,
3868                    Event::Eof => break,
3869                    _ => {}
3870                }
3871                buf.clear();
3872            }
3873        }
3874
3875        Ok(Self {
3876            count: f_count,
3877            m: f_m,
3878            style_index: f_style_index,
3879            x: f_x,
3880            #[cfg(feature = "extra-attrs")]
3881            extra_attrs,
3882            #[cfg(feature = "extra-children")]
3883            extra_children,
3884        })
3885    }
3886}
3887
3888impl FromXml for TableMissing {
3889    fn from_xml<R: BufRead>(
3890        reader: &mut Reader<R>,
3891        _start: &BytesStart,
3892        is_empty: bool,
3893    ) -> Result<Self, ParseError> {
3894        if !is_empty {
3895            let mut buf = Vec::new();
3896            let mut depth = 1u32;
3897            loop {
3898                match reader.read_event_into(&mut buf)? {
3899                    Event::Start(_) => depth += 1,
3900                    Event::End(_) => {
3901                        depth -= 1;
3902                        if depth == 0 {
3903                            break;
3904                        }
3905                    }
3906                    Event::Eof => break,
3907                    _ => {}
3908                }
3909                buf.clear();
3910            }
3911        }
3912        Ok(Self {})
3913    }
3914}
3915
3916impl FromXml for TextImportProperties {
3917    fn from_xml<R: BufRead>(
3918        reader: &mut Reader<R>,
3919        start_tag: &BytesStart,
3920        is_empty: bool,
3921    ) -> Result<Self, ParseError> {
3922        let mut f_prompt = None;
3923        let mut f_file_type = None;
3924        let mut f_code_page = None;
3925        let mut f_character_set = None;
3926        let mut f_first_row = None;
3927        let mut f_source_file = None;
3928        let mut f_delimited = None;
3929        let mut f_decimal = None;
3930        let mut f_thousands = None;
3931        let mut f_tab = None;
3932        let mut f_space = None;
3933        let mut f_comma = None;
3934        let mut f_semicolon = None;
3935        let mut f_consecutive = None;
3936        let mut f_qualifier = None;
3937        let mut f_delimiter = None;
3938        let mut f_text_fields = None;
3939        #[cfg(feature = "extra-attrs")]
3940        let mut extra_attrs = std::collections::HashMap::new();
3941        #[cfg(feature = "extra-children")]
3942        let mut extra_children = Vec::new();
3943        #[cfg(feature = "extra-children")]
3944        let mut child_idx: usize = 0;
3945
3946        // Parse attributes
3947        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
3948            let val = String::from_utf8_lossy(&attr.value);
3949            match attr.key.local_name().as_ref() {
3950                b"prompt" => {
3951                    f_prompt = Some(val == "true" || val == "1");
3952                }
3953                b"fileType" => {
3954                    f_file_type = val.parse().ok();
3955                }
3956                b"codePage" => {
3957                    f_code_page = val.parse().ok();
3958                }
3959                b"characterSet" => {
3960                    f_character_set = Some(val.into_owned());
3961                }
3962                b"firstRow" => {
3963                    f_first_row = val.parse().ok();
3964                }
3965                b"sourceFile" => {
3966                    f_source_file = Some(val.into_owned());
3967                }
3968                b"delimited" => {
3969                    f_delimited = Some(val == "true" || val == "1");
3970                }
3971                b"decimal" => {
3972                    f_decimal = Some(val.into_owned());
3973                }
3974                b"thousands" => {
3975                    f_thousands = Some(val.into_owned());
3976                }
3977                b"tab" => {
3978                    f_tab = Some(val == "true" || val == "1");
3979                }
3980                b"space" => {
3981                    f_space = Some(val == "true" || val == "1");
3982                }
3983                b"comma" => {
3984                    f_comma = Some(val == "true" || val == "1");
3985                }
3986                b"semicolon" => {
3987                    f_semicolon = Some(val == "true" || val == "1");
3988                }
3989                b"consecutive" => {
3990                    f_consecutive = Some(val == "true" || val == "1");
3991                }
3992                b"qualifier" => {
3993                    f_qualifier = val.parse().ok();
3994                }
3995                b"delimiter" => {
3996                    f_delimiter = Some(val.into_owned());
3997                }
3998                #[cfg(feature = "extra-attrs")]
3999                unknown => {
4000                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4001                    extra_attrs.insert(key, val.into_owned());
4002                }
4003                #[cfg(not(feature = "extra-attrs"))]
4004                _ => {}
4005            }
4006        }
4007
4008        // Parse child elements
4009        if !is_empty {
4010            let mut buf = Vec::new();
4011            loop {
4012                match reader.read_event_into(&mut buf)? {
4013                    Event::Start(e) => {
4014                        match e.local_name().as_ref() {
4015                            b"textFields" => {
4016                                f_text_fields =
4017                                    Some(Box::new(TextFields::from_xml(reader, &e, false)?));
4018                                #[cfg(feature = "extra-children")]
4019                                {
4020                                    child_idx += 1;
4021                                }
4022                            }
4023                            #[cfg(feature = "extra-children")]
4024                            _ => {
4025                                // Capture unknown element for roundtrip
4026                                let elem = RawXmlElement::from_reader(reader, &e)?;
4027                                extra_children.push(PositionedNode::new(
4028                                    child_idx,
4029                                    RawXmlNode::Element(elem),
4030                                ));
4031                                child_idx += 1;
4032                            }
4033                            #[cfg(not(feature = "extra-children"))]
4034                            _ => {
4035                                // Skip unknown element
4036                                skip_element(reader)?;
4037                            }
4038                        }
4039                    }
4040                    Event::Empty(e) => {
4041                        match e.local_name().as_ref() {
4042                            b"textFields" => {
4043                                f_text_fields =
4044                                    Some(Box::new(TextFields::from_xml(reader, &e, true)?));
4045                                #[cfg(feature = "extra-children")]
4046                                {
4047                                    child_idx += 1;
4048                                }
4049                            }
4050                            #[cfg(feature = "extra-children")]
4051                            _ => {
4052                                // Capture unknown empty element for roundtrip
4053                                let elem = RawXmlElement::from_empty(&e);
4054                                extra_children.push(PositionedNode::new(
4055                                    child_idx,
4056                                    RawXmlNode::Element(elem),
4057                                ));
4058                                child_idx += 1;
4059                            }
4060                            #[cfg(not(feature = "extra-children"))]
4061                            _ => {}
4062                        }
4063                    }
4064                    Event::End(_) => break,
4065                    Event::Eof => break,
4066                    _ => {}
4067                }
4068                buf.clear();
4069            }
4070        }
4071
4072        Ok(Self {
4073            prompt: f_prompt,
4074            file_type: f_file_type,
4075            code_page: f_code_page,
4076            character_set: f_character_set,
4077            first_row: f_first_row,
4078            source_file: f_source_file,
4079            delimited: f_delimited,
4080            decimal: f_decimal,
4081            thousands: f_thousands,
4082            tab: f_tab,
4083            space: f_space,
4084            comma: f_comma,
4085            semicolon: f_semicolon,
4086            consecutive: f_consecutive,
4087            qualifier: f_qualifier,
4088            delimiter: f_delimiter,
4089            text_fields: f_text_fields,
4090            #[cfg(feature = "extra-attrs")]
4091            extra_attrs,
4092            #[cfg(feature = "extra-children")]
4093            extra_children,
4094        })
4095    }
4096}
4097
4098impl FromXml for TextFields {
4099    fn from_xml<R: BufRead>(
4100        reader: &mut Reader<R>,
4101        start_tag: &BytesStart,
4102        is_empty: bool,
4103    ) -> Result<Self, ParseError> {
4104        let mut f_count = None;
4105        let mut f_text_field = Vec::new();
4106        #[cfg(feature = "extra-attrs")]
4107        let mut extra_attrs = std::collections::HashMap::new();
4108        #[cfg(feature = "extra-children")]
4109        let mut extra_children = Vec::new();
4110        #[cfg(feature = "extra-children")]
4111        let mut child_idx: usize = 0;
4112
4113        // Parse attributes
4114        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4115            let val = String::from_utf8_lossy(&attr.value);
4116            match attr.key.local_name().as_ref() {
4117                b"count" => {
4118                    f_count = val.parse().ok();
4119                }
4120                #[cfg(feature = "extra-attrs")]
4121                unknown => {
4122                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4123                    extra_attrs.insert(key, val.into_owned());
4124                }
4125                #[cfg(not(feature = "extra-attrs"))]
4126                _ => {}
4127            }
4128        }
4129
4130        // Parse child elements
4131        if !is_empty {
4132            let mut buf = Vec::new();
4133            loop {
4134                match reader.read_event_into(&mut buf)? {
4135                    Event::Start(e) => {
4136                        match e.local_name().as_ref() {
4137                            b"textField" => {
4138                                f_text_field.push(TextField::from_xml(reader, &e, false)?);
4139                                #[cfg(feature = "extra-children")]
4140                                {
4141                                    child_idx += 1;
4142                                }
4143                            }
4144                            #[cfg(feature = "extra-children")]
4145                            _ => {
4146                                // Capture unknown element for roundtrip
4147                                let elem = RawXmlElement::from_reader(reader, &e)?;
4148                                extra_children.push(PositionedNode::new(
4149                                    child_idx,
4150                                    RawXmlNode::Element(elem),
4151                                ));
4152                                child_idx += 1;
4153                            }
4154                            #[cfg(not(feature = "extra-children"))]
4155                            _ => {
4156                                // Skip unknown element
4157                                skip_element(reader)?;
4158                            }
4159                        }
4160                    }
4161                    Event::Empty(e) => {
4162                        match e.local_name().as_ref() {
4163                            b"textField" => {
4164                                f_text_field.push(TextField::from_xml(reader, &e, true)?);
4165                                #[cfg(feature = "extra-children")]
4166                                {
4167                                    child_idx += 1;
4168                                }
4169                            }
4170                            #[cfg(feature = "extra-children")]
4171                            _ => {
4172                                // Capture unknown empty element for roundtrip
4173                                let elem = RawXmlElement::from_empty(&e);
4174                                extra_children.push(PositionedNode::new(
4175                                    child_idx,
4176                                    RawXmlNode::Element(elem),
4177                                ));
4178                                child_idx += 1;
4179                            }
4180                            #[cfg(not(feature = "extra-children"))]
4181                            _ => {}
4182                        }
4183                    }
4184                    Event::End(_) => break,
4185                    Event::Eof => break,
4186                    _ => {}
4187                }
4188                buf.clear();
4189            }
4190        }
4191
4192        Ok(Self {
4193            count: f_count,
4194            text_field: f_text_field,
4195            #[cfg(feature = "extra-attrs")]
4196            extra_attrs,
4197            #[cfg(feature = "extra-children")]
4198            extra_children,
4199        })
4200    }
4201}
4202
4203impl FromXml for TextField {
4204    fn from_xml<R: BufRead>(
4205        reader: &mut Reader<R>,
4206        start_tag: &BytesStart,
4207        is_empty: bool,
4208    ) -> Result<Self, ParseError> {
4209        let mut f_type = None;
4210        let mut f_position = None;
4211        #[cfg(feature = "extra-attrs")]
4212        let mut extra_attrs = std::collections::HashMap::new();
4213
4214        // Parse attributes
4215        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4216            let val = String::from_utf8_lossy(&attr.value);
4217            match attr.key.local_name().as_ref() {
4218                b"type" => {
4219                    f_type = val.parse().ok();
4220                }
4221                b"position" => {
4222                    f_position = val.parse().ok();
4223                }
4224                #[cfg(feature = "extra-attrs")]
4225                unknown => {
4226                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4227                    extra_attrs.insert(key, val.into_owned());
4228                }
4229                #[cfg(not(feature = "extra-attrs"))]
4230                _ => {}
4231            }
4232        }
4233
4234        if !is_empty {
4235            let mut buf = Vec::new();
4236            loop {
4237                match reader.read_event_into(&mut buf)? {
4238                    Event::End(_) => break,
4239                    Event::Eof => break,
4240                    _ => {}
4241                }
4242                buf.clear();
4243            }
4244        }
4245
4246        Ok(Self {
4247            r#type: f_type,
4248            position: f_position,
4249            #[cfg(feature = "extra-attrs")]
4250            extra_attrs,
4251        })
4252    }
4253}
4254
4255impl FromXml for PivotCacheDefinition {
4256    fn from_xml<R: BufRead>(
4257        reader: &mut Reader<R>,
4258        start_tag: &BytesStart,
4259        is_empty: bool,
4260    ) -> Result<Self, ParseError> {
4261        let mut f_id = None;
4262        let mut f_invalid = None;
4263        let mut f_save_data = None;
4264        let mut f_refresh_on_load = None;
4265        let mut f_optimize_memory = None;
4266        let mut f_enable_refresh = None;
4267        let mut f_refreshed_by = None;
4268        let mut f_refreshed_date = None;
4269        let mut f_refreshed_date_iso = None;
4270        let mut f_background_query = None;
4271        let mut f_missing_items_limit = None;
4272        let mut f_created_version = None;
4273        let mut f_refreshed_version = None;
4274        let mut f_min_refreshable_version = None;
4275        let mut f_record_count = None;
4276        let mut f_upgrade_on_refresh = None;
4277        let mut f_tuple_cache = None;
4278        let mut f_support_subquery = None;
4279        let mut f_support_advanced_drill = None;
4280        let mut f_cache_source: Option<Box<CacheSource>> = None;
4281        let mut f_cache_fields: Option<Box<CacheFields>> = None;
4282        let mut f_cache_hierarchies = None;
4283        let mut f_kpis = None;
4284        let mut f_calculated_items = None;
4285        let mut f_calculated_members = None;
4286        let mut f_dimensions = None;
4287        let mut f_measure_groups = None;
4288        let mut f_maps = None;
4289        let mut f_extension_list = None;
4290        #[cfg(feature = "extra-attrs")]
4291        let mut extra_attrs = std::collections::HashMap::new();
4292        #[cfg(feature = "extra-children")]
4293        let mut extra_children = Vec::new();
4294        #[cfg(feature = "extra-children")]
4295        let mut child_idx: usize = 0;
4296
4297        // Parse attributes
4298        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4299            let val = String::from_utf8_lossy(&attr.value);
4300            match attr.key.local_name().as_ref() {
4301                b"id" => {
4302                    f_id = Some(val.into_owned());
4303                }
4304                b"invalid" => {
4305                    f_invalid = Some(val == "true" || val == "1");
4306                }
4307                b"saveData" => {
4308                    f_save_data = Some(val == "true" || val == "1");
4309                }
4310                b"refreshOnLoad" => {
4311                    f_refresh_on_load = Some(val == "true" || val == "1");
4312                }
4313                b"optimizeMemory" => {
4314                    f_optimize_memory = Some(val == "true" || val == "1");
4315                }
4316                b"enableRefresh" => {
4317                    f_enable_refresh = Some(val == "true" || val == "1");
4318                }
4319                b"refreshedBy" => {
4320                    f_refreshed_by = Some(val.into_owned());
4321                }
4322                b"refreshedDate" => {
4323                    f_refreshed_date = val.parse().ok();
4324                }
4325                b"refreshedDateIso" => {
4326                    f_refreshed_date_iso = Some(val.into_owned());
4327                }
4328                b"backgroundQuery" => {
4329                    f_background_query = Some(val == "true" || val == "1");
4330                }
4331                b"missingItemsLimit" => {
4332                    f_missing_items_limit = val.parse().ok();
4333                }
4334                b"createdVersion" => {
4335                    f_created_version = val.parse().ok();
4336                }
4337                b"refreshedVersion" => {
4338                    f_refreshed_version = val.parse().ok();
4339                }
4340                b"minRefreshableVersion" => {
4341                    f_min_refreshable_version = val.parse().ok();
4342                }
4343                b"recordCount" => {
4344                    f_record_count = val.parse().ok();
4345                }
4346                b"upgradeOnRefresh" => {
4347                    f_upgrade_on_refresh = Some(val == "true" || val == "1");
4348                }
4349                b"tupleCache" => {
4350                    f_tuple_cache = Some(val == "true" || val == "1");
4351                }
4352                b"supportSubquery" => {
4353                    f_support_subquery = Some(val == "true" || val == "1");
4354                }
4355                b"supportAdvancedDrill" => {
4356                    f_support_advanced_drill = Some(val == "true" || val == "1");
4357                }
4358                #[cfg(feature = "extra-attrs")]
4359                unknown => {
4360                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4361                    extra_attrs.insert(key, val.into_owned());
4362                }
4363                #[cfg(not(feature = "extra-attrs"))]
4364                _ => {}
4365            }
4366        }
4367
4368        // Parse child elements
4369        if !is_empty {
4370            let mut buf = Vec::new();
4371            loop {
4372                match reader.read_event_into(&mut buf)? {
4373                    Event::Start(e) => {
4374                        match e.local_name().as_ref() {
4375                            b"cacheSource" => {
4376                                f_cache_source =
4377                                    Some(Box::new(CacheSource::from_xml(reader, &e, false)?));
4378                                #[cfg(feature = "extra-children")]
4379                                {
4380                                    child_idx += 1;
4381                                }
4382                            }
4383                            b"cacheFields" => {
4384                                f_cache_fields =
4385                                    Some(Box::new(CacheFields::from_xml(reader, &e, false)?));
4386                                #[cfg(feature = "extra-children")]
4387                                {
4388                                    child_idx += 1;
4389                                }
4390                            }
4391                            b"cacheHierarchies" => {
4392                                f_cache_hierarchies = Some(Box::new(CTCacheHierarchies::from_xml(
4393                                    reader, &e, false,
4394                                )?));
4395                                #[cfg(feature = "extra-children")]
4396                                {
4397                                    child_idx += 1;
4398                                }
4399                            }
4400                            b"kpis" => {
4401                                f_kpis = Some(Box::new(CTPCDKPIs::from_xml(reader, &e, false)?));
4402                                #[cfg(feature = "extra-children")]
4403                                {
4404                                    child_idx += 1;
4405                                }
4406                            }
4407                            b"calculatedItems" => {
4408                                f_calculated_items =
4409                                    Some(Box::new(CTCalculatedItems::from_xml(reader, &e, false)?));
4410                                #[cfg(feature = "extra-children")]
4411                                {
4412                                    child_idx += 1;
4413                                }
4414                            }
4415                            b"calculatedMembers" => {
4416                                f_calculated_members = Some(Box::new(
4417                                    CTCalculatedMembers::from_xml(reader, &e, false)?,
4418                                ));
4419                                #[cfg(feature = "extra-children")]
4420                                {
4421                                    child_idx += 1;
4422                                }
4423                            }
4424                            b"dimensions" => {
4425                                f_dimensions =
4426                                    Some(Box::new(CTDimensions::from_xml(reader, &e, false)?));
4427                                #[cfg(feature = "extra-children")]
4428                                {
4429                                    child_idx += 1;
4430                                }
4431                            }
4432                            b"measureGroups" => {
4433                                f_measure_groups =
4434                                    Some(Box::new(CTMeasureGroups::from_xml(reader, &e, false)?));
4435                                #[cfg(feature = "extra-children")]
4436                                {
4437                                    child_idx += 1;
4438                                }
4439                            }
4440                            b"maps" => {
4441                                f_maps = Some(Box::new(CTMeasureDimensionMaps::from_xml(
4442                                    reader, &e, false,
4443                                )?));
4444                                #[cfg(feature = "extra-children")]
4445                                {
4446                                    child_idx += 1;
4447                                }
4448                            }
4449                            b"extLst" => {
4450                                f_extension_list =
4451                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
4452                                #[cfg(feature = "extra-children")]
4453                                {
4454                                    child_idx += 1;
4455                                }
4456                            }
4457                            #[cfg(feature = "extra-children")]
4458                            _ => {
4459                                // Capture unknown element for roundtrip
4460                                let elem = RawXmlElement::from_reader(reader, &e)?;
4461                                extra_children.push(PositionedNode::new(
4462                                    child_idx,
4463                                    RawXmlNode::Element(elem),
4464                                ));
4465                                child_idx += 1;
4466                            }
4467                            #[cfg(not(feature = "extra-children"))]
4468                            _ => {
4469                                // Skip unknown element
4470                                skip_element(reader)?;
4471                            }
4472                        }
4473                    }
4474                    Event::Empty(e) => {
4475                        match e.local_name().as_ref() {
4476                            b"cacheSource" => {
4477                                f_cache_source =
4478                                    Some(Box::new(CacheSource::from_xml(reader, &e, true)?));
4479                                #[cfg(feature = "extra-children")]
4480                                {
4481                                    child_idx += 1;
4482                                }
4483                            }
4484                            b"cacheFields" => {
4485                                f_cache_fields =
4486                                    Some(Box::new(CacheFields::from_xml(reader, &e, true)?));
4487                                #[cfg(feature = "extra-children")]
4488                                {
4489                                    child_idx += 1;
4490                                }
4491                            }
4492                            b"cacheHierarchies" => {
4493                                f_cache_hierarchies =
4494                                    Some(Box::new(CTCacheHierarchies::from_xml(reader, &e, true)?));
4495                                #[cfg(feature = "extra-children")]
4496                                {
4497                                    child_idx += 1;
4498                                }
4499                            }
4500                            b"kpis" => {
4501                                f_kpis = Some(Box::new(CTPCDKPIs::from_xml(reader, &e, true)?));
4502                                #[cfg(feature = "extra-children")]
4503                                {
4504                                    child_idx += 1;
4505                                }
4506                            }
4507                            b"calculatedItems" => {
4508                                f_calculated_items =
4509                                    Some(Box::new(CTCalculatedItems::from_xml(reader, &e, true)?));
4510                                #[cfg(feature = "extra-children")]
4511                                {
4512                                    child_idx += 1;
4513                                }
4514                            }
4515                            b"calculatedMembers" => {
4516                                f_calculated_members = Some(Box::new(
4517                                    CTCalculatedMembers::from_xml(reader, &e, true)?,
4518                                ));
4519                                #[cfg(feature = "extra-children")]
4520                                {
4521                                    child_idx += 1;
4522                                }
4523                            }
4524                            b"dimensions" => {
4525                                f_dimensions =
4526                                    Some(Box::new(CTDimensions::from_xml(reader, &e, true)?));
4527                                #[cfg(feature = "extra-children")]
4528                                {
4529                                    child_idx += 1;
4530                                }
4531                            }
4532                            b"measureGroups" => {
4533                                f_measure_groups =
4534                                    Some(Box::new(CTMeasureGroups::from_xml(reader, &e, true)?));
4535                                #[cfg(feature = "extra-children")]
4536                                {
4537                                    child_idx += 1;
4538                                }
4539                            }
4540                            b"maps" => {
4541                                f_maps = Some(Box::new(CTMeasureDimensionMaps::from_xml(
4542                                    reader, &e, true,
4543                                )?));
4544                                #[cfg(feature = "extra-children")]
4545                                {
4546                                    child_idx += 1;
4547                                }
4548                            }
4549                            b"extLst" => {
4550                                f_extension_list =
4551                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
4552                                #[cfg(feature = "extra-children")]
4553                                {
4554                                    child_idx += 1;
4555                                }
4556                            }
4557                            #[cfg(feature = "extra-children")]
4558                            _ => {
4559                                // Capture unknown empty element for roundtrip
4560                                let elem = RawXmlElement::from_empty(&e);
4561                                extra_children.push(PositionedNode::new(
4562                                    child_idx,
4563                                    RawXmlNode::Element(elem),
4564                                ));
4565                                child_idx += 1;
4566                            }
4567                            #[cfg(not(feature = "extra-children"))]
4568                            _ => {}
4569                        }
4570                    }
4571                    Event::End(_) => break,
4572                    Event::Eof => break,
4573                    _ => {}
4574                }
4575                buf.clear();
4576            }
4577        }
4578
4579        Ok(Self {
4580            id: f_id,
4581            invalid: f_invalid,
4582            save_data: f_save_data,
4583            refresh_on_load: f_refresh_on_load,
4584            optimize_memory: f_optimize_memory,
4585            enable_refresh: f_enable_refresh,
4586            refreshed_by: f_refreshed_by,
4587            refreshed_date: f_refreshed_date,
4588            refreshed_date_iso: f_refreshed_date_iso,
4589            background_query: f_background_query,
4590            missing_items_limit: f_missing_items_limit,
4591            created_version: f_created_version,
4592            refreshed_version: f_refreshed_version,
4593            min_refreshable_version: f_min_refreshable_version,
4594            record_count: f_record_count,
4595            upgrade_on_refresh: f_upgrade_on_refresh,
4596            tuple_cache: f_tuple_cache,
4597            support_subquery: f_support_subquery,
4598            support_advanced_drill: f_support_advanced_drill,
4599            cache_source: f_cache_source
4600                .ok_or_else(|| ParseError::MissingAttribute("cacheSource".to_string()))?,
4601            cache_fields: f_cache_fields
4602                .ok_or_else(|| ParseError::MissingAttribute("cacheFields".to_string()))?,
4603            cache_hierarchies: f_cache_hierarchies,
4604            kpis: f_kpis,
4605            calculated_items: f_calculated_items,
4606            calculated_members: f_calculated_members,
4607            dimensions: f_dimensions,
4608            measure_groups: f_measure_groups,
4609            maps: f_maps,
4610            extension_list: f_extension_list,
4611            #[cfg(feature = "extra-attrs")]
4612            extra_attrs,
4613            #[cfg(feature = "extra-children")]
4614            extra_children,
4615        })
4616    }
4617}
4618
4619impl FromXml for CacheFields {
4620    fn from_xml<R: BufRead>(
4621        reader: &mut Reader<R>,
4622        start_tag: &BytesStart,
4623        is_empty: bool,
4624    ) -> Result<Self, ParseError> {
4625        let mut f_count = None;
4626        let mut f_cache_field = Vec::new();
4627        #[cfg(feature = "extra-attrs")]
4628        let mut extra_attrs = std::collections::HashMap::new();
4629        #[cfg(feature = "extra-children")]
4630        let mut extra_children = Vec::new();
4631        #[cfg(feature = "extra-children")]
4632        let mut child_idx: usize = 0;
4633
4634        // Parse attributes
4635        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4636            let val = String::from_utf8_lossy(&attr.value);
4637            match attr.key.local_name().as_ref() {
4638                b"count" => {
4639                    f_count = val.parse().ok();
4640                }
4641                #[cfg(feature = "extra-attrs")]
4642                unknown => {
4643                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4644                    extra_attrs.insert(key, val.into_owned());
4645                }
4646                #[cfg(not(feature = "extra-attrs"))]
4647                _ => {}
4648            }
4649        }
4650
4651        // Parse child elements
4652        if !is_empty {
4653            let mut buf = Vec::new();
4654            loop {
4655                match reader.read_event_into(&mut buf)? {
4656                    Event::Start(e) => {
4657                        match e.local_name().as_ref() {
4658                            b"cacheField" => {
4659                                f_cache_field.push(CacheField::from_xml(reader, &e, false)?);
4660                                #[cfg(feature = "extra-children")]
4661                                {
4662                                    child_idx += 1;
4663                                }
4664                            }
4665                            #[cfg(feature = "extra-children")]
4666                            _ => {
4667                                // Capture unknown element for roundtrip
4668                                let elem = RawXmlElement::from_reader(reader, &e)?;
4669                                extra_children.push(PositionedNode::new(
4670                                    child_idx,
4671                                    RawXmlNode::Element(elem),
4672                                ));
4673                                child_idx += 1;
4674                            }
4675                            #[cfg(not(feature = "extra-children"))]
4676                            _ => {
4677                                // Skip unknown element
4678                                skip_element(reader)?;
4679                            }
4680                        }
4681                    }
4682                    Event::Empty(e) => {
4683                        match e.local_name().as_ref() {
4684                            b"cacheField" => {
4685                                f_cache_field.push(CacheField::from_xml(reader, &e, true)?);
4686                                #[cfg(feature = "extra-children")]
4687                                {
4688                                    child_idx += 1;
4689                                }
4690                            }
4691                            #[cfg(feature = "extra-children")]
4692                            _ => {
4693                                // Capture unknown empty element for roundtrip
4694                                let elem = RawXmlElement::from_empty(&e);
4695                                extra_children.push(PositionedNode::new(
4696                                    child_idx,
4697                                    RawXmlNode::Element(elem),
4698                                ));
4699                                child_idx += 1;
4700                            }
4701                            #[cfg(not(feature = "extra-children"))]
4702                            _ => {}
4703                        }
4704                    }
4705                    Event::End(_) => break,
4706                    Event::Eof => break,
4707                    _ => {}
4708                }
4709                buf.clear();
4710            }
4711        }
4712
4713        Ok(Self {
4714            count: f_count,
4715            cache_field: f_cache_field,
4716            #[cfg(feature = "extra-attrs")]
4717            extra_attrs,
4718            #[cfg(feature = "extra-children")]
4719            extra_children,
4720        })
4721    }
4722}
4723
4724impl FromXml for CacheField {
4725    fn from_xml<R: BufRead>(
4726        reader: &mut Reader<R>,
4727        start_tag: &BytesStart,
4728        is_empty: bool,
4729    ) -> Result<Self, ParseError> {
4730        let mut f_name: Option<XmlString> = None;
4731        let mut f_caption = None;
4732        let mut f_property_name = None;
4733        let mut f_server_field = None;
4734        let mut f_unique_list = None;
4735        let mut f_number_format_id = None;
4736        let mut f_formula = None;
4737        let mut f_sql_type = None;
4738        let mut f_hierarchy = None;
4739        let mut f_level = None;
4740        let mut f_database_field = None;
4741        let mut f_mapping_count = None;
4742        let mut f_member_property_field = None;
4743        let mut f_shared_items = None;
4744        let mut f_field_group = None;
4745        let mut f_mp_map = Vec::new();
4746        let mut f_extension_list = None;
4747        #[cfg(feature = "extra-attrs")]
4748        let mut extra_attrs = std::collections::HashMap::new();
4749        #[cfg(feature = "extra-children")]
4750        let mut extra_children = Vec::new();
4751        #[cfg(feature = "extra-children")]
4752        let mut child_idx: usize = 0;
4753
4754        // Parse attributes
4755        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4756            let val = String::from_utf8_lossy(&attr.value);
4757            match attr.key.local_name().as_ref() {
4758                b"name" => {
4759                    f_name = Some(val.into_owned());
4760                }
4761                b"caption" => {
4762                    f_caption = Some(val.into_owned());
4763                }
4764                b"propertyName" => {
4765                    f_property_name = Some(val.into_owned());
4766                }
4767                b"serverField" => {
4768                    f_server_field = Some(val == "true" || val == "1");
4769                }
4770                b"uniqueList" => {
4771                    f_unique_list = Some(val == "true" || val == "1");
4772                }
4773                b"numFmtId" => {
4774                    f_number_format_id = val.parse().ok();
4775                }
4776                b"formula" => {
4777                    f_formula = Some(val.into_owned());
4778                }
4779                b"sqlType" => {
4780                    f_sql_type = val.parse().ok();
4781                }
4782                b"hierarchy" => {
4783                    f_hierarchy = val.parse().ok();
4784                }
4785                b"level" => {
4786                    f_level = val.parse().ok();
4787                }
4788                b"databaseField" => {
4789                    f_database_field = Some(val == "true" || val == "1");
4790                }
4791                b"mappingCount" => {
4792                    f_mapping_count = val.parse().ok();
4793                }
4794                b"memberPropertyField" => {
4795                    f_member_property_field = Some(val == "true" || val == "1");
4796                }
4797                #[cfg(feature = "extra-attrs")]
4798                unknown => {
4799                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4800                    extra_attrs.insert(key, val.into_owned());
4801                }
4802                #[cfg(not(feature = "extra-attrs"))]
4803                _ => {}
4804            }
4805        }
4806
4807        // Parse child elements
4808        if !is_empty {
4809            let mut buf = Vec::new();
4810            loop {
4811                match reader.read_event_into(&mut buf)? {
4812                    Event::Start(e) => {
4813                        match e.local_name().as_ref() {
4814                            b"sharedItems" => {
4815                                f_shared_items =
4816                                    Some(Box::new(SharedItems::from_xml(reader, &e, false)?));
4817                                #[cfg(feature = "extra-children")]
4818                                {
4819                                    child_idx += 1;
4820                                }
4821                            }
4822                            b"fieldGroup" => {
4823                                f_field_group =
4824                                    Some(Box::new(FieldGroup::from_xml(reader, &e, false)?));
4825                                #[cfg(feature = "extra-children")]
4826                                {
4827                                    child_idx += 1;
4828                                }
4829                            }
4830                            b"mpMap" => {
4831                                f_mp_map.push(CTX::from_xml(reader, &e, false)?);
4832                                #[cfg(feature = "extra-children")]
4833                                {
4834                                    child_idx += 1;
4835                                }
4836                            }
4837                            b"extLst" => {
4838                                f_extension_list =
4839                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
4840                                #[cfg(feature = "extra-children")]
4841                                {
4842                                    child_idx += 1;
4843                                }
4844                            }
4845                            #[cfg(feature = "extra-children")]
4846                            _ => {
4847                                // Capture unknown element for roundtrip
4848                                let elem = RawXmlElement::from_reader(reader, &e)?;
4849                                extra_children.push(PositionedNode::new(
4850                                    child_idx,
4851                                    RawXmlNode::Element(elem),
4852                                ));
4853                                child_idx += 1;
4854                            }
4855                            #[cfg(not(feature = "extra-children"))]
4856                            _ => {
4857                                // Skip unknown element
4858                                skip_element(reader)?;
4859                            }
4860                        }
4861                    }
4862                    Event::Empty(e) => {
4863                        match e.local_name().as_ref() {
4864                            b"sharedItems" => {
4865                                f_shared_items =
4866                                    Some(Box::new(SharedItems::from_xml(reader, &e, true)?));
4867                                #[cfg(feature = "extra-children")]
4868                                {
4869                                    child_idx += 1;
4870                                }
4871                            }
4872                            b"fieldGroup" => {
4873                                f_field_group =
4874                                    Some(Box::new(FieldGroup::from_xml(reader, &e, true)?));
4875                                #[cfg(feature = "extra-children")]
4876                                {
4877                                    child_idx += 1;
4878                                }
4879                            }
4880                            b"mpMap" => {
4881                                f_mp_map.push(CTX::from_xml(reader, &e, true)?);
4882                                #[cfg(feature = "extra-children")]
4883                                {
4884                                    child_idx += 1;
4885                                }
4886                            }
4887                            b"extLst" => {
4888                                f_extension_list =
4889                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
4890                                #[cfg(feature = "extra-children")]
4891                                {
4892                                    child_idx += 1;
4893                                }
4894                            }
4895                            #[cfg(feature = "extra-children")]
4896                            _ => {
4897                                // Capture unknown empty element for roundtrip
4898                                let elem = RawXmlElement::from_empty(&e);
4899                                extra_children.push(PositionedNode::new(
4900                                    child_idx,
4901                                    RawXmlNode::Element(elem),
4902                                ));
4903                                child_idx += 1;
4904                            }
4905                            #[cfg(not(feature = "extra-children"))]
4906                            _ => {}
4907                        }
4908                    }
4909                    Event::End(_) => break,
4910                    Event::Eof => break,
4911                    _ => {}
4912                }
4913                buf.clear();
4914            }
4915        }
4916
4917        Ok(Self {
4918            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
4919            caption: f_caption,
4920            property_name: f_property_name,
4921            server_field: f_server_field,
4922            unique_list: f_unique_list,
4923            number_format_id: f_number_format_id,
4924            formula: f_formula,
4925            sql_type: f_sql_type,
4926            hierarchy: f_hierarchy,
4927            level: f_level,
4928            database_field: f_database_field,
4929            mapping_count: f_mapping_count,
4930            member_property_field: f_member_property_field,
4931            shared_items: f_shared_items,
4932            field_group: f_field_group,
4933            mp_map: f_mp_map,
4934            extension_list: f_extension_list,
4935            #[cfg(feature = "extra-attrs")]
4936            extra_attrs,
4937            #[cfg(feature = "extra-children")]
4938            extra_children,
4939        })
4940    }
4941}
4942
4943impl FromXml for CacheSource {
4944    fn from_xml<R: BufRead>(
4945        reader: &mut Reader<R>,
4946        start_tag: &BytesStart,
4947        is_empty: bool,
4948    ) -> Result<Self, ParseError> {
4949        let mut f_type: Option<STSourceType> = None;
4950        let mut f_connection_id = None;
4951        let mut f_worksheet_source = None;
4952        let mut f_consolidation = None;
4953        let mut f_extension_list = None;
4954        #[cfg(feature = "extra-attrs")]
4955        let mut extra_attrs = std::collections::HashMap::new();
4956        #[cfg(feature = "extra-children")]
4957        let mut extra_children = Vec::new();
4958        #[cfg(feature = "extra-children")]
4959        let mut child_idx: usize = 0;
4960
4961        // Parse attributes
4962        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
4963            let val = String::from_utf8_lossy(&attr.value);
4964            match attr.key.local_name().as_ref() {
4965                b"type" => {
4966                    f_type = val.parse().ok();
4967                }
4968                b"connectionId" => {
4969                    f_connection_id = val.parse().ok();
4970                }
4971                #[cfg(feature = "extra-attrs")]
4972                unknown => {
4973                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
4974                    extra_attrs.insert(key, val.into_owned());
4975                }
4976                #[cfg(not(feature = "extra-attrs"))]
4977                _ => {}
4978            }
4979        }
4980
4981        // Parse child elements
4982        if !is_empty {
4983            let mut buf = Vec::new();
4984            loop {
4985                match reader.read_event_into(&mut buf)? {
4986                    Event::Start(e) => {
4987                        match e.local_name().as_ref() {
4988                            b"worksheetSource" => {
4989                                f_worksheet_source =
4990                                    Some(Box::new(WorksheetSource::from_xml(reader, &e, false)?));
4991                                #[cfg(feature = "extra-children")]
4992                                {
4993                                    child_idx += 1;
4994                                }
4995                            }
4996                            b"consolidation" => {
4997                                f_consolidation =
4998                                    Some(Box::new(Consolidation::from_xml(reader, &e, false)?));
4999                                #[cfg(feature = "extra-children")]
5000                                {
5001                                    child_idx += 1;
5002                                }
5003                            }
5004                            b"extLst" => {
5005                                f_extension_list =
5006                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
5007                                #[cfg(feature = "extra-children")]
5008                                {
5009                                    child_idx += 1;
5010                                }
5011                            }
5012                            #[cfg(feature = "extra-children")]
5013                            _ => {
5014                                // Capture unknown element for roundtrip
5015                                let elem = RawXmlElement::from_reader(reader, &e)?;
5016                                extra_children.push(PositionedNode::new(
5017                                    child_idx,
5018                                    RawXmlNode::Element(elem),
5019                                ));
5020                                child_idx += 1;
5021                            }
5022                            #[cfg(not(feature = "extra-children"))]
5023                            _ => {
5024                                // Skip unknown element
5025                                skip_element(reader)?;
5026                            }
5027                        }
5028                    }
5029                    Event::Empty(e) => {
5030                        match e.local_name().as_ref() {
5031                            b"worksheetSource" => {
5032                                f_worksheet_source =
5033                                    Some(Box::new(WorksheetSource::from_xml(reader, &e, true)?));
5034                                #[cfg(feature = "extra-children")]
5035                                {
5036                                    child_idx += 1;
5037                                }
5038                            }
5039                            b"consolidation" => {
5040                                f_consolidation =
5041                                    Some(Box::new(Consolidation::from_xml(reader, &e, true)?));
5042                                #[cfg(feature = "extra-children")]
5043                                {
5044                                    child_idx += 1;
5045                                }
5046                            }
5047                            b"extLst" => {
5048                                f_extension_list =
5049                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
5050                                #[cfg(feature = "extra-children")]
5051                                {
5052                                    child_idx += 1;
5053                                }
5054                            }
5055                            #[cfg(feature = "extra-children")]
5056                            _ => {
5057                                // Capture unknown empty element for roundtrip
5058                                let elem = RawXmlElement::from_empty(&e);
5059                                extra_children.push(PositionedNode::new(
5060                                    child_idx,
5061                                    RawXmlNode::Element(elem),
5062                                ));
5063                                child_idx += 1;
5064                            }
5065                            #[cfg(not(feature = "extra-children"))]
5066                            _ => {}
5067                        }
5068                    }
5069                    Event::End(_) => break,
5070                    Event::Eof => break,
5071                    _ => {}
5072                }
5073                buf.clear();
5074            }
5075        }
5076
5077        Ok(Self {
5078            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
5079            connection_id: f_connection_id,
5080            worksheet_source: f_worksheet_source,
5081            consolidation: f_consolidation,
5082            extension_list: f_extension_list,
5083            #[cfg(feature = "extra-attrs")]
5084            extra_attrs,
5085            #[cfg(feature = "extra-children")]
5086            extra_children,
5087        })
5088    }
5089}
5090
5091impl FromXml for WorksheetSource {
5092    fn from_xml<R: BufRead>(
5093        reader: &mut Reader<R>,
5094        start_tag: &BytesStart,
5095        is_empty: bool,
5096    ) -> Result<Self, ParseError> {
5097        let mut f_reference = None;
5098        let mut f_name = None;
5099        let mut f_sheet = None;
5100        let mut f_id = None;
5101        #[cfg(feature = "extra-attrs")]
5102        let mut extra_attrs = std::collections::HashMap::new();
5103
5104        // Parse attributes
5105        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5106            let val = String::from_utf8_lossy(&attr.value);
5107            match attr.key.local_name().as_ref() {
5108                b"ref" => {
5109                    f_reference = Some(val.into_owned());
5110                }
5111                b"name" => {
5112                    f_name = Some(val.into_owned());
5113                }
5114                b"sheet" => {
5115                    f_sheet = Some(val.into_owned());
5116                }
5117                b"id" => {
5118                    f_id = Some(val.into_owned());
5119                }
5120                #[cfg(feature = "extra-attrs")]
5121                unknown => {
5122                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5123                    extra_attrs.insert(key, val.into_owned());
5124                }
5125                #[cfg(not(feature = "extra-attrs"))]
5126                _ => {}
5127            }
5128        }
5129
5130        if !is_empty {
5131            let mut buf = Vec::new();
5132            loop {
5133                match reader.read_event_into(&mut buf)? {
5134                    Event::End(_) => break,
5135                    Event::Eof => break,
5136                    _ => {}
5137                }
5138                buf.clear();
5139            }
5140        }
5141
5142        Ok(Self {
5143            reference: f_reference,
5144            name: f_name,
5145            sheet: f_sheet,
5146            id: f_id,
5147            #[cfg(feature = "extra-attrs")]
5148            extra_attrs,
5149        })
5150    }
5151}
5152
5153impl FromXml for Consolidation {
5154    fn from_xml<R: BufRead>(
5155        reader: &mut Reader<R>,
5156        start_tag: &BytesStart,
5157        is_empty: bool,
5158    ) -> Result<Self, ParseError> {
5159        let mut f_auto_page = None;
5160        let mut f_pages = None;
5161        let mut f_range_sets: Option<Box<CTRangeSets>> = None;
5162        #[cfg(feature = "extra-attrs")]
5163        let mut extra_attrs = std::collections::HashMap::new();
5164        #[cfg(feature = "extra-children")]
5165        let mut extra_children = Vec::new();
5166        #[cfg(feature = "extra-children")]
5167        let mut child_idx: usize = 0;
5168
5169        // Parse attributes
5170        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5171            let val = String::from_utf8_lossy(&attr.value);
5172            match attr.key.local_name().as_ref() {
5173                b"autoPage" => {
5174                    f_auto_page = Some(val == "true" || val == "1");
5175                }
5176                #[cfg(feature = "extra-attrs")]
5177                unknown => {
5178                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5179                    extra_attrs.insert(key, val.into_owned());
5180                }
5181                #[cfg(not(feature = "extra-attrs"))]
5182                _ => {}
5183            }
5184        }
5185
5186        // Parse child elements
5187        if !is_empty {
5188            let mut buf = Vec::new();
5189            loop {
5190                match reader.read_event_into(&mut buf)? {
5191                    Event::Start(e) => {
5192                        match e.local_name().as_ref() {
5193                            b"pages" => {
5194                                f_pages = Some(Box::new(CTPages::from_xml(reader, &e, false)?));
5195                                #[cfg(feature = "extra-children")]
5196                                {
5197                                    child_idx += 1;
5198                                }
5199                            }
5200                            b"rangeSets" => {
5201                                f_range_sets =
5202                                    Some(Box::new(CTRangeSets::from_xml(reader, &e, false)?));
5203                                #[cfg(feature = "extra-children")]
5204                                {
5205                                    child_idx += 1;
5206                                }
5207                            }
5208                            #[cfg(feature = "extra-children")]
5209                            _ => {
5210                                // Capture unknown element for roundtrip
5211                                let elem = RawXmlElement::from_reader(reader, &e)?;
5212                                extra_children.push(PositionedNode::new(
5213                                    child_idx,
5214                                    RawXmlNode::Element(elem),
5215                                ));
5216                                child_idx += 1;
5217                            }
5218                            #[cfg(not(feature = "extra-children"))]
5219                            _ => {
5220                                // Skip unknown element
5221                                skip_element(reader)?;
5222                            }
5223                        }
5224                    }
5225                    Event::Empty(e) => {
5226                        match e.local_name().as_ref() {
5227                            b"pages" => {
5228                                f_pages = Some(Box::new(CTPages::from_xml(reader, &e, true)?));
5229                                #[cfg(feature = "extra-children")]
5230                                {
5231                                    child_idx += 1;
5232                                }
5233                            }
5234                            b"rangeSets" => {
5235                                f_range_sets =
5236                                    Some(Box::new(CTRangeSets::from_xml(reader, &e, true)?));
5237                                #[cfg(feature = "extra-children")]
5238                                {
5239                                    child_idx += 1;
5240                                }
5241                            }
5242                            #[cfg(feature = "extra-children")]
5243                            _ => {
5244                                // Capture unknown empty element for roundtrip
5245                                let elem = RawXmlElement::from_empty(&e);
5246                                extra_children.push(PositionedNode::new(
5247                                    child_idx,
5248                                    RawXmlNode::Element(elem),
5249                                ));
5250                                child_idx += 1;
5251                            }
5252                            #[cfg(not(feature = "extra-children"))]
5253                            _ => {}
5254                        }
5255                    }
5256                    Event::End(_) => break,
5257                    Event::Eof => break,
5258                    _ => {}
5259                }
5260                buf.clear();
5261            }
5262        }
5263
5264        Ok(Self {
5265            auto_page: f_auto_page,
5266            pages: f_pages,
5267            range_sets: f_range_sets
5268                .ok_or_else(|| ParseError::MissingAttribute("rangeSets".to_string()))?,
5269            #[cfg(feature = "extra-attrs")]
5270            extra_attrs,
5271            #[cfg(feature = "extra-children")]
5272            extra_children,
5273        })
5274    }
5275}
5276
5277impl FromXml for CTPages {
5278    fn from_xml<R: BufRead>(
5279        reader: &mut Reader<R>,
5280        start_tag: &BytesStart,
5281        is_empty: bool,
5282    ) -> Result<Self, ParseError> {
5283        let mut f_count = None;
5284        let mut f_page = Vec::new();
5285        #[cfg(feature = "extra-attrs")]
5286        let mut extra_attrs = std::collections::HashMap::new();
5287        #[cfg(feature = "extra-children")]
5288        let mut extra_children = Vec::new();
5289        #[cfg(feature = "extra-children")]
5290        let mut child_idx: usize = 0;
5291
5292        // Parse attributes
5293        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5294            let val = String::from_utf8_lossy(&attr.value);
5295            match attr.key.local_name().as_ref() {
5296                b"count" => {
5297                    f_count = val.parse().ok();
5298                }
5299                #[cfg(feature = "extra-attrs")]
5300                unknown => {
5301                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5302                    extra_attrs.insert(key, val.into_owned());
5303                }
5304                #[cfg(not(feature = "extra-attrs"))]
5305                _ => {}
5306            }
5307        }
5308
5309        // Parse child elements
5310        if !is_empty {
5311            let mut buf = Vec::new();
5312            loop {
5313                match reader.read_event_into(&mut buf)? {
5314                    Event::Start(e) => {
5315                        match e.local_name().as_ref() {
5316                            b"page" => {
5317                                f_page.push(CTPCDSCPage::from_xml(reader, &e, false)?);
5318                                #[cfg(feature = "extra-children")]
5319                                {
5320                                    child_idx += 1;
5321                                }
5322                            }
5323                            #[cfg(feature = "extra-children")]
5324                            _ => {
5325                                // Capture unknown element for roundtrip
5326                                let elem = RawXmlElement::from_reader(reader, &e)?;
5327                                extra_children.push(PositionedNode::new(
5328                                    child_idx,
5329                                    RawXmlNode::Element(elem),
5330                                ));
5331                                child_idx += 1;
5332                            }
5333                            #[cfg(not(feature = "extra-children"))]
5334                            _ => {
5335                                // Skip unknown element
5336                                skip_element(reader)?;
5337                            }
5338                        }
5339                    }
5340                    Event::Empty(e) => {
5341                        match e.local_name().as_ref() {
5342                            b"page" => {
5343                                f_page.push(CTPCDSCPage::from_xml(reader, &e, true)?);
5344                                #[cfg(feature = "extra-children")]
5345                                {
5346                                    child_idx += 1;
5347                                }
5348                            }
5349                            #[cfg(feature = "extra-children")]
5350                            _ => {
5351                                // Capture unknown empty element for roundtrip
5352                                let elem = RawXmlElement::from_empty(&e);
5353                                extra_children.push(PositionedNode::new(
5354                                    child_idx,
5355                                    RawXmlNode::Element(elem),
5356                                ));
5357                                child_idx += 1;
5358                            }
5359                            #[cfg(not(feature = "extra-children"))]
5360                            _ => {}
5361                        }
5362                    }
5363                    Event::End(_) => break,
5364                    Event::Eof => break,
5365                    _ => {}
5366                }
5367                buf.clear();
5368            }
5369        }
5370
5371        Ok(Self {
5372            count: f_count,
5373            page: f_page,
5374            #[cfg(feature = "extra-attrs")]
5375            extra_attrs,
5376            #[cfg(feature = "extra-children")]
5377            extra_children,
5378        })
5379    }
5380}
5381
5382impl FromXml for CTPCDSCPage {
5383    fn from_xml<R: BufRead>(
5384        reader: &mut Reader<R>,
5385        start_tag: &BytesStart,
5386        is_empty: bool,
5387    ) -> Result<Self, ParseError> {
5388        let mut f_count = None;
5389        let mut f_page_item = Vec::new();
5390        #[cfg(feature = "extra-attrs")]
5391        let mut extra_attrs = std::collections::HashMap::new();
5392        #[cfg(feature = "extra-children")]
5393        let mut extra_children = Vec::new();
5394        #[cfg(feature = "extra-children")]
5395        let mut child_idx: usize = 0;
5396
5397        // Parse attributes
5398        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5399            let val = String::from_utf8_lossy(&attr.value);
5400            match attr.key.local_name().as_ref() {
5401                b"count" => {
5402                    f_count = val.parse().ok();
5403                }
5404                #[cfg(feature = "extra-attrs")]
5405                unknown => {
5406                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5407                    extra_attrs.insert(key, val.into_owned());
5408                }
5409                #[cfg(not(feature = "extra-attrs"))]
5410                _ => {}
5411            }
5412        }
5413
5414        // Parse child elements
5415        if !is_empty {
5416            let mut buf = Vec::new();
5417            loop {
5418                match reader.read_event_into(&mut buf)? {
5419                    Event::Start(e) => {
5420                        match e.local_name().as_ref() {
5421                            b"pageItem" => {
5422                                f_page_item.push(CTPageItem::from_xml(reader, &e, false)?);
5423                                #[cfg(feature = "extra-children")]
5424                                {
5425                                    child_idx += 1;
5426                                }
5427                            }
5428                            #[cfg(feature = "extra-children")]
5429                            _ => {
5430                                // Capture unknown element for roundtrip
5431                                let elem = RawXmlElement::from_reader(reader, &e)?;
5432                                extra_children.push(PositionedNode::new(
5433                                    child_idx,
5434                                    RawXmlNode::Element(elem),
5435                                ));
5436                                child_idx += 1;
5437                            }
5438                            #[cfg(not(feature = "extra-children"))]
5439                            _ => {
5440                                // Skip unknown element
5441                                skip_element(reader)?;
5442                            }
5443                        }
5444                    }
5445                    Event::Empty(e) => {
5446                        match e.local_name().as_ref() {
5447                            b"pageItem" => {
5448                                f_page_item.push(CTPageItem::from_xml(reader, &e, true)?);
5449                                #[cfg(feature = "extra-children")]
5450                                {
5451                                    child_idx += 1;
5452                                }
5453                            }
5454                            #[cfg(feature = "extra-children")]
5455                            _ => {
5456                                // Capture unknown empty element for roundtrip
5457                                let elem = RawXmlElement::from_empty(&e);
5458                                extra_children.push(PositionedNode::new(
5459                                    child_idx,
5460                                    RawXmlNode::Element(elem),
5461                                ));
5462                                child_idx += 1;
5463                            }
5464                            #[cfg(not(feature = "extra-children"))]
5465                            _ => {}
5466                        }
5467                    }
5468                    Event::End(_) => break,
5469                    Event::Eof => break,
5470                    _ => {}
5471                }
5472                buf.clear();
5473            }
5474        }
5475
5476        Ok(Self {
5477            count: f_count,
5478            page_item: f_page_item,
5479            #[cfg(feature = "extra-attrs")]
5480            extra_attrs,
5481            #[cfg(feature = "extra-children")]
5482            extra_children,
5483        })
5484    }
5485}
5486
5487impl FromXml for CTPageItem {
5488    fn from_xml<R: BufRead>(
5489        reader: &mut Reader<R>,
5490        start_tag: &BytesStart,
5491        is_empty: bool,
5492    ) -> Result<Self, ParseError> {
5493        let mut f_name: Option<XmlString> = None;
5494        #[cfg(feature = "extra-attrs")]
5495        let mut extra_attrs = std::collections::HashMap::new();
5496
5497        // Parse attributes
5498        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5499            let val = String::from_utf8_lossy(&attr.value);
5500            match attr.key.local_name().as_ref() {
5501                b"name" => {
5502                    f_name = Some(val.into_owned());
5503                }
5504                #[cfg(feature = "extra-attrs")]
5505                unknown => {
5506                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5507                    extra_attrs.insert(key, val.into_owned());
5508                }
5509                #[cfg(not(feature = "extra-attrs"))]
5510                _ => {}
5511            }
5512        }
5513
5514        if !is_empty {
5515            let mut buf = Vec::new();
5516            loop {
5517                match reader.read_event_into(&mut buf)? {
5518                    Event::End(_) => break,
5519                    Event::Eof => break,
5520                    _ => {}
5521                }
5522                buf.clear();
5523            }
5524        }
5525
5526        Ok(Self {
5527            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
5528            #[cfg(feature = "extra-attrs")]
5529            extra_attrs,
5530        })
5531    }
5532}
5533
5534impl FromXml for CTRangeSets {
5535    fn from_xml<R: BufRead>(
5536        reader: &mut Reader<R>,
5537        start_tag: &BytesStart,
5538        is_empty: bool,
5539    ) -> Result<Self, ParseError> {
5540        let mut f_count = None;
5541        let mut f_range_set = Vec::new();
5542        #[cfg(feature = "extra-attrs")]
5543        let mut extra_attrs = std::collections::HashMap::new();
5544        #[cfg(feature = "extra-children")]
5545        let mut extra_children = Vec::new();
5546        #[cfg(feature = "extra-children")]
5547        let mut child_idx: usize = 0;
5548
5549        // Parse attributes
5550        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5551            let val = String::from_utf8_lossy(&attr.value);
5552            match attr.key.local_name().as_ref() {
5553                b"count" => {
5554                    f_count = val.parse().ok();
5555                }
5556                #[cfg(feature = "extra-attrs")]
5557                unknown => {
5558                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5559                    extra_attrs.insert(key, val.into_owned());
5560                }
5561                #[cfg(not(feature = "extra-attrs"))]
5562                _ => {}
5563            }
5564        }
5565
5566        // Parse child elements
5567        if !is_empty {
5568            let mut buf = Vec::new();
5569            loop {
5570                match reader.read_event_into(&mut buf)? {
5571                    Event::Start(e) => {
5572                        match e.local_name().as_ref() {
5573                            b"rangeSet" => {
5574                                f_range_set.push(CTRangeSet::from_xml(reader, &e, false)?);
5575                                #[cfg(feature = "extra-children")]
5576                                {
5577                                    child_idx += 1;
5578                                }
5579                            }
5580                            #[cfg(feature = "extra-children")]
5581                            _ => {
5582                                // Capture unknown element for roundtrip
5583                                let elem = RawXmlElement::from_reader(reader, &e)?;
5584                                extra_children.push(PositionedNode::new(
5585                                    child_idx,
5586                                    RawXmlNode::Element(elem),
5587                                ));
5588                                child_idx += 1;
5589                            }
5590                            #[cfg(not(feature = "extra-children"))]
5591                            _ => {
5592                                // Skip unknown element
5593                                skip_element(reader)?;
5594                            }
5595                        }
5596                    }
5597                    Event::Empty(e) => {
5598                        match e.local_name().as_ref() {
5599                            b"rangeSet" => {
5600                                f_range_set.push(CTRangeSet::from_xml(reader, &e, true)?);
5601                                #[cfg(feature = "extra-children")]
5602                                {
5603                                    child_idx += 1;
5604                                }
5605                            }
5606                            #[cfg(feature = "extra-children")]
5607                            _ => {
5608                                // Capture unknown empty element for roundtrip
5609                                let elem = RawXmlElement::from_empty(&e);
5610                                extra_children.push(PositionedNode::new(
5611                                    child_idx,
5612                                    RawXmlNode::Element(elem),
5613                                ));
5614                                child_idx += 1;
5615                            }
5616                            #[cfg(not(feature = "extra-children"))]
5617                            _ => {}
5618                        }
5619                    }
5620                    Event::End(_) => break,
5621                    Event::Eof => break,
5622                    _ => {}
5623                }
5624                buf.clear();
5625            }
5626        }
5627
5628        Ok(Self {
5629            count: f_count,
5630            range_set: f_range_set,
5631            #[cfg(feature = "extra-attrs")]
5632            extra_attrs,
5633            #[cfg(feature = "extra-children")]
5634            extra_children,
5635        })
5636    }
5637}
5638
5639impl FromXml for CTRangeSet {
5640    fn from_xml<R: BufRead>(
5641        reader: &mut Reader<R>,
5642        start_tag: &BytesStart,
5643        is_empty: bool,
5644    ) -> Result<Self, ParseError> {
5645        let mut f_i1 = None;
5646        let mut f_i2 = None;
5647        let mut f_i3 = None;
5648        let mut f_i4 = None;
5649        let mut f_reference = None;
5650        let mut f_name = None;
5651        let mut f_sheet = None;
5652        let mut f_id = None;
5653        #[cfg(feature = "extra-attrs")]
5654        let mut extra_attrs = std::collections::HashMap::new();
5655
5656        // Parse attributes
5657        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5658            let val = String::from_utf8_lossy(&attr.value);
5659            match attr.key.local_name().as_ref() {
5660                b"i1" => {
5661                    f_i1 = val.parse().ok();
5662                }
5663                b"i2" => {
5664                    f_i2 = val.parse().ok();
5665                }
5666                b"i3" => {
5667                    f_i3 = val.parse().ok();
5668                }
5669                b"i4" => {
5670                    f_i4 = val.parse().ok();
5671                }
5672                b"ref" => {
5673                    f_reference = Some(val.into_owned());
5674                }
5675                b"name" => {
5676                    f_name = Some(val.into_owned());
5677                }
5678                b"sheet" => {
5679                    f_sheet = Some(val.into_owned());
5680                }
5681                b"id" => {
5682                    f_id = Some(val.into_owned());
5683                }
5684                #[cfg(feature = "extra-attrs")]
5685                unknown => {
5686                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5687                    extra_attrs.insert(key, val.into_owned());
5688                }
5689                #[cfg(not(feature = "extra-attrs"))]
5690                _ => {}
5691            }
5692        }
5693
5694        if !is_empty {
5695            let mut buf = Vec::new();
5696            loop {
5697                match reader.read_event_into(&mut buf)? {
5698                    Event::End(_) => break,
5699                    Event::Eof => break,
5700                    _ => {}
5701                }
5702                buf.clear();
5703            }
5704        }
5705
5706        Ok(Self {
5707            i1: f_i1,
5708            i2: f_i2,
5709            i3: f_i3,
5710            i4: f_i4,
5711            reference: f_reference,
5712            name: f_name,
5713            sheet: f_sheet,
5714            id: f_id,
5715            #[cfg(feature = "extra-attrs")]
5716            extra_attrs,
5717        })
5718    }
5719}
5720
5721impl FromXml for SharedItems {
5722    fn from_xml<R: BufRead>(
5723        reader: &mut Reader<R>,
5724        start_tag: &BytesStart,
5725        is_empty: bool,
5726    ) -> Result<Self, ParseError> {
5727        let mut f_contains_semi_mixed_types = None;
5728        let mut f_contains_non_date = None;
5729        let mut f_contains_date = None;
5730        let mut f_contains_string = None;
5731        let mut f_contains_blank = None;
5732        let mut f_contains_mixed_types = None;
5733        let mut f_contains_number = None;
5734        let mut f_contains_integer = None;
5735        let mut f_min_value = None;
5736        let mut f_max_value = None;
5737        let mut f_min_date = None;
5738        let mut f_max_date = None;
5739        let mut f_count = None;
5740        let mut f_long_text = None;
5741        let mut f_m = Vec::new();
5742        let mut f_n = Vec::new();
5743        let mut f_b = Vec::new();
5744        let mut f_e = Vec::new();
5745        let mut f_style_index = Vec::new();
5746        let mut f_d = Vec::new();
5747        #[cfg(feature = "extra-attrs")]
5748        let mut extra_attrs = std::collections::HashMap::new();
5749        #[cfg(feature = "extra-children")]
5750        let mut extra_children = Vec::new();
5751        #[cfg(feature = "extra-children")]
5752        let mut child_idx: usize = 0;
5753
5754        // Parse attributes
5755        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5756            let val = String::from_utf8_lossy(&attr.value);
5757            match attr.key.local_name().as_ref() {
5758                b"containsSemiMixedTypes" => {
5759                    f_contains_semi_mixed_types = Some(val == "true" || val == "1");
5760                }
5761                b"containsNonDate" => {
5762                    f_contains_non_date = Some(val == "true" || val == "1");
5763                }
5764                b"containsDate" => {
5765                    f_contains_date = Some(val == "true" || val == "1");
5766                }
5767                b"containsString" => {
5768                    f_contains_string = Some(val == "true" || val == "1");
5769                }
5770                b"containsBlank" => {
5771                    f_contains_blank = Some(val == "true" || val == "1");
5772                }
5773                b"containsMixedTypes" => {
5774                    f_contains_mixed_types = Some(val == "true" || val == "1");
5775                }
5776                b"containsNumber" => {
5777                    f_contains_number = Some(val == "true" || val == "1");
5778                }
5779                b"containsInteger" => {
5780                    f_contains_integer = Some(val == "true" || val == "1");
5781                }
5782                b"minValue" => {
5783                    f_min_value = val.parse().ok();
5784                }
5785                b"maxValue" => {
5786                    f_max_value = val.parse().ok();
5787                }
5788                b"minDate" => {
5789                    f_min_date = Some(val.into_owned());
5790                }
5791                b"maxDate" => {
5792                    f_max_date = Some(val.into_owned());
5793                }
5794                b"count" => {
5795                    f_count = val.parse().ok();
5796                }
5797                b"longText" => {
5798                    f_long_text = Some(val == "true" || val == "1");
5799                }
5800                #[cfg(feature = "extra-attrs")]
5801                unknown => {
5802                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
5803                    extra_attrs.insert(key, val.into_owned());
5804                }
5805                #[cfg(not(feature = "extra-attrs"))]
5806                _ => {}
5807            }
5808        }
5809
5810        // Parse child elements
5811        if !is_empty {
5812            let mut buf = Vec::new();
5813            loop {
5814                match reader.read_event_into(&mut buf)? {
5815                    Event::Start(e) => {
5816                        match e.local_name().as_ref() {
5817                            b"m" => {
5818                                f_m.push(CTMissing::from_xml(reader, &e, false)?);
5819                                #[cfg(feature = "extra-children")]
5820                                {
5821                                    child_idx += 1;
5822                                }
5823                            }
5824                            b"n" => {
5825                                f_n.push(CTNumber::from_xml(reader, &e, false)?);
5826                                #[cfg(feature = "extra-children")]
5827                                {
5828                                    child_idx += 1;
5829                                }
5830                            }
5831                            b"b" => {
5832                                f_b.push(CTBoolean::from_xml(reader, &e, false)?);
5833                                #[cfg(feature = "extra-children")]
5834                                {
5835                                    child_idx += 1;
5836                                }
5837                            }
5838                            b"e" => {
5839                                f_e.push(CTError::from_xml(reader, &e, false)?);
5840                                #[cfg(feature = "extra-children")]
5841                                {
5842                                    child_idx += 1;
5843                                }
5844                            }
5845                            b"s" => {
5846                                f_style_index.push(CTString::from_xml(reader, &e, false)?);
5847                                #[cfg(feature = "extra-children")]
5848                                {
5849                                    child_idx += 1;
5850                                }
5851                            }
5852                            b"d" => {
5853                                f_d.push(CTDateTime::from_xml(reader, &e, false)?);
5854                                #[cfg(feature = "extra-children")]
5855                                {
5856                                    child_idx += 1;
5857                                }
5858                            }
5859                            #[cfg(feature = "extra-children")]
5860                            _ => {
5861                                // Capture unknown element for roundtrip
5862                                let elem = RawXmlElement::from_reader(reader, &e)?;
5863                                extra_children.push(PositionedNode::new(
5864                                    child_idx,
5865                                    RawXmlNode::Element(elem),
5866                                ));
5867                                child_idx += 1;
5868                            }
5869                            #[cfg(not(feature = "extra-children"))]
5870                            _ => {
5871                                // Skip unknown element
5872                                skip_element(reader)?;
5873                            }
5874                        }
5875                    }
5876                    Event::Empty(e) => {
5877                        match e.local_name().as_ref() {
5878                            b"m" => {
5879                                f_m.push(CTMissing::from_xml(reader, &e, true)?);
5880                                #[cfg(feature = "extra-children")]
5881                                {
5882                                    child_idx += 1;
5883                                }
5884                            }
5885                            b"n" => {
5886                                f_n.push(CTNumber::from_xml(reader, &e, true)?);
5887                                #[cfg(feature = "extra-children")]
5888                                {
5889                                    child_idx += 1;
5890                                }
5891                            }
5892                            b"b" => {
5893                                f_b.push(CTBoolean::from_xml(reader, &e, true)?);
5894                                #[cfg(feature = "extra-children")]
5895                                {
5896                                    child_idx += 1;
5897                                }
5898                            }
5899                            b"e" => {
5900                                f_e.push(CTError::from_xml(reader, &e, true)?);
5901                                #[cfg(feature = "extra-children")]
5902                                {
5903                                    child_idx += 1;
5904                                }
5905                            }
5906                            b"s" => {
5907                                f_style_index.push(CTString::from_xml(reader, &e, true)?);
5908                                #[cfg(feature = "extra-children")]
5909                                {
5910                                    child_idx += 1;
5911                                }
5912                            }
5913                            b"d" => {
5914                                f_d.push(CTDateTime::from_xml(reader, &e, true)?);
5915                                #[cfg(feature = "extra-children")]
5916                                {
5917                                    child_idx += 1;
5918                                }
5919                            }
5920                            #[cfg(feature = "extra-children")]
5921                            _ => {
5922                                // Capture unknown empty element for roundtrip
5923                                let elem = RawXmlElement::from_empty(&e);
5924                                extra_children.push(PositionedNode::new(
5925                                    child_idx,
5926                                    RawXmlNode::Element(elem),
5927                                ));
5928                                child_idx += 1;
5929                            }
5930                            #[cfg(not(feature = "extra-children"))]
5931                            _ => {}
5932                        }
5933                    }
5934                    Event::End(_) => break,
5935                    Event::Eof => break,
5936                    _ => {}
5937                }
5938                buf.clear();
5939            }
5940        }
5941
5942        Ok(Self {
5943            contains_semi_mixed_types: f_contains_semi_mixed_types,
5944            contains_non_date: f_contains_non_date,
5945            contains_date: f_contains_date,
5946            contains_string: f_contains_string,
5947            contains_blank: f_contains_blank,
5948            contains_mixed_types: f_contains_mixed_types,
5949            contains_number: f_contains_number,
5950            contains_integer: f_contains_integer,
5951            min_value: f_min_value,
5952            max_value: f_max_value,
5953            min_date: f_min_date,
5954            max_date: f_max_date,
5955            count: f_count,
5956            long_text: f_long_text,
5957            m: f_m,
5958            n: f_n,
5959            b: f_b,
5960            e: f_e,
5961            style_index: f_style_index,
5962            d: f_d,
5963            #[cfg(feature = "extra-attrs")]
5964            extra_attrs,
5965            #[cfg(feature = "extra-children")]
5966            extra_children,
5967        })
5968    }
5969}
5970
5971impl FromXml for CTMissing {
5972    fn from_xml<R: BufRead>(
5973        reader: &mut Reader<R>,
5974        start_tag: &BytesStart,
5975        is_empty: bool,
5976    ) -> Result<Self, ParseError> {
5977        let mut f_u = None;
5978        let mut f_formula = None;
5979        let mut f_cells = None;
5980        let mut f_cp = None;
5981        let mut f_in = None;
5982        let mut f_bc = None;
5983        let mut f_fc = None;
5984        let mut f_i = None;
5985        let mut f_un = None;
5986        let mut f_st = None;
5987        let mut f_b = None;
5988        let mut f_tpls = Vec::new();
5989        let mut f_x = Vec::new();
5990        #[cfg(feature = "extra-attrs")]
5991        let mut extra_attrs = std::collections::HashMap::new();
5992        #[cfg(feature = "extra-children")]
5993        let mut extra_children = Vec::new();
5994        #[cfg(feature = "extra-children")]
5995        let mut child_idx: usize = 0;
5996
5997        // Parse attributes
5998        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
5999            let val = String::from_utf8_lossy(&attr.value);
6000            match attr.key.local_name().as_ref() {
6001                b"u" => {
6002                    f_u = Some(val == "true" || val == "1");
6003                }
6004                b"f" => {
6005                    f_formula = Some(val == "true" || val == "1");
6006                }
6007                b"c" => {
6008                    f_cells = Some(val.into_owned());
6009                }
6010                b"cp" => {
6011                    f_cp = val.parse().ok();
6012                }
6013                b"in" => {
6014                    f_in = val.parse().ok();
6015                }
6016                b"bc" => {
6017                    f_bc = decode_hex(&val);
6018                }
6019                b"fc" => {
6020                    f_fc = decode_hex(&val);
6021                }
6022                b"i" => {
6023                    f_i = Some(val == "true" || val == "1");
6024                }
6025                b"un" => {
6026                    f_un = Some(val == "true" || val == "1");
6027                }
6028                b"st" => {
6029                    f_st = Some(val == "true" || val == "1");
6030                }
6031                b"b" => {
6032                    f_b = Some(val == "true" || val == "1");
6033                }
6034                #[cfg(feature = "extra-attrs")]
6035                unknown => {
6036                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6037                    extra_attrs.insert(key, val.into_owned());
6038                }
6039                #[cfg(not(feature = "extra-attrs"))]
6040                _ => {}
6041            }
6042        }
6043
6044        // Parse child elements
6045        if !is_empty {
6046            let mut buf = Vec::new();
6047            loop {
6048                match reader.read_event_into(&mut buf)? {
6049                    Event::Start(e) => {
6050                        match e.local_name().as_ref() {
6051                            b"tpls" => {
6052                                f_tpls.push(CTTuples::from_xml(reader, &e, false)?);
6053                                #[cfg(feature = "extra-children")]
6054                                {
6055                                    child_idx += 1;
6056                                }
6057                            }
6058                            b"x" => {
6059                                f_x.push(CTX::from_xml(reader, &e, false)?);
6060                                #[cfg(feature = "extra-children")]
6061                                {
6062                                    child_idx += 1;
6063                                }
6064                            }
6065                            #[cfg(feature = "extra-children")]
6066                            _ => {
6067                                // Capture unknown element for roundtrip
6068                                let elem = RawXmlElement::from_reader(reader, &e)?;
6069                                extra_children.push(PositionedNode::new(
6070                                    child_idx,
6071                                    RawXmlNode::Element(elem),
6072                                ));
6073                                child_idx += 1;
6074                            }
6075                            #[cfg(not(feature = "extra-children"))]
6076                            _ => {
6077                                // Skip unknown element
6078                                skip_element(reader)?;
6079                            }
6080                        }
6081                    }
6082                    Event::Empty(e) => {
6083                        match e.local_name().as_ref() {
6084                            b"tpls" => {
6085                                f_tpls.push(CTTuples::from_xml(reader, &e, true)?);
6086                                #[cfg(feature = "extra-children")]
6087                                {
6088                                    child_idx += 1;
6089                                }
6090                            }
6091                            b"x" => {
6092                                f_x.push(CTX::from_xml(reader, &e, true)?);
6093                                #[cfg(feature = "extra-children")]
6094                                {
6095                                    child_idx += 1;
6096                                }
6097                            }
6098                            #[cfg(feature = "extra-children")]
6099                            _ => {
6100                                // Capture unknown empty element for roundtrip
6101                                let elem = RawXmlElement::from_empty(&e);
6102                                extra_children.push(PositionedNode::new(
6103                                    child_idx,
6104                                    RawXmlNode::Element(elem),
6105                                ));
6106                                child_idx += 1;
6107                            }
6108                            #[cfg(not(feature = "extra-children"))]
6109                            _ => {}
6110                        }
6111                    }
6112                    Event::End(_) => break,
6113                    Event::Eof => break,
6114                    _ => {}
6115                }
6116                buf.clear();
6117            }
6118        }
6119
6120        Ok(Self {
6121            u: f_u,
6122            formula: f_formula,
6123            cells: f_cells,
6124            cp: f_cp,
6125            r#in: f_in,
6126            bc: f_bc,
6127            fc: f_fc,
6128            i: f_i,
6129            un: f_un,
6130            st: f_st,
6131            b: f_b,
6132            tpls: f_tpls,
6133            x: f_x,
6134            #[cfg(feature = "extra-attrs")]
6135            extra_attrs,
6136            #[cfg(feature = "extra-children")]
6137            extra_children,
6138        })
6139    }
6140}
6141
6142impl FromXml for CTNumber {
6143    fn from_xml<R: BufRead>(
6144        reader: &mut Reader<R>,
6145        start_tag: &BytesStart,
6146        is_empty: bool,
6147    ) -> Result<Self, ParseError> {
6148        let mut f_value: Option<f64> = None;
6149        let mut f_u = None;
6150        let mut f_formula = None;
6151        let mut f_cells = None;
6152        let mut f_cp = None;
6153        let mut f_in = None;
6154        let mut f_bc = None;
6155        let mut f_fc = None;
6156        let mut f_i = None;
6157        let mut f_un = None;
6158        let mut f_st = None;
6159        let mut f_b = None;
6160        let mut f_tpls = Vec::new();
6161        let mut f_x = Vec::new();
6162        #[cfg(feature = "extra-attrs")]
6163        let mut extra_attrs = std::collections::HashMap::new();
6164        #[cfg(feature = "extra-children")]
6165        let mut extra_children = Vec::new();
6166        #[cfg(feature = "extra-children")]
6167        let mut child_idx: usize = 0;
6168
6169        // Parse attributes
6170        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6171            let val = String::from_utf8_lossy(&attr.value);
6172            match attr.key.local_name().as_ref() {
6173                b"v" => {
6174                    f_value = val.parse().ok();
6175                }
6176                b"u" => {
6177                    f_u = Some(val == "true" || val == "1");
6178                }
6179                b"f" => {
6180                    f_formula = Some(val == "true" || val == "1");
6181                }
6182                b"c" => {
6183                    f_cells = Some(val.into_owned());
6184                }
6185                b"cp" => {
6186                    f_cp = val.parse().ok();
6187                }
6188                b"in" => {
6189                    f_in = val.parse().ok();
6190                }
6191                b"bc" => {
6192                    f_bc = decode_hex(&val);
6193                }
6194                b"fc" => {
6195                    f_fc = decode_hex(&val);
6196                }
6197                b"i" => {
6198                    f_i = Some(val == "true" || val == "1");
6199                }
6200                b"un" => {
6201                    f_un = Some(val == "true" || val == "1");
6202                }
6203                b"st" => {
6204                    f_st = Some(val == "true" || val == "1");
6205                }
6206                b"b" => {
6207                    f_b = Some(val == "true" || val == "1");
6208                }
6209                #[cfg(feature = "extra-attrs")]
6210                unknown => {
6211                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6212                    extra_attrs.insert(key, val.into_owned());
6213                }
6214                #[cfg(not(feature = "extra-attrs"))]
6215                _ => {}
6216            }
6217        }
6218
6219        // Parse child elements
6220        if !is_empty {
6221            let mut buf = Vec::new();
6222            loop {
6223                match reader.read_event_into(&mut buf)? {
6224                    Event::Start(e) => {
6225                        match e.local_name().as_ref() {
6226                            b"tpls" => {
6227                                f_tpls.push(CTTuples::from_xml(reader, &e, false)?);
6228                                #[cfg(feature = "extra-children")]
6229                                {
6230                                    child_idx += 1;
6231                                }
6232                            }
6233                            b"x" => {
6234                                f_x.push(CTX::from_xml(reader, &e, false)?);
6235                                #[cfg(feature = "extra-children")]
6236                                {
6237                                    child_idx += 1;
6238                                }
6239                            }
6240                            #[cfg(feature = "extra-children")]
6241                            _ => {
6242                                // Capture unknown element for roundtrip
6243                                let elem = RawXmlElement::from_reader(reader, &e)?;
6244                                extra_children.push(PositionedNode::new(
6245                                    child_idx,
6246                                    RawXmlNode::Element(elem),
6247                                ));
6248                                child_idx += 1;
6249                            }
6250                            #[cfg(not(feature = "extra-children"))]
6251                            _ => {
6252                                // Skip unknown element
6253                                skip_element(reader)?;
6254                            }
6255                        }
6256                    }
6257                    Event::Empty(e) => {
6258                        match e.local_name().as_ref() {
6259                            b"tpls" => {
6260                                f_tpls.push(CTTuples::from_xml(reader, &e, true)?);
6261                                #[cfg(feature = "extra-children")]
6262                                {
6263                                    child_idx += 1;
6264                                }
6265                            }
6266                            b"x" => {
6267                                f_x.push(CTX::from_xml(reader, &e, true)?);
6268                                #[cfg(feature = "extra-children")]
6269                                {
6270                                    child_idx += 1;
6271                                }
6272                            }
6273                            #[cfg(feature = "extra-children")]
6274                            _ => {
6275                                // Capture unknown empty element for roundtrip
6276                                let elem = RawXmlElement::from_empty(&e);
6277                                extra_children.push(PositionedNode::new(
6278                                    child_idx,
6279                                    RawXmlNode::Element(elem),
6280                                ));
6281                                child_idx += 1;
6282                            }
6283                            #[cfg(not(feature = "extra-children"))]
6284                            _ => {}
6285                        }
6286                    }
6287                    Event::End(_) => break,
6288                    Event::Eof => break,
6289                    _ => {}
6290                }
6291                buf.clear();
6292            }
6293        }
6294
6295        Ok(Self {
6296            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
6297            u: f_u,
6298            formula: f_formula,
6299            cells: f_cells,
6300            cp: f_cp,
6301            r#in: f_in,
6302            bc: f_bc,
6303            fc: f_fc,
6304            i: f_i,
6305            un: f_un,
6306            st: f_st,
6307            b: f_b,
6308            tpls: f_tpls,
6309            x: f_x,
6310            #[cfg(feature = "extra-attrs")]
6311            extra_attrs,
6312            #[cfg(feature = "extra-children")]
6313            extra_children,
6314        })
6315    }
6316}
6317
6318impl FromXml for CTBoolean {
6319    fn from_xml<R: BufRead>(
6320        reader: &mut Reader<R>,
6321        start_tag: &BytesStart,
6322        is_empty: bool,
6323    ) -> Result<Self, ParseError> {
6324        let mut f_value: Option<bool> = None;
6325        let mut f_u = None;
6326        let mut f_formula = None;
6327        let mut f_cells = None;
6328        let mut f_cp = None;
6329        let mut f_x = Vec::new();
6330        #[cfg(feature = "extra-attrs")]
6331        let mut extra_attrs = std::collections::HashMap::new();
6332        #[cfg(feature = "extra-children")]
6333        let mut extra_children = Vec::new();
6334        #[cfg(feature = "extra-children")]
6335        let mut child_idx: usize = 0;
6336
6337        // Parse attributes
6338        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6339            let val = String::from_utf8_lossy(&attr.value);
6340            match attr.key.local_name().as_ref() {
6341                b"v" => {
6342                    f_value = Some(val == "true" || val == "1");
6343                }
6344                b"u" => {
6345                    f_u = Some(val == "true" || val == "1");
6346                }
6347                b"f" => {
6348                    f_formula = Some(val == "true" || val == "1");
6349                }
6350                b"c" => {
6351                    f_cells = Some(val.into_owned());
6352                }
6353                b"cp" => {
6354                    f_cp = val.parse().ok();
6355                }
6356                #[cfg(feature = "extra-attrs")]
6357                unknown => {
6358                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6359                    extra_attrs.insert(key, val.into_owned());
6360                }
6361                #[cfg(not(feature = "extra-attrs"))]
6362                _ => {}
6363            }
6364        }
6365
6366        // Parse child elements
6367        if !is_empty {
6368            let mut buf = Vec::new();
6369            loop {
6370                match reader.read_event_into(&mut buf)? {
6371                    Event::Start(e) => {
6372                        match e.local_name().as_ref() {
6373                            b"x" => {
6374                                f_x.push(CTX::from_xml(reader, &e, false)?);
6375                                #[cfg(feature = "extra-children")]
6376                                {
6377                                    child_idx += 1;
6378                                }
6379                            }
6380                            #[cfg(feature = "extra-children")]
6381                            _ => {
6382                                // Capture unknown element for roundtrip
6383                                let elem = RawXmlElement::from_reader(reader, &e)?;
6384                                extra_children.push(PositionedNode::new(
6385                                    child_idx,
6386                                    RawXmlNode::Element(elem),
6387                                ));
6388                                child_idx += 1;
6389                            }
6390                            #[cfg(not(feature = "extra-children"))]
6391                            _ => {
6392                                // Skip unknown element
6393                                skip_element(reader)?;
6394                            }
6395                        }
6396                    }
6397                    Event::Empty(e) => {
6398                        match e.local_name().as_ref() {
6399                            b"x" => {
6400                                f_x.push(CTX::from_xml(reader, &e, true)?);
6401                                #[cfg(feature = "extra-children")]
6402                                {
6403                                    child_idx += 1;
6404                                }
6405                            }
6406                            #[cfg(feature = "extra-children")]
6407                            _ => {
6408                                // Capture unknown empty element for roundtrip
6409                                let elem = RawXmlElement::from_empty(&e);
6410                                extra_children.push(PositionedNode::new(
6411                                    child_idx,
6412                                    RawXmlNode::Element(elem),
6413                                ));
6414                                child_idx += 1;
6415                            }
6416                            #[cfg(not(feature = "extra-children"))]
6417                            _ => {}
6418                        }
6419                    }
6420                    Event::End(_) => break,
6421                    Event::Eof => break,
6422                    _ => {}
6423                }
6424                buf.clear();
6425            }
6426        }
6427
6428        Ok(Self {
6429            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
6430            u: f_u,
6431            formula: f_formula,
6432            cells: f_cells,
6433            cp: f_cp,
6434            x: f_x,
6435            #[cfg(feature = "extra-attrs")]
6436            extra_attrs,
6437            #[cfg(feature = "extra-children")]
6438            extra_children,
6439        })
6440    }
6441}
6442
6443impl FromXml for CTError {
6444    fn from_xml<R: BufRead>(
6445        reader: &mut Reader<R>,
6446        start_tag: &BytesStart,
6447        is_empty: bool,
6448    ) -> Result<Self, ParseError> {
6449        let mut f_value: Option<XmlString> = None;
6450        let mut f_u = None;
6451        let mut f_formula = None;
6452        let mut f_cells = None;
6453        let mut f_cp = None;
6454        let mut f_in = None;
6455        let mut f_bc = None;
6456        let mut f_fc = None;
6457        let mut f_i = None;
6458        let mut f_un = None;
6459        let mut f_st = None;
6460        let mut f_b = None;
6461        let mut f_tpls = None;
6462        let mut f_x = Vec::new();
6463        #[cfg(feature = "extra-attrs")]
6464        let mut extra_attrs = std::collections::HashMap::new();
6465        #[cfg(feature = "extra-children")]
6466        let mut extra_children = Vec::new();
6467        #[cfg(feature = "extra-children")]
6468        let mut child_idx: usize = 0;
6469
6470        // Parse attributes
6471        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6472            let val = String::from_utf8_lossy(&attr.value);
6473            match attr.key.local_name().as_ref() {
6474                b"v" => {
6475                    f_value = Some(val.into_owned());
6476                }
6477                b"u" => {
6478                    f_u = Some(val == "true" || val == "1");
6479                }
6480                b"f" => {
6481                    f_formula = Some(val == "true" || val == "1");
6482                }
6483                b"c" => {
6484                    f_cells = Some(val.into_owned());
6485                }
6486                b"cp" => {
6487                    f_cp = val.parse().ok();
6488                }
6489                b"in" => {
6490                    f_in = val.parse().ok();
6491                }
6492                b"bc" => {
6493                    f_bc = decode_hex(&val);
6494                }
6495                b"fc" => {
6496                    f_fc = decode_hex(&val);
6497                }
6498                b"i" => {
6499                    f_i = Some(val == "true" || val == "1");
6500                }
6501                b"un" => {
6502                    f_un = Some(val == "true" || val == "1");
6503                }
6504                b"st" => {
6505                    f_st = Some(val == "true" || val == "1");
6506                }
6507                b"b" => {
6508                    f_b = Some(val == "true" || val == "1");
6509                }
6510                #[cfg(feature = "extra-attrs")]
6511                unknown => {
6512                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6513                    extra_attrs.insert(key, val.into_owned());
6514                }
6515                #[cfg(not(feature = "extra-attrs"))]
6516                _ => {}
6517            }
6518        }
6519
6520        // Parse child elements
6521        if !is_empty {
6522            let mut buf = Vec::new();
6523            loop {
6524                match reader.read_event_into(&mut buf)? {
6525                    Event::Start(e) => {
6526                        match e.local_name().as_ref() {
6527                            b"tpls" => {
6528                                f_tpls = Some(Box::new(CTTuples::from_xml(reader, &e, false)?));
6529                                #[cfg(feature = "extra-children")]
6530                                {
6531                                    child_idx += 1;
6532                                }
6533                            }
6534                            b"x" => {
6535                                f_x.push(CTX::from_xml(reader, &e, false)?);
6536                                #[cfg(feature = "extra-children")]
6537                                {
6538                                    child_idx += 1;
6539                                }
6540                            }
6541                            #[cfg(feature = "extra-children")]
6542                            _ => {
6543                                // Capture unknown element for roundtrip
6544                                let elem = RawXmlElement::from_reader(reader, &e)?;
6545                                extra_children.push(PositionedNode::new(
6546                                    child_idx,
6547                                    RawXmlNode::Element(elem),
6548                                ));
6549                                child_idx += 1;
6550                            }
6551                            #[cfg(not(feature = "extra-children"))]
6552                            _ => {
6553                                // Skip unknown element
6554                                skip_element(reader)?;
6555                            }
6556                        }
6557                    }
6558                    Event::Empty(e) => {
6559                        match e.local_name().as_ref() {
6560                            b"tpls" => {
6561                                f_tpls = Some(Box::new(CTTuples::from_xml(reader, &e, true)?));
6562                                #[cfg(feature = "extra-children")]
6563                                {
6564                                    child_idx += 1;
6565                                }
6566                            }
6567                            b"x" => {
6568                                f_x.push(CTX::from_xml(reader, &e, true)?);
6569                                #[cfg(feature = "extra-children")]
6570                                {
6571                                    child_idx += 1;
6572                                }
6573                            }
6574                            #[cfg(feature = "extra-children")]
6575                            _ => {
6576                                // Capture unknown empty element for roundtrip
6577                                let elem = RawXmlElement::from_empty(&e);
6578                                extra_children.push(PositionedNode::new(
6579                                    child_idx,
6580                                    RawXmlNode::Element(elem),
6581                                ));
6582                                child_idx += 1;
6583                            }
6584                            #[cfg(not(feature = "extra-children"))]
6585                            _ => {}
6586                        }
6587                    }
6588                    Event::End(_) => break,
6589                    Event::Eof => break,
6590                    _ => {}
6591                }
6592                buf.clear();
6593            }
6594        }
6595
6596        Ok(Self {
6597            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
6598            u: f_u,
6599            formula: f_formula,
6600            cells: f_cells,
6601            cp: f_cp,
6602            r#in: f_in,
6603            bc: f_bc,
6604            fc: f_fc,
6605            i: f_i,
6606            un: f_un,
6607            st: f_st,
6608            b: f_b,
6609            tpls: f_tpls,
6610            x: f_x,
6611            #[cfg(feature = "extra-attrs")]
6612            extra_attrs,
6613            #[cfg(feature = "extra-children")]
6614            extra_children,
6615        })
6616    }
6617}
6618
6619impl FromXml for CTString {
6620    fn from_xml<R: BufRead>(
6621        reader: &mut Reader<R>,
6622        start_tag: &BytesStart,
6623        is_empty: bool,
6624    ) -> Result<Self, ParseError> {
6625        let mut f_value: Option<XmlString> = None;
6626        let mut f_u = None;
6627        let mut f_formula = None;
6628        let mut f_cells = None;
6629        let mut f_cp = None;
6630        let mut f_in = None;
6631        let mut f_bc = None;
6632        let mut f_fc = None;
6633        let mut f_i = None;
6634        let mut f_un = None;
6635        let mut f_st = None;
6636        let mut f_b = None;
6637        let mut f_tpls = Vec::new();
6638        let mut f_x = Vec::new();
6639        #[cfg(feature = "extra-attrs")]
6640        let mut extra_attrs = std::collections::HashMap::new();
6641        #[cfg(feature = "extra-children")]
6642        let mut extra_children = Vec::new();
6643        #[cfg(feature = "extra-children")]
6644        let mut child_idx: usize = 0;
6645
6646        // Parse attributes
6647        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6648            let val = String::from_utf8_lossy(&attr.value);
6649            match attr.key.local_name().as_ref() {
6650                b"v" => {
6651                    f_value = Some(val.into_owned());
6652                }
6653                b"u" => {
6654                    f_u = Some(val == "true" || val == "1");
6655                }
6656                b"f" => {
6657                    f_formula = Some(val == "true" || val == "1");
6658                }
6659                b"c" => {
6660                    f_cells = Some(val.into_owned());
6661                }
6662                b"cp" => {
6663                    f_cp = val.parse().ok();
6664                }
6665                b"in" => {
6666                    f_in = val.parse().ok();
6667                }
6668                b"bc" => {
6669                    f_bc = decode_hex(&val);
6670                }
6671                b"fc" => {
6672                    f_fc = decode_hex(&val);
6673                }
6674                b"i" => {
6675                    f_i = Some(val == "true" || val == "1");
6676                }
6677                b"un" => {
6678                    f_un = Some(val == "true" || val == "1");
6679                }
6680                b"st" => {
6681                    f_st = Some(val == "true" || val == "1");
6682                }
6683                b"b" => {
6684                    f_b = Some(val == "true" || val == "1");
6685                }
6686                #[cfg(feature = "extra-attrs")]
6687                unknown => {
6688                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6689                    extra_attrs.insert(key, val.into_owned());
6690                }
6691                #[cfg(not(feature = "extra-attrs"))]
6692                _ => {}
6693            }
6694        }
6695
6696        // Parse child elements
6697        if !is_empty {
6698            let mut buf = Vec::new();
6699            loop {
6700                match reader.read_event_into(&mut buf)? {
6701                    Event::Start(e) => {
6702                        match e.local_name().as_ref() {
6703                            b"tpls" => {
6704                                f_tpls.push(CTTuples::from_xml(reader, &e, false)?);
6705                                #[cfg(feature = "extra-children")]
6706                                {
6707                                    child_idx += 1;
6708                                }
6709                            }
6710                            b"x" => {
6711                                f_x.push(CTX::from_xml(reader, &e, false)?);
6712                                #[cfg(feature = "extra-children")]
6713                                {
6714                                    child_idx += 1;
6715                                }
6716                            }
6717                            #[cfg(feature = "extra-children")]
6718                            _ => {
6719                                // Capture unknown element for roundtrip
6720                                let elem = RawXmlElement::from_reader(reader, &e)?;
6721                                extra_children.push(PositionedNode::new(
6722                                    child_idx,
6723                                    RawXmlNode::Element(elem),
6724                                ));
6725                                child_idx += 1;
6726                            }
6727                            #[cfg(not(feature = "extra-children"))]
6728                            _ => {
6729                                // Skip unknown element
6730                                skip_element(reader)?;
6731                            }
6732                        }
6733                    }
6734                    Event::Empty(e) => {
6735                        match e.local_name().as_ref() {
6736                            b"tpls" => {
6737                                f_tpls.push(CTTuples::from_xml(reader, &e, true)?);
6738                                #[cfg(feature = "extra-children")]
6739                                {
6740                                    child_idx += 1;
6741                                }
6742                            }
6743                            b"x" => {
6744                                f_x.push(CTX::from_xml(reader, &e, true)?);
6745                                #[cfg(feature = "extra-children")]
6746                                {
6747                                    child_idx += 1;
6748                                }
6749                            }
6750                            #[cfg(feature = "extra-children")]
6751                            _ => {
6752                                // Capture unknown empty element for roundtrip
6753                                let elem = RawXmlElement::from_empty(&e);
6754                                extra_children.push(PositionedNode::new(
6755                                    child_idx,
6756                                    RawXmlNode::Element(elem),
6757                                ));
6758                                child_idx += 1;
6759                            }
6760                            #[cfg(not(feature = "extra-children"))]
6761                            _ => {}
6762                        }
6763                    }
6764                    Event::End(_) => break,
6765                    Event::Eof => break,
6766                    _ => {}
6767                }
6768                buf.clear();
6769            }
6770        }
6771
6772        Ok(Self {
6773            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
6774            u: f_u,
6775            formula: f_formula,
6776            cells: f_cells,
6777            cp: f_cp,
6778            r#in: f_in,
6779            bc: f_bc,
6780            fc: f_fc,
6781            i: f_i,
6782            un: f_un,
6783            st: f_st,
6784            b: f_b,
6785            tpls: f_tpls,
6786            x: f_x,
6787            #[cfg(feature = "extra-attrs")]
6788            extra_attrs,
6789            #[cfg(feature = "extra-children")]
6790            extra_children,
6791        })
6792    }
6793}
6794
6795impl FromXml for CTDateTime {
6796    fn from_xml<R: BufRead>(
6797        reader: &mut Reader<R>,
6798        start_tag: &BytesStart,
6799        is_empty: bool,
6800    ) -> Result<Self, ParseError> {
6801        let mut f_value: Option<String> = None;
6802        let mut f_u = None;
6803        let mut f_formula = None;
6804        let mut f_cells = None;
6805        let mut f_cp = None;
6806        let mut f_x = Vec::new();
6807        #[cfg(feature = "extra-attrs")]
6808        let mut extra_attrs = std::collections::HashMap::new();
6809        #[cfg(feature = "extra-children")]
6810        let mut extra_children = Vec::new();
6811        #[cfg(feature = "extra-children")]
6812        let mut child_idx: usize = 0;
6813
6814        // Parse attributes
6815        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6816            let val = String::from_utf8_lossy(&attr.value);
6817            match attr.key.local_name().as_ref() {
6818                b"v" => {
6819                    f_value = Some(val.into_owned());
6820                }
6821                b"u" => {
6822                    f_u = Some(val == "true" || val == "1");
6823                }
6824                b"f" => {
6825                    f_formula = Some(val == "true" || val == "1");
6826                }
6827                b"c" => {
6828                    f_cells = Some(val.into_owned());
6829                }
6830                b"cp" => {
6831                    f_cp = val.parse().ok();
6832                }
6833                #[cfg(feature = "extra-attrs")]
6834                unknown => {
6835                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6836                    extra_attrs.insert(key, val.into_owned());
6837                }
6838                #[cfg(not(feature = "extra-attrs"))]
6839                _ => {}
6840            }
6841        }
6842
6843        // Parse child elements
6844        if !is_empty {
6845            let mut buf = Vec::new();
6846            loop {
6847                match reader.read_event_into(&mut buf)? {
6848                    Event::Start(e) => {
6849                        match e.local_name().as_ref() {
6850                            b"x" => {
6851                                f_x.push(CTX::from_xml(reader, &e, false)?);
6852                                #[cfg(feature = "extra-children")]
6853                                {
6854                                    child_idx += 1;
6855                                }
6856                            }
6857                            #[cfg(feature = "extra-children")]
6858                            _ => {
6859                                // Capture unknown element for roundtrip
6860                                let elem = RawXmlElement::from_reader(reader, &e)?;
6861                                extra_children.push(PositionedNode::new(
6862                                    child_idx,
6863                                    RawXmlNode::Element(elem),
6864                                ));
6865                                child_idx += 1;
6866                            }
6867                            #[cfg(not(feature = "extra-children"))]
6868                            _ => {
6869                                // Skip unknown element
6870                                skip_element(reader)?;
6871                            }
6872                        }
6873                    }
6874                    Event::Empty(e) => {
6875                        match e.local_name().as_ref() {
6876                            b"x" => {
6877                                f_x.push(CTX::from_xml(reader, &e, true)?);
6878                                #[cfg(feature = "extra-children")]
6879                                {
6880                                    child_idx += 1;
6881                                }
6882                            }
6883                            #[cfg(feature = "extra-children")]
6884                            _ => {
6885                                // Capture unknown empty element for roundtrip
6886                                let elem = RawXmlElement::from_empty(&e);
6887                                extra_children.push(PositionedNode::new(
6888                                    child_idx,
6889                                    RawXmlNode::Element(elem),
6890                                ));
6891                                child_idx += 1;
6892                            }
6893                            #[cfg(not(feature = "extra-children"))]
6894                            _ => {}
6895                        }
6896                    }
6897                    Event::End(_) => break,
6898                    Event::Eof => break,
6899                    _ => {}
6900                }
6901                buf.clear();
6902            }
6903        }
6904
6905        Ok(Self {
6906            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
6907            u: f_u,
6908            formula: f_formula,
6909            cells: f_cells,
6910            cp: f_cp,
6911            x: f_x,
6912            #[cfg(feature = "extra-attrs")]
6913            extra_attrs,
6914            #[cfg(feature = "extra-children")]
6915            extra_children,
6916        })
6917    }
6918}
6919
6920impl FromXml for FieldGroup {
6921    fn from_xml<R: BufRead>(
6922        reader: &mut Reader<R>,
6923        start_tag: &BytesStart,
6924        is_empty: bool,
6925    ) -> Result<Self, ParseError> {
6926        let mut f_par = None;
6927        let mut f_base = None;
6928        let mut f_range_pr = None;
6929        let mut f_discrete_pr = None;
6930        let mut f_group_items = None;
6931        #[cfg(feature = "extra-attrs")]
6932        let mut extra_attrs = std::collections::HashMap::new();
6933        #[cfg(feature = "extra-children")]
6934        let mut extra_children = Vec::new();
6935        #[cfg(feature = "extra-children")]
6936        let mut child_idx: usize = 0;
6937
6938        // Parse attributes
6939        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
6940            let val = String::from_utf8_lossy(&attr.value);
6941            match attr.key.local_name().as_ref() {
6942                b"par" => {
6943                    f_par = val.parse().ok();
6944                }
6945                b"base" => {
6946                    f_base = val.parse().ok();
6947                }
6948                #[cfg(feature = "extra-attrs")]
6949                unknown => {
6950                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
6951                    extra_attrs.insert(key, val.into_owned());
6952                }
6953                #[cfg(not(feature = "extra-attrs"))]
6954                _ => {}
6955            }
6956        }
6957
6958        // Parse child elements
6959        if !is_empty {
6960            let mut buf = Vec::new();
6961            loop {
6962                match reader.read_event_into(&mut buf)? {
6963                    Event::Start(e) => {
6964                        match e.local_name().as_ref() {
6965                            b"rangePr" => {
6966                                f_range_pr =
6967                                    Some(Box::new(CTRangePr::from_xml(reader, &e, false)?));
6968                                #[cfg(feature = "extra-children")]
6969                                {
6970                                    child_idx += 1;
6971                                }
6972                            }
6973                            b"discretePr" => {
6974                                f_discrete_pr =
6975                                    Some(Box::new(CTDiscretePr::from_xml(reader, &e, false)?));
6976                                #[cfg(feature = "extra-children")]
6977                                {
6978                                    child_idx += 1;
6979                                }
6980                            }
6981                            b"groupItems" => {
6982                                f_group_items =
6983                                    Some(Box::new(GroupItems::from_xml(reader, &e, false)?));
6984                                #[cfg(feature = "extra-children")]
6985                                {
6986                                    child_idx += 1;
6987                                }
6988                            }
6989                            #[cfg(feature = "extra-children")]
6990                            _ => {
6991                                // Capture unknown element for roundtrip
6992                                let elem = RawXmlElement::from_reader(reader, &e)?;
6993                                extra_children.push(PositionedNode::new(
6994                                    child_idx,
6995                                    RawXmlNode::Element(elem),
6996                                ));
6997                                child_idx += 1;
6998                            }
6999                            #[cfg(not(feature = "extra-children"))]
7000                            _ => {
7001                                // Skip unknown element
7002                                skip_element(reader)?;
7003                            }
7004                        }
7005                    }
7006                    Event::Empty(e) => {
7007                        match e.local_name().as_ref() {
7008                            b"rangePr" => {
7009                                f_range_pr = Some(Box::new(CTRangePr::from_xml(reader, &e, true)?));
7010                                #[cfg(feature = "extra-children")]
7011                                {
7012                                    child_idx += 1;
7013                                }
7014                            }
7015                            b"discretePr" => {
7016                                f_discrete_pr =
7017                                    Some(Box::new(CTDiscretePr::from_xml(reader, &e, true)?));
7018                                #[cfg(feature = "extra-children")]
7019                                {
7020                                    child_idx += 1;
7021                                }
7022                            }
7023                            b"groupItems" => {
7024                                f_group_items =
7025                                    Some(Box::new(GroupItems::from_xml(reader, &e, true)?));
7026                                #[cfg(feature = "extra-children")]
7027                                {
7028                                    child_idx += 1;
7029                                }
7030                            }
7031                            #[cfg(feature = "extra-children")]
7032                            _ => {
7033                                // Capture unknown empty element for roundtrip
7034                                let elem = RawXmlElement::from_empty(&e);
7035                                extra_children.push(PositionedNode::new(
7036                                    child_idx,
7037                                    RawXmlNode::Element(elem),
7038                                ));
7039                                child_idx += 1;
7040                            }
7041                            #[cfg(not(feature = "extra-children"))]
7042                            _ => {}
7043                        }
7044                    }
7045                    Event::End(_) => break,
7046                    Event::Eof => break,
7047                    _ => {}
7048                }
7049                buf.clear();
7050            }
7051        }
7052
7053        Ok(Self {
7054            par: f_par,
7055            base: f_base,
7056            range_pr: f_range_pr,
7057            discrete_pr: f_discrete_pr,
7058            group_items: f_group_items,
7059            #[cfg(feature = "extra-attrs")]
7060            extra_attrs,
7061            #[cfg(feature = "extra-children")]
7062            extra_children,
7063        })
7064    }
7065}
7066
7067impl FromXml for CTRangePr {
7068    fn from_xml<R: BufRead>(
7069        reader: &mut Reader<R>,
7070        start_tag: &BytesStart,
7071        is_empty: bool,
7072    ) -> Result<Self, ParseError> {
7073        let mut f_auto_start = None;
7074        let mut f_auto_end = None;
7075        let mut f_group_by = None;
7076        let mut f_start_num = None;
7077        let mut f_end_num = None;
7078        let mut f_start_date = None;
7079        let mut f_end_date = None;
7080        let mut f_group_interval = None;
7081        #[cfg(feature = "extra-attrs")]
7082        let mut extra_attrs = std::collections::HashMap::new();
7083
7084        // Parse attributes
7085        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7086            let val = String::from_utf8_lossy(&attr.value);
7087            match attr.key.local_name().as_ref() {
7088                b"autoStart" => {
7089                    f_auto_start = Some(val == "true" || val == "1");
7090                }
7091                b"autoEnd" => {
7092                    f_auto_end = Some(val == "true" || val == "1");
7093                }
7094                b"groupBy" => {
7095                    f_group_by = val.parse().ok();
7096                }
7097                b"startNum" => {
7098                    f_start_num = val.parse().ok();
7099                }
7100                b"endNum" => {
7101                    f_end_num = val.parse().ok();
7102                }
7103                b"startDate" => {
7104                    f_start_date = Some(val.into_owned());
7105                }
7106                b"endDate" => {
7107                    f_end_date = Some(val.into_owned());
7108                }
7109                b"groupInterval" => {
7110                    f_group_interval = val.parse().ok();
7111                }
7112                #[cfg(feature = "extra-attrs")]
7113                unknown => {
7114                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7115                    extra_attrs.insert(key, val.into_owned());
7116                }
7117                #[cfg(not(feature = "extra-attrs"))]
7118                _ => {}
7119            }
7120        }
7121
7122        if !is_empty {
7123            let mut buf = Vec::new();
7124            loop {
7125                match reader.read_event_into(&mut buf)? {
7126                    Event::End(_) => break,
7127                    Event::Eof => break,
7128                    _ => {}
7129                }
7130                buf.clear();
7131            }
7132        }
7133
7134        Ok(Self {
7135            auto_start: f_auto_start,
7136            auto_end: f_auto_end,
7137            group_by: f_group_by,
7138            start_num: f_start_num,
7139            end_num: f_end_num,
7140            start_date: f_start_date,
7141            end_date: f_end_date,
7142            group_interval: f_group_interval,
7143            #[cfg(feature = "extra-attrs")]
7144            extra_attrs,
7145        })
7146    }
7147}
7148
7149impl FromXml for CTDiscretePr {
7150    fn from_xml<R: BufRead>(
7151        reader: &mut Reader<R>,
7152        start_tag: &BytesStart,
7153        is_empty: bool,
7154    ) -> Result<Self, ParseError> {
7155        let mut f_count = None;
7156        let mut f_x = Vec::new();
7157        #[cfg(feature = "extra-attrs")]
7158        let mut extra_attrs = std::collections::HashMap::new();
7159        #[cfg(feature = "extra-children")]
7160        let mut extra_children = Vec::new();
7161        #[cfg(feature = "extra-children")]
7162        let mut child_idx: usize = 0;
7163
7164        // Parse attributes
7165        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7166            let val = String::from_utf8_lossy(&attr.value);
7167            match attr.key.local_name().as_ref() {
7168                b"count" => {
7169                    f_count = val.parse().ok();
7170                }
7171                #[cfg(feature = "extra-attrs")]
7172                unknown => {
7173                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7174                    extra_attrs.insert(key, val.into_owned());
7175                }
7176                #[cfg(not(feature = "extra-attrs"))]
7177                _ => {}
7178            }
7179        }
7180
7181        // Parse child elements
7182        if !is_empty {
7183            let mut buf = Vec::new();
7184            loop {
7185                match reader.read_event_into(&mut buf)? {
7186                    Event::Start(e) => {
7187                        match e.local_name().as_ref() {
7188                            b"x" => {
7189                                f_x.push(CTIndex::from_xml(reader, &e, false)?);
7190                                #[cfg(feature = "extra-children")]
7191                                {
7192                                    child_idx += 1;
7193                                }
7194                            }
7195                            #[cfg(feature = "extra-children")]
7196                            _ => {
7197                                // Capture unknown element for roundtrip
7198                                let elem = RawXmlElement::from_reader(reader, &e)?;
7199                                extra_children.push(PositionedNode::new(
7200                                    child_idx,
7201                                    RawXmlNode::Element(elem),
7202                                ));
7203                                child_idx += 1;
7204                            }
7205                            #[cfg(not(feature = "extra-children"))]
7206                            _ => {
7207                                // Skip unknown element
7208                                skip_element(reader)?;
7209                            }
7210                        }
7211                    }
7212                    Event::Empty(e) => {
7213                        match e.local_name().as_ref() {
7214                            b"x" => {
7215                                f_x.push(CTIndex::from_xml(reader, &e, true)?);
7216                                #[cfg(feature = "extra-children")]
7217                                {
7218                                    child_idx += 1;
7219                                }
7220                            }
7221                            #[cfg(feature = "extra-children")]
7222                            _ => {
7223                                // Capture unknown empty element for roundtrip
7224                                let elem = RawXmlElement::from_empty(&e);
7225                                extra_children.push(PositionedNode::new(
7226                                    child_idx,
7227                                    RawXmlNode::Element(elem),
7228                                ));
7229                                child_idx += 1;
7230                            }
7231                            #[cfg(not(feature = "extra-children"))]
7232                            _ => {}
7233                        }
7234                    }
7235                    Event::End(_) => break,
7236                    Event::Eof => break,
7237                    _ => {}
7238                }
7239                buf.clear();
7240            }
7241        }
7242
7243        Ok(Self {
7244            count: f_count,
7245            x: f_x,
7246            #[cfg(feature = "extra-attrs")]
7247            extra_attrs,
7248            #[cfg(feature = "extra-children")]
7249            extra_children,
7250        })
7251    }
7252}
7253
7254impl FromXml for GroupItems {
7255    fn from_xml<R: BufRead>(
7256        reader: &mut Reader<R>,
7257        start_tag: &BytesStart,
7258        is_empty: bool,
7259    ) -> Result<Self, ParseError> {
7260        let mut f_count = None;
7261        let mut f_m = Vec::new();
7262        let mut f_n = Vec::new();
7263        let mut f_b = Vec::new();
7264        let mut f_e = Vec::new();
7265        let mut f_style_index = Vec::new();
7266        let mut f_d = Vec::new();
7267        #[cfg(feature = "extra-attrs")]
7268        let mut extra_attrs = std::collections::HashMap::new();
7269        #[cfg(feature = "extra-children")]
7270        let mut extra_children = Vec::new();
7271        #[cfg(feature = "extra-children")]
7272        let mut child_idx: usize = 0;
7273
7274        // Parse attributes
7275        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7276            let val = String::from_utf8_lossy(&attr.value);
7277            match attr.key.local_name().as_ref() {
7278                b"count" => {
7279                    f_count = val.parse().ok();
7280                }
7281                #[cfg(feature = "extra-attrs")]
7282                unknown => {
7283                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7284                    extra_attrs.insert(key, val.into_owned());
7285                }
7286                #[cfg(not(feature = "extra-attrs"))]
7287                _ => {}
7288            }
7289        }
7290
7291        // Parse child elements
7292        if !is_empty {
7293            let mut buf = Vec::new();
7294            loop {
7295                match reader.read_event_into(&mut buf)? {
7296                    Event::Start(e) => {
7297                        match e.local_name().as_ref() {
7298                            b"m" => {
7299                                f_m.push(CTMissing::from_xml(reader, &e, false)?);
7300                                #[cfg(feature = "extra-children")]
7301                                {
7302                                    child_idx += 1;
7303                                }
7304                            }
7305                            b"n" => {
7306                                f_n.push(CTNumber::from_xml(reader, &e, false)?);
7307                                #[cfg(feature = "extra-children")]
7308                                {
7309                                    child_idx += 1;
7310                                }
7311                            }
7312                            b"b" => {
7313                                f_b.push(CTBoolean::from_xml(reader, &e, false)?);
7314                                #[cfg(feature = "extra-children")]
7315                                {
7316                                    child_idx += 1;
7317                                }
7318                            }
7319                            b"e" => {
7320                                f_e.push(CTError::from_xml(reader, &e, false)?);
7321                                #[cfg(feature = "extra-children")]
7322                                {
7323                                    child_idx += 1;
7324                                }
7325                            }
7326                            b"s" => {
7327                                f_style_index.push(CTString::from_xml(reader, &e, false)?);
7328                                #[cfg(feature = "extra-children")]
7329                                {
7330                                    child_idx += 1;
7331                                }
7332                            }
7333                            b"d" => {
7334                                f_d.push(CTDateTime::from_xml(reader, &e, false)?);
7335                                #[cfg(feature = "extra-children")]
7336                                {
7337                                    child_idx += 1;
7338                                }
7339                            }
7340                            #[cfg(feature = "extra-children")]
7341                            _ => {
7342                                // Capture unknown element for roundtrip
7343                                let elem = RawXmlElement::from_reader(reader, &e)?;
7344                                extra_children.push(PositionedNode::new(
7345                                    child_idx,
7346                                    RawXmlNode::Element(elem),
7347                                ));
7348                                child_idx += 1;
7349                            }
7350                            #[cfg(not(feature = "extra-children"))]
7351                            _ => {
7352                                // Skip unknown element
7353                                skip_element(reader)?;
7354                            }
7355                        }
7356                    }
7357                    Event::Empty(e) => {
7358                        match e.local_name().as_ref() {
7359                            b"m" => {
7360                                f_m.push(CTMissing::from_xml(reader, &e, true)?);
7361                                #[cfg(feature = "extra-children")]
7362                                {
7363                                    child_idx += 1;
7364                                }
7365                            }
7366                            b"n" => {
7367                                f_n.push(CTNumber::from_xml(reader, &e, true)?);
7368                                #[cfg(feature = "extra-children")]
7369                                {
7370                                    child_idx += 1;
7371                                }
7372                            }
7373                            b"b" => {
7374                                f_b.push(CTBoolean::from_xml(reader, &e, true)?);
7375                                #[cfg(feature = "extra-children")]
7376                                {
7377                                    child_idx += 1;
7378                                }
7379                            }
7380                            b"e" => {
7381                                f_e.push(CTError::from_xml(reader, &e, true)?);
7382                                #[cfg(feature = "extra-children")]
7383                                {
7384                                    child_idx += 1;
7385                                }
7386                            }
7387                            b"s" => {
7388                                f_style_index.push(CTString::from_xml(reader, &e, true)?);
7389                                #[cfg(feature = "extra-children")]
7390                                {
7391                                    child_idx += 1;
7392                                }
7393                            }
7394                            b"d" => {
7395                                f_d.push(CTDateTime::from_xml(reader, &e, true)?);
7396                                #[cfg(feature = "extra-children")]
7397                                {
7398                                    child_idx += 1;
7399                                }
7400                            }
7401                            #[cfg(feature = "extra-children")]
7402                            _ => {
7403                                // Capture unknown empty element for roundtrip
7404                                let elem = RawXmlElement::from_empty(&e);
7405                                extra_children.push(PositionedNode::new(
7406                                    child_idx,
7407                                    RawXmlNode::Element(elem),
7408                                ));
7409                                child_idx += 1;
7410                            }
7411                            #[cfg(not(feature = "extra-children"))]
7412                            _ => {}
7413                        }
7414                    }
7415                    Event::End(_) => break,
7416                    Event::Eof => break,
7417                    _ => {}
7418                }
7419                buf.clear();
7420            }
7421        }
7422
7423        Ok(Self {
7424            count: f_count,
7425            m: f_m,
7426            n: f_n,
7427            b: f_b,
7428            e: f_e,
7429            style_index: f_style_index,
7430            d: f_d,
7431            #[cfg(feature = "extra-attrs")]
7432            extra_attrs,
7433            #[cfg(feature = "extra-children")]
7434            extra_children,
7435        })
7436    }
7437}
7438
7439impl FromXml for PivotCacheRecords {
7440    fn from_xml<R: BufRead>(
7441        reader: &mut Reader<R>,
7442        start_tag: &BytesStart,
7443        is_empty: bool,
7444    ) -> Result<Self, ParseError> {
7445        let mut f_count = None;
7446        let mut f_reference = Vec::new();
7447        let mut f_extension_list = None;
7448        #[cfg(feature = "extra-attrs")]
7449        let mut extra_attrs = std::collections::HashMap::new();
7450        #[cfg(feature = "extra-children")]
7451        let mut extra_children = Vec::new();
7452        #[cfg(feature = "extra-children")]
7453        let mut child_idx: usize = 0;
7454
7455        // Parse attributes
7456        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7457            let val = String::from_utf8_lossy(&attr.value);
7458            match attr.key.local_name().as_ref() {
7459                b"count" => {
7460                    f_count = val.parse().ok();
7461                }
7462                #[cfg(feature = "extra-attrs")]
7463                unknown => {
7464                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7465                    extra_attrs.insert(key, val.into_owned());
7466                }
7467                #[cfg(not(feature = "extra-attrs"))]
7468                _ => {}
7469            }
7470        }
7471
7472        // Parse child elements
7473        if !is_empty {
7474            let mut buf = Vec::new();
7475            loop {
7476                match reader.read_event_into(&mut buf)? {
7477                    Event::Start(e) => {
7478                        match e.local_name().as_ref() {
7479                            b"r" => {
7480                                f_reference.push(CTRecord::from_xml(reader, &e, false)?);
7481                                #[cfg(feature = "extra-children")]
7482                                {
7483                                    child_idx += 1;
7484                                }
7485                            }
7486                            b"extLst" => {
7487                                f_extension_list =
7488                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
7489                                #[cfg(feature = "extra-children")]
7490                                {
7491                                    child_idx += 1;
7492                                }
7493                            }
7494                            #[cfg(feature = "extra-children")]
7495                            _ => {
7496                                // Capture unknown element for roundtrip
7497                                let elem = RawXmlElement::from_reader(reader, &e)?;
7498                                extra_children.push(PositionedNode::new(
7499                                    child_idx,
7500                                    RawXmlNode::Element(elem),
7501                                ));
7502                                child_idx += 1;
7503                            }
7504                            #[cfg(not(feature = "extra-children"))]
7505                            _ => {
7506                                // Skip unknown element
7507                                skip_element(reader)?;
7508                            }
7509                        }
7510                    }
7511                    Event::Empty(e) => {
7512                        match e.local_name().as_ref() {
7513                            b"r" => {
7514                                f_reference.push(CTRecord::from_xml(reader, &e, true)?);
7515                                #[cfg(feature = "extra-children")]
7516                                {
7517                                    child_idx += 1;
7518                                }
7519                            }
7520                            b"extLst" => {
7521                                f_extension_list =
7522                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
7523                                #[cfg(feature = "extra-children")]
7524                                {
7525                                    child_idx += 1;
7526                                }
7527                            }
7528                            #[cfg(feature = "extra-children")]
7529                            _ => {
7530                                // Capture unknown empty element for roundtrip
7531                                let elem = RawXmlElement::from_empty(&e);
7532                                extra_children.push(PositionedNode::new(
7533                                    child_idx,
7534                                    RawXmlNode::Element(elem),
7535                                ));
7536                                child_idx += 1;
7537                            }
7538                            #[cfg(not(feature = "extra-children"))]
7539                            _ => {}
7540                        }
7541                    }
7542                    Event::End(_) => break,
7543                    Event::Eof => break,
7544                    _ => {}
7545                }
7546                buf.clear();
7547            }
7548        }
7549
7550        Ok(Self {
7551            count: f_count,
7552            reference: f_reference,
7553            extension_list: f_extension_list,
7554            #[cfg(feature = "extra-attrs")]
7555            extra_attrs,
7556            #[cfg(feature = "extra-children")]
7557            extra_children,
7558        })
7559    }
7560}
7561
7562impl FromXml for CTRecord {
7563    fn from_xml<R: BufRead>(
7564        reader: &mut Reader<R>,
7565        start_tag: &BytesStart,
7566        is_empty: bool,
7567    ) -> Result<Self, ParseError> {
7568        let mut f_m = Vec::new();
7569        let mut f_n = Vec::new();
7570        let mut f_b = Vec::new();
7571        let mut f_e = Vec::new();
7572        let mut f_style_index = Vec::new();
7573        let mut f_d = Vec::new();
7574        let mut f_x = Vec::new();
7575        #[cfg(feature = "extra-children")]
7576        let mut extra_children = Vec::new();
7577        #[cfg(feature = "extra-children")]
7578        let mut child_idx: usize = 0;
7579
7580        // Parse child elements
7581        if !is_empty {
7582            let mut buf = Vec::new();
7583            loop {
7584                match reader.read_event_into(&mut buf)? {
7585                    Event::Start(e) => {
7586                        match e.local_name().as_ref() {
7587                            b"m" => {
7588                                f_m.push(CTMissing::from_xml(reader, &e, false)?);
7589                                #[cfg(feature = "extra-children")]
7590                                {
7591                                    child_idx += 1;
7592                                }
7593                            }
7594                            b"n" => {
7595                                f_n.push(CTNumber::from_xml(reader, &e, false)?);
7596                                #[cfg(feature = "extra-children")]
7597                                {
7598                                    child_idx += 1;
7599                                }
7600                            }
7601                            b"b" => {
7602                                f_b.push(CTBoolean::from_xml(reader, &e, false)?);
7603                                #[cfg(feature = "extra-children")]
7604                                {
7605                                    child_idx += 1;
7606                                }
7607                            }
7608                            b"e" => {
7609                                f_e.push(CTError::from_xml(reader, &e, false)?);
7610                                #[cfg(feature = "extra-children")]
7611                                {
7612                                    child_idx += 1;
7613                                }
7614                            }
7615                            b"s" => {
7616                                f_style_index.push(CTString::from_xml(reader, &e, false)?);
7617                                #[cfg(feature = "extra-children")]
7618                                {
7619                                    child_idx += 1;
7620                                }
7621                            }
7622                            b"d" => {
7623                                f_d.push(CTDateTime::from_xml(reader, &e, false)?);
7624                                #[cfg(feature = "extra-children")]
7625                                {
7626                                    child_idx += 1;
7627                                }
7628                            }
7629                            b"x" => {
7630                                f_x.push(CTIndex::from_xml(reader, &e, false)?);
7631                                #[cfg(feature = "extra-children")]
7632                                {
7633                                    child_idx += 1;
7634                                }
7635                            }
7636                            #[cfg(feature = "extra-children")]
7637                            _ => {
7638                                // Capture unknown element for roundtrip
7639                                let elem = RawXmlElement::from_reader(reader, &e)?;
7640                                extra_children.push(PositionedNode::new(
7641                                    child_idx,
7642                                    RawXmlNode::Element(elem),
7643                                ));
7644                                child_idx += 1;
7645                            }
7646                            #[cfg(not(feature = "extra-children"))]
7647                            _ => {
7648                                // Skip unknown element
7649                                skip_element(reader)?;
7650                            }
7651                        }
7652                    }
7653                    Event::Empty(e) => {
7654                        match e.local_name().as_ref() {
7655                            b"m" => {
7656                                f_m.push(CTMissing::from_xml(reader, &e, true)?);
7657                                #[cfg(feature = "extra-children")]
7658                                {
7659                                    child_idx += 1;
7660                                }
7661                            }
7662                            b"n" => {
7663                                f_n.push(CTNumber::from_xml(reader, &e, true)?);
7664                                #[cfg(feature = "extra-children")]
7665                                {
7666                                    child_idx += 1;
7667                                }
7668                            }
7669                            b"b" => {
7670                                f_b.push(CTBoolean::from_xml(reader, &e, true)?);
7671                                #[cfg(feature = "extra-children")]
7672                                {
7673                                    child_idx += 1;
7674                                }
7675                            }
7676                            b"e" => {
7677                                f_e.push(CTError::from_xml(reader, &e, true)?);
7678                                #[cfg(feature = "extra-children")]
7679                                {
7680                                    child_idx += 1;
7681                                }
7682                            }
7683                            b"s" => {
7684                                f_style_index.push(CTString::from_xml(reader, &e, true)?);
7685                                #[cfg(feature = "extra-children")]
7686                                {
7687                                    child_idx += 1;
7688                                }
7689                            }
7690                            b"d" => {
7691                                f_d.push(CTDateTime::from_xml(reader, &e, true)?);
7692                                #[cfg(feature = "extra-children")]
7693                                {
7694                                    child_idx += 1;
7695                                }
7696                            }
7697                            b"x" => {
7698                                f_x.push(CTIndex::from_xml(reader, &e, true)?);
7699                                #[cfg(feature = "extra-children")]
7700                                {
7701                                    child_idx += 1;
7702                                }
7703                            }
7704                            #[cfg(feature = "extra-children")]
7705                            _ => {
7706                                // Capture unknown empty element for roundtrip
7707                                let elem = RawXmlElement::from_empty(&e);
7708                                extra_children.push(PositionedNode::new(
7709                                    child_idx,
7710                                    RawXmlNode::Element(elem),
7711                                ));
7712                                child_idx += 1;
7713                            }
7714                            #[cfg(not(feature = "extra-children"))]
7715                            _ => {}
7716                        }
7717                    }
7718                    Event::End(_) => break,
7719                    Event::Eof => break,
7720                    _ => {}
7721                }
7722                buf.clear();
7723            }
7724        }
7725
7726        Ok(Self {
7727            m: f_m,
7728            n: f_n,
7729            b: f_b,
7730            e: f_e,
7731            style_index: f_style_index,
7732            d: f_d,
7733            x: f_x,
7734            #[cfg(feature = "extra-children")]
7735            extra_children,
7736        })
7737    }
7738}
7739
7740impl FromXml for CTPCDKPIs {
7741    fn from_xml<R: BufRead>(
7742        reader: &mut Reader<R>,
7743        start_tag: &BytesStart,
7744        is_empty: bool,
7745    ) -> Result<Self, ParseError> {
7746        let mut f_count = None;
7747        let mut f_kpi = Vec::new();
7748        #[cfg(feature = "extra-attrs")]
7749        let mut extra_attrs = std::collections::HashMap::new();
7750        #[cfg(feature = "extra-children")]
7751        let mut extra_children = Vec::new();
7752        #[cfg(feature = "extra-children")]
7753        let mut child_idx: usize = 0;
7754
7755        // Parse attributes
7756        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7757            let val = String::from_utf8_lossy(&attr.value);
7758            match attr.key.local_name().as_ref() {
7759                b"count" => {
7760                    f_count = val.parse().ok();
7761                }
7762                #[cfg(feature = "extra-attrs")]
7763                unknown => {
7764                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7765                    extra_attrs.insert(key, val.into_owned());
7766                }
7767                #[cfg(not(feature = "extra-attrs"))]
7768                _ => {}
7769            }
7770        }
7771
7772        // Parse child elements
7773        if !is_empty {
7774            let mut buf = Vec::new();
7775            loop {
7776                match reader.read_event_into(&mut buf)? {
7777                    Event::Start(e) => {
7778                        match e.local_name().as_ref() {
7779                            b"kpi" => {
7780                                f_kpi.push(CTPCDKPI::from_xml(reader, &e, false)?);
7781                                #[cfg(feature = "extra-children")]
7782                                {
7783                                    child_idx += 1;
7784                                }
7785                            }
7786                            #[cfg(feature = "extra-children")]
7787                            _ => {
7788                                // Capture unknown element for roundtrip
7789                                let elem = RawXmlElement::from_reader(reader, &e)?;
7790                                extra_children.push(PositionedNode::new(
7791                                    child_idx,
7792                                    RawXmlNode::Element(elem),
7793                                ));
7794                                child_idx += 1;
7795                            }
7796                            #[cfg(not(feature = "extra-children"))]
7797                            _ => {
7798                                // Skip unknown element
7799                                skip_element(reader)?;
7800                            }
7801                        }
7802                    }
7803                    Event::Empty(e) => {
7804                        match e.local_name().as_ref() {
7805                            b"kpi" => {
7806                                f_kpi.push(CTPCDKPI::from_xml(reader, &e, true)?);
7807                                #[cfg(feature = "extra-children")]
7808                                {
7809                                    child_idx += 1;
7810                                }
7811                            }
7812                            #[cfg(feature = "extra-children")]
7813                            _ => {
7814                                // Capture unknown empty element for roundtrip
7815                                let elem = RawXmlElement::from_empty(&e);
7816                                extra_children.push(PositionedNode::new(
7817                                    child_idx,
7818                                    RawXmlNode::Element(elem),
7819                                ));
7820                                child_idx += 1;
7821                            }
7822                            #[cfg(not(feature = "extra-children"))]
7823                            _ => {}
7824                        }
7825                    }
7826                    Event::End(_) => break,
7827                    Event::Eof => break,
7828                    _ => {}
7829                }
7830                buf.clear();
7831            }
7832        }
7833
7834        Ok(Self {
7835            count: f_count,
7836            kpi: f_kpi,
7837            #[cfg(feature = "extra-attrs")]
7838            extra_attrs,
7839            #[cfg(feature = "extra-children")]
7840            extra_children,
7841        })
7842    }
7843}
7844
7845impl FromXml for CTPCDKPI {
7846    fn from_xml<R: BufRead>(
7847        reader: &mut Reader<R>,
7848        start_tag: &BytesStart,
7849        is_empty: bool,
7850    ) -> Result<Self, ParseError> {
7851        let mut f_unique_name: Option<XmlString> = None;
7852        let mut f_caption = None;
7853        let mut f_display_folder = None;
7854        let mut f_measure_group = None;
7855        let mut f_parent = None;
7856        let mut f_value: Option<XmlString> = None;
7857        let mut f_goal = None;
7858        let mut f_status = None;
7859        let mut f_trend = None;
7860        let mut f_weight = None;
7861        let mut f_time = None;
7862        #[cfg(feature = "extra-attrs")]
7863        let mut extra_attrs = std::collections::HashMap::new();
7864
7865        // Parse attributes
7866        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7867            let val = String::from_utf8_lossy(&attr.value);
7868            match attr.key.local_name().as_ref() {
7869                b"uniqueName" => {
7870                    f_unique_name = Some(val.into_owned());
7871                }
7872                b"caption" => {
7873                    f_caption = Some(val.into_owned());
7874                }
7875                b"displayFolder" => {
7876                    f_display_folder = Some(val.into_owned());
7877                }
7878                b"measureGroup" => {
7879                    f_measure_group = Some(val.into_owned());
7880                }
7881                b"parent" => {
7882                    f_parent = Some(val.into_owned());
7883                }
7884                b"value" => {
7885                    f_value = Some(val.into_owned());
7886                }
7887                b"goal" => {
7888                    f_goal = Some(val.into_owned());
7889                }
7890                b"status" => {
7891                    f_status = Some(val.into_owned());
7892                }
7893                b"trend" => {
7894                    f_trend = Some(val.into_owned());
7895                }
7896                b"weight" => {
7897                    f_weight = Some(val.into_owned());
7898                }
7899                b"time" => {
7900                    f_time = Some(val.into_owned());
7901                }
7902                #[cfg(feature = "extra-attrs")]
7903                unknown => {
7904                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7905                    extra_attrs.insert(key, val.into_owned());
7906                }
7907                #[cfg(not(feature = "extra-attrs"))]
7908                _ => {}
7909            }
7910        }
7911
7912        if !is_empty {
7913            let mut buf = Vec::new();
7914            loop {
7915                match reader.read_event_into(&mut buf)? {
7916                    Event::End(_) => break,
7917                    Event::Eof => break,
7918                    _ => {}
7919                }
7920                buf.clear();
7921            }
7922        }
7923
7924        Ok(Self {
7925            unique_name: f_unique_name
7926                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
7927            caption: f_caption,
7928            display_folder: f_display_folder,
7929            measure_group: f_measure_group,
7930            parent: f_parent,
7931            value: f_value.ok_or_else(|| ParseError::MissingAttribute("value".to_string()))?,
7932            goal: f_goal,
7933            status: f_status,
7934            trend: f_trend,
7935            weight: f_weight,
7936            time: f_time,
7937            #[cfg(feature = "extra-attrs")]
7938            extra_attrs,
7939        })
7940    }
7941}
7942
7943impl FromXml for CTCacheHierarchies {
7944    fn from_xml<R: BufRead>(
7945        reader: &mut Reader<R>,
7946        start_tag: &BytesStart,
7947        is_empty: bool,
7948    ) -> Result<Self, ParseError> {
7949        let mut f_count = None;
7950        let mut f_cache_hierarchy = Vec::new();
7951        #[cfg(feature = "extra-attrs")]
7952        let mut extra_attrs = std::collections::HashMap::new();
7953        #[cfg(feature = "extra-children")]
7954        let mut extra_children = Vec::new();
7955        #[cfg(feature = "extra-children")]
7956        let mut child_idx: usize = 0;
7957
7958        // Parse attributes
7959        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
7960            let val = String::from_utf8_lossy(&attr.value);
7961            match attr.key.local_name().as_ref() {
7962                b"count" => {
7963                    f_count = val.parse().ok();
7964                }
7965                #[cfg(feature = "extra-attrs")]
7966                unknown => {
7967                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
7968                    extra_attrs.insert(key, val.into_owned());
7969                }
7970                #[cfg(not(feature = "extra-attrs"))]
7971                _ => {}
7972            }
7973        }
7974
7975        // Parse child elements
7976        if !is_empty {
7977            let mut buf = Vec::new();
7978            loop {
7979                match reader.read_event_into(&mut buf)? {
7980                    Event::Start(e) => {
7981                        match e.local_name().as_ref() {
7982                            b"cacheHierarchy" => {
7983                                f_cache_hierarchy
7984                                    .push(CTCacheHierarchy::from_xml(reader, &e, false)?);
7985                                #[cfg(feature = "extra-children")]
7986                                {
7987                                    child_idx += 1;
7988                                }
7989                            }
7990                            #[cfg(feature = "extra-children")]
7991                            _ => {
7992                                // Capture unknown element for roundtrip
7993                                let elem = RawXmlElement::from_reader(reader, &e)?;
7994                                extra_children.push(PositionedNode::new(
7995                                    child_idx,
7996                                    RawXmlNode::Element(elem),
7997                                ));
7998                                child_idx += 1;
7999                            }
8000                            #[cfg(not(feature = "extra-children"))]
8001                            _ => {
8002                                // Skip unknown element
8003                                skip_element(reader)?;
8004                            }
8005                        }
8006                    }
8007                    Event::Empty(e) => {
8008                        match e.local_name().as_ref() {
8009                            b"cacheHierarchy" => {
8010                                f_cache_hierarchy
8011                                    .push(CTCacheHierarchy::from_xml(reader, &e, true)?);
8012                                #[cfg(feature = "extra-children")]
8013                                {
8014                                    child_idx += 1;
8015                                }
8016                            }
8017                            #[cfg(feature = "extra-children")]
8018                            _ => {
8019                                // Capture unknown empty element for roundtrip
8020                                let elem = RawXmlElement::from_empty(&e);
8021                                extra_children.push(PositionedNode::new(
8022                                    child_idx,
8023                                    RawXmlNode::Element(elem),
8024                                ));
8025                                child_idx += 1;
8026                            }
8027                            #[cfg(not(feature = "extra-children"))]
8028                            _ => {}
8029                        }
8030                    }
8031                    Event::End(_) => break,
8032                    Event::Eof => break,
8033                    _ => {}
8034                }
8035                buf.clear();
8036            }
8037        }
8038
8039        Ok(Self {
8040            count: f_count,
8041            cache_hierarchy: f_cache_hierarchy,
8042            #[cfg(feature = "extra-attrs")]
8043            extra_attrs,
8044            #[cfg(feature = "extra-children")]
8045            extra_children,
8046        })
8047    }
8048}
8049
8050impl FromXml for CTCacheHierarchy {
8051    fn from_xml<R: BufRead>(
8052        reader: &mut Reader<R>,
8053        start_tag: &BytesStart,
8054        is_empty: bool,
8055    ) -> Result<Self, ParseError> {
8056        let mut f_unique_name: Option<XmlString> = None;
8057        let mut f_caption = None;
8058        let mut f_measure = None;
8059        let mut f_set = None;
8060        let mut f_parent_set = None;
8061        let mut f_icon_set = None;
8062        let mut f_attribute = None;
8063        let mut f_time = None;
8064        let mut f_key_attribute = None;
8065        let mut f_default_member_unique_name = None;
8066        let mut f_all_unique_name = None;
8067        let mut f_all_caption = None;
8068        let mut f_dimension_unique_name = None;
8069        let mut f_display_folder = None;
8070        let mut f_measure_group = None;
8071        let mut f_measures = None;
8072        let mut f_count: Option<u32> = None;
8073        let mut f_one_field = None;
8074        let mut f_member_value_datatype = None;
8075        let mut f_unbalanced = None;
8076        let mut f_unbalanced_group = None;
8077        let mut f_hidden = None;
8078        let mut f_fields_usage = None;
8079        let mut f_group_levels = None;
8080        let mut f_extension_list = None;
8081        #[cfg(feature = "extra-attrs")]
8082        let mut extra_attrs = std::collections::HashMap::new();
8083        #[cfg(feature = "extra-children")]
8084        let mut extra_children = Vec::new();
8085        #[cfg(feature = "extra-children")]
8086        let mut child_idx: usize = 0;
8087
8088        // Parse attributes
8089        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8090            let val = String::from_utf8_lossy(&attr.value);
8091            match attr.key.local_name().as_ref() {
8092                b"uniqueName" => {
8093                    f_unique_name = Some(val.into_owned());
8094                }
8095                b"caption" => {
8096                    f_caption = Some(val.into_owned());
8097                }
8098                b"measure" => {
8099                    f_measure = Some(val == "true" || val == "1");
8100                }
8101                b"set" => {
8102                    f_set = Some(val == "true" || val == "1");
8103                }
8104                b"parentSet" => {
8105                    f_parent_set = val.parse().ok();
8106                }
8107                b"iconSet" => {
8108                    f_icon_set = val.parse().ok();
8109                }
8110                b"attribute" => {
8111                    f_attribute = Some(val == "true" || val == "1");
8112                }
8113                b"time" => {
8114                    f_time = Some(val == "true" || val == "1");
8115                }
8116                b"keyAttribute" => {
8117                    f_key_attribute = Some(val == "true" || val == "1");
8118                }
8119                b"defaultMemberUniqueName" => {
8120                    f_default_member_unique_name = Some(val.into_owned());
8121                }
8122                b"allUniqueName" => {
8123                    f_all_unique_name = Some(val.into_owned());
8124                }
8125                b"allCaption" => {
8126                    f_all_caption = Some(val.into_owned());
8127                }
8128                b"dimensionUniqueName" => {
8129                    f_dimension_unique_name = Some(val.into_owned());
8130                }
8131                b"displayFolder" => {
8132                    f_display_folder = Some(val.into_owned());
8133                }
8134                b"measureGroup" => {
8135                    f_measure_group = Some(val.into_owned());
8136                }
8137                b"measures" => {
8138                    f_measures = Some(val == "true" || val == "1");
8139                }
8140                b"count" => {
8141                    f_count = val.parse().ok();
8142                }
8143                b"oneField" => {
8144                    f_one_field = Some(val == "true" || val == "1");
8145                }
8146                b"memberValueDatatype" => {
8147                    f_member_value_datatype = val.parse().ok();
8148                }
8149                b"unbalanced" => {
8150                    f_unbalanced = Some(val == "true" || val == "1");
8151                }
8152                b"unbalancedGroup" => {
8153                    f_unbalanced_group = Some(val == "true" || val == "1");
8154                }
8155                b"hidden" => {
8156                    f_hidden = Some(val == "true" || val == "1");
8157                }
8158                #[cfg(feature = "extra-attrs")]
8159                unknown => {
8160                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8161                    extra_attrs.insert(key, val.into_owned());
8162                }
8163                #[cfg(not(feature = "extra-attrs"))]
8164                _ => {}
8165            }
8166        }
8167
8168        // Parse child elements
8169        if !is_empty {
8170            let mut buf = Vec::new();
8171            loop {
8172                match reader.read_event_into(&mut buf)? {
8173                    Event::Start(e) => {
8174                        match e.local_name().as_ref() {
8175                            b"fieldsUsage" => {
8176                                f_fields_usage =
8177                                    Some(Box::new(CTFieldsUsage::from_xml(reader, &e, false)?));
8178                                #[cfg(feature = "extra-children")]
8179                                {
8180                                    child_idx += 1;
8181                                }
8182                            }
8183                            b"groupLevels" => {
8184                                f_group_levels =
8185                                    Some(Box::new(CTGroupLevels::from_xml(reader, &e, false)?));
8186                                #[cfg(feature = "extra-children")]
8187                                {
8188                                    child_idx += 1;
8189                                }
8190                            }
8191                            b"extLst" => {
8192                                f_extension_list =
8193                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
8194                                #[cfg(feature = "extra-children")]
8195                                {
8196                                    child_idx += 1;
8197                                }
8198                            }
8199                            #[cfg(feature = "extra-children")]
8200                            _ => {
8201                                // Capture unknown element for roundtrip
8202                                let elem = RawXmlElement::from_reader(reader, &e)?;
8203                                extra_children.push(PositionedNode::new(
8204                                    child_idx,
8205                                    RawXmlNode::Element(elem),
8206                                ));
8207                                child_idx += 1;
8208                            }
8209                            #[cfg(not(feature = "extra-children"))]
8210                            _ => {
8211                                // Skip unknown element
8212                                skip_element(reader)?;
8213                            }
8214                        }
8215                    }
8216                    Event::Empty(e) => {
8217                        match e.local_name().as_ref() {
8218                            b"fieldsUsage" => {
8219                                f_fields_usage =
8220                                    Some(Box::new(CTFieldsUsage::from_xml(reader, &e, true)?));
8221                                #[cfg(feature = "extra-children")]
8222                                {
8223                                    child_idx += 1;
8224                                }
8225                            }
8226                            b"groupLevels" => {
8227                                f_group_levels =
8228                                    Some(Box::new(CTGroupLevels::from_xml(reader, &e, true)?));
8229                                #[cfg(feature = "extra-children")]
8230                                {
8231                                    child_idx += 1;
8232                                }
8233                            }
8234                            b"extLst" => {
8235                                f_extension_list =
8236                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
8237                                #[cfg(feature = "extra-children")]
8238                                {
8239                                    child_idx += 1;
8240                                }
8241                            }
8242                            #[cfg(feature = "extra-children")]
8243                            _ => {
8244                                // Capture unknown empty element for roundtrip
8245                                let elem = RawXmlElement::from_empty(&e);
8246                                extra_children.push(PositionedNode::new(
8247                                    child_idx,
8248                                    RawXmlNode::Element(elem),
8249                                ));
8250                                child_idx += 1;
8251                            }
8252                            #[cfg(not(feature = "extra-children"))]
8253                            _ => {}
8254                        }
8255                    }
8256                    Event::End(_) => break,
8257                    Event::Eof => break,
8258                    _ => {}
8259                }
8260                buf.clear();
8261            }
8262        }
8263
8264        Ok(Self {
8265            unique_name: f_unique_name
8266                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
8267            caption: f_caption,
8268            measure: f_measure,
8269            set: f_set,
8270            parent_set: f_parent_set,
8271            icon_set: f_icon_set,
8272            attribute: f_attribute,
8273            time: f_time,
8274            key_attribute: f_key_attribute,
8275            default_member_unique_name: f_default_member_unique_name,
8276            all_unique_name: f_all_unique_name,
8277            all_caption: f_all_caption,
8278            dimension_unique_name: f_dimension_unique_name,
8279            display_folder: f_display_folder,
8280            measure_group: f_measure_group,
8281            measures: f_measures,
8282            count: f_count.ok_or_else(|| ParseError::MissingAttribute("count".to_string()))?,
8283            one_field: f_one_field,
8284            member_value_datatype: f_member_value_datatype,
8285            unbalanced: f_unbalanced,
8286            unbalanced_group: f_unbalanced_group,
8287            hidden: f_hidden,
8288            fields_usage: f_fields_usage,
8289            group_levels: f_group_levels,
8290            extension_list: f_extension_list,
8291            #[cfg(feature = "extra-attrs")]
8292            extra_attrs,
8293            #[cfg(feature = "extra-children")]
8294            extra_children,
8295        })
8296    }
8297}
8298
8299impl FromXml for CTFieldsUsage {
8300    fn from_xml<R: BufRead>(
8301        reader: &mut Reader<R>,
8302        start_tag: &BytesStart,
8303        is_empty: bool,
8304    ) -> Result<Self, ParseError> {
8305        let mut f_count = None;
8306        let mut f_field_usage = Vec::new();
8307        #[cfg(feature = "extra-attrs")]
8308        let mut extra_attrs = std::collections::HashMap::new();
8309        #[cfg(feature = "extra-children")]
8310        let mut extra_children = Vec::new();
8311        #[cfg(feature = "extra-children")]
8312        let mut child_idx: usize = 0;
8313
8314        // Parse attributes
8315        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8316            let val = String::from_utf8_lossy(&attr.value);
8317            match attr.key.local_name().as_ref() {
8318                b"count" => {
8319                    f_count = val.parse().ok();
8320                }
8321                #[cfg(feature = "extra-attrs")]
8322                unknown => {
8323                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8324                    extra_attrs.insert(key, val.into_owned());
8325                }
8326                #[cfg(not(feature = "extra-attrs"))]
8327                _ => {}
8328            }
8329        }
8330
8331        // Parse child elements
8332        if !is_empty {
8333            let mut buf = Vec::new();
8334            loop {
8335                match reader.read_event_into(&mut buf)? {
8336                    Event::Start(e) => {
8337                        match e.local_name().as_ref() {
8338                            b"fieldUsage" => {
8339                                f_field_usage.push(CTFieldUsage::from_xml(reader, &e, false)?);
8340                                #[cfg(feature = "extra-children")]
8341                                {
8342                                    child_idx += 1;
8343                                }
8344                            }
8345                            #[cfg(feature = "extra-children")]
8346                            _ => {
8347                                // Capture unknown element for roundtrip
8348                                let elem = RawXmlElement::from_reader(reader, &e)?;
8349                                extra_children.push(PositionedNode::new(
8350                                    child_idx,
8351                                    RawXmlNode::Element(elem),
8352                                ));
8353                                child_idx += 1;
8354                            }
8355                            #[cfg(not(feature = "extra-children"))]
8356                            _ => {
8357                                // Skip unknown element
8358                                skip_element(reader)?;
8359                            }
8360                        }
8361                    }
8362                    Event::Empty(e) => {
8363                        match e.local_name().as_ref() {
8364                            b"fieldUsage" => {
8365                                f_field_usage.push(CTFieldUsage::from_xml(reader, &e, true)?);
8366                                #[cfg(feature = "extra-children")]
8367                                {
8368                                    child_idx += 1;
8369                                }
8370                            }
8371                            #[cfg(feature = "extra-children")]
8372                            _ => {
8373                                // Capture unknown empty element for roundtrip
8374                                let elem = RawXmlElement::from_empty(&e);
8375                                extra_children.push(PositionedNode::new(
8376                                    child_idx,
8377                                    RawXmlNode::Element(elem),
8378                                ));
8379                                child_idx += 1;
8380                            }
8381                            #[cfg(not(feature = "extra-children"))]
8382                            _ => {}
8383                        }
8384                    }
8385                    Event::End(_) => break,
8386                    Event::Eof => break,
8387                    _ => {}
8388                }
8389                buf.clear();
8390            }
8391        }
8392
8393        Ok(Self {
8394            count: f_count,
8395            field_usage: f_field_usage,
8396            #[cfg(feature = "extra-attrs")]
8397            extra_attrs,
8398            #[cfg(feature = "extra-children")]
8399            extra_children,
8400        })
8401    }
8402}
8403
8404impl FromXml for CTFieldUsage {
8405    fn from_xml<R: BufRead>(
8406        reader: &mut Reader<R>,
8407        start_tag: &BytesStart,
8408        is_empty: bool,
8409    ) -> Result<Self, ParseError> {
8410        let mut f_x: Option<i32> = None;
8411        #[cfg(feature = "extra-attrs")]
8412        let mut extra_attrs = std::collections::HashMap::new();
8413
8414        // Parse attributes
8415        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8416            let val = String::from_utf8_lossy(&attr.value);
8417            match attr.key.local_name().as_ref() {
8418                b"x" => {
8419                    f_x = val.parse().ok();
8420                }
8421                #[cfg(feature = "extra-attrs")]
8422                unknown => {
8423                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8424                    extra_attrs.insert(key, val.into_owned());
8425                }
8426                #[cfg(not(feature = "extra-attrs"))]
8427                _ => {}
8428            }
8429        }
8430
8431        if !is_empty {
8432            let mut buf = Vec::new();
8433            loop {
8434                match reader.read_event_into(&mut buf)? {
8435                    Event::End(_) => break,
8436                    Event::Eof => break,
8437                    _ => {}
8438                }
8439                buf.clear();
8440            }
8441        }
8442
8443        Ok(Self {
8444            x: f_x.ok_or_else(|| ParseError::MissingAttribute("x".to_string()))?,
8445            #[cfg(feature = "extra-attrs")]
8446            extra_attrs,
8447        })
8448    }
8449}
8450
8451impl FromXml for CTGroupLevels {
8452    fn from_xml<R: BufRead>(
8453        reader: &mut Reader<R>,
8454        start_tag: &BytesStart,
8455        is_empty: bool,
8456    ) -> Result<Self, ParseError> {
8457        let mut f_count = None;
8458        let mut f_group_level = Vec::new();
8459        #[cfg(feature = "extra-attrs")]
8460        let mut extra_attrs = std::collections::HashMap::new();
8461        #[cfg(feature = "extra-children")]
8462        let mut extra_children = Vec::new();
8463        #[cfg(feature = "extra-children")]
8464        let mut child_idx: usize = 0;
8465
8466        // Parse attributes
8467        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8468            let val = String::from_utf8_lossy(&attr.value);
8469            match attr.key.local_name().as_ref() {
8470                b"count" => {
8471                    f_count = val.parse().ok();
8472                }
8473                #[cfg(feature = "extra-attrs")]
8474                unknown => {
8475                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8476                    extra_attrs.insert(key, val.into_owned());
8477                }
8478                #[cfg(not(feature = "extra-attrs"))]
8479                _ => {}
8480            }
8481        }
8482
8483        // Parse child elements
8484        if !is_empty {
8485            let mut buf = Vec::new();
8486            loop {
8487                match reader.read_event_into(&mut buf)? {
8488                    Event::Start(e) => {
8489                        match e.local_name().as_ref() {
8490                            b"groupLevel" => {
8491                                f_group_level.push(CTGroupLevel::from_xml(reader, &e, false)?);
8492                                #[cfg(feature = "extra-children")]
8493                                {
8494                                    child_idx += 1;
8495                                }
8496                            }
8497                            #[cfg(feature = "extra-children")]
8498                            _ => {
8499                                // Capture unknown element for roundtrip
8500                                let elem = RawXmlElement::from_reader(reader, &e)?;
8501                                extra_children.push(PositionedNode::new(
8502                                    child_idx,
8503                                    RawXmlNode::Element(elem),
8504                                ));
8505                                child_idx += 1;
8506                            }
8507                            #[cfg(not(feature = "extra-children"))]
8508                            _ => {
8509                                // Skip unknown element
8510                                skip_element(reader)?;
8511                            }
8512                        }
8513                    }
8514                    Event::Empty(e) => {
8515                        match e.local_name().as_ref() {
8516                            b"groupLevel" => {
8517                                f_group_level.push(CTGroupLevel::from_xml(reader, &e, true)?);
8518                                #[cfg(feature = "extra-children")]
8519                                {
8520                                    child_idx += 1;
8521                                }
8522                            }
8523                            #[cfg(feature = "extra-children")]
8524                            _ => {
8525                                // Capture unknown empty element for roundtrip
8526                                let elem = RawXmlElement::from_empty(&e);
8527                                extra_children.push(PositionedNode::new(
8528                                    child_idx,
8529                                    RawXmlNode::Element(elem),
8530                                ));
8531                                child_idx += 1;
8532                            }
8533                            #[cfg(not(feature = "extra-children"))]
8534                            _ => {}
8535                        }
8536                    }
8537                    Event::End(_) => break,
8538                    Event::Eof => break,
8539                    _ => {}
8540                }
8541                buf.clear();
8542            }
8543        }
8544
8545        Ok(Self {
8546            count: f_count,
8547            group_level: f_group_level,
8548            #[cfg(feature = "extra-attrs")]
8549            extra_attrs,
8550            #[cfg(feature = "extra-children")]
8551            extra_children,
8552        })
8553    }
8554}
8555
8556impl FromXml for CTGroupLevel {
8557    fn from_xml<R: BufRead>(
8558        reader: &mut Reader<R>,
8559        start_tag: &BytesStart,
8560        is_empty: bool,
8561    ) -> Result<Self, ParseError> {
8562        let mut f_unique_name: Option<XmlString> = None;
8563        let mut f_caption: Option<XmlString> = None;
8564        let mut f_user = None;
8565        let mut f_custom_roll_up = None;
8566        let mut f_groups = None;
8567        let mut f_extension_list = None;
8568        #[cfg(feature = "extra-attrs")]
8569        let mut extra_attrs = std::collections::HashMap::new();
8570        #[cfg(feature = "extra-children")]
8571        let mut extra_children = Vec::new();
8572        #[cfg(feature = "extra-children")]
8573        let mut child_idx: usize = 0;
8574
8575        // Parse attributes
8576        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8577            let val = String::from_utf8_lossy(&attr.value);
8578            match attr.key.local_name().as_ref() {
8579                b"uniqueName" => {
8580                    f_unique_name = Some(val.into_owned());
8581                }
8582                b"caption" => {
8583                    f_caption = Some(val.into_owned());
8584                }
8585                b"user" => {
8586                    f_user = Some(val == "true" || val == "1");
8587                }
8588                b"customRollUp" => {
8589                    f_custom_roll_up = Some(val == "true" || val == "1");
8590                }
8591                #[cfg(feature = "extra-attrs")]
8592                unknown => {
8593                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8594                    extra_attrs.insert(key, val.into_owned());
8595                }
8596                #[cfg(not(feature = "extra-attrs"))]
8597                _ => {}
8598            }
8599        }
8600
8601        // Parse child elements
8602        if !is_empty {
8603            let mut buf = Vec::new();
8604            loop {
8605                match reader.read_event_into(&mut buf)? {
8606                    Event::Start(e) => {
8607                        match e.local_name().as_ref() {
8608                            b"groups" => {
8609                                f_groups = Some(Box::new(CTGroups::from_xml(reader, &e, false)?));
8610                                #[cfg(feature = "extra-children")]
8611                                {
8612                                    child_idx += 1;
8613                                }
8614                            }
8615                            b"extLst" => {
8616                                f_extension_list =
8617                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
8618                                #[cfg(feature = "extra-children")]
8619                                {
8620                                    child_idx += 1;
8621                                }
8622                            }
8623                            #[cfg(feature = "extra-children")]
8624                            _ => {
8625                                // Capture unknown element for roundtrip
8626                                let elem = RawXmlElement::from_reader(reader, &e)?;
8627                                extra_children.push(PositionedNode::new(
8628                                    child_idx,
8629                                    RawXmlNode::Element(elem),
8630                                ));
8631                                child_idx += 1;
8632                            }
8633                            #[cfg(not(feature = "extra-children"))]
8634                            _ => {
8635                                // Skip unknown element
8636                                skip_element(reader)?;
8637                            }
8638                        }
8639                    }
8640                    Event::Empty(e) => {
8641                        match e.local_name().as_ref() {
8642                            b"groups" => {
8643                                f_groups = Some(Box::new(CTGroups::from_xml(reader, &e, true)?));
8644                                #[cfg(feature = "extra-children")]
8645                                {
8646                                    child_idx += 1;
8647                                }
8648                            }
8649                            b"extLst" => {
8650                                f_extension_list =
8651                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
8652                                #[cfg(feature = "extra-children")]
8653                                {
8654                                    child_idx += 1;
8655                                }
8656                            }
8657                            #[cfg(feature = "extra-children")]
8658                            _ => {
8659                                // Capture unknown empty element for roundtrip
8660                                let elem = RawXmlElement::from_empty(&e);
8661                                extra_children.push(PositionedNode::new(
8662                                    child_idx,
8663                                    RawXmlNode::Element(elem),
8664                                ));
8665                                child_idx += 1;
8666                            }
8667                            #[cfg(not(feature = "extra-children"))]
8668                            _ => {}
8669                        }
8670                    }
8671                    Event::End(_) => break,
8672                    Event::Eof => break,
8673                    _ => {}
8674                }
8675                buf.clear();
8676            }
8677        }
8678
8679        Ok(Self {
8680            unique_name: f_unique_name
8681                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
8682            caption: f_caption
8683                .ok_or_else(|| ParseError::MissingAttribute("caption".to_string()))?,
8684            user: f_user,
8685            custom_roll_up: f_custom_roll_up,
8686            groups: f_groups,
8687            extension_list: f_extension_list,
8688            #[cfg(feature = "extra-attrs")]
8689            extra_attrs,
8690            #[cfg(feature = "extra-children")]
8691            extra_children,
8692        })
8693    }
8694}
8695
8696impl FromXml for CTGroups {
8697    fn from_xml<R: BufRead>(
8698        reader: &mut Reader<R>,
8699        start_tag: &BytesStart,
8700        is_empty: bool,
8701    ) -> Result<Self, ParseError> {
8702        let mut f_count = None;
8703        let mut f_group = Vec::new();
8704        #[cfg(feature = "extra-attrs")]
8705        let mut extra_attrs = std::collections::HashMap::new();
8706        #[cfg(feature = "extra-children")]
8707        let mut extra_children = Vec::new();
8708        #[cfg(feature = "extra-children")]
8709        let mut child_idx: usize = 0;
8710
8711        // Parse attributes
8712        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8713            let val = String::from_utf8_lossy(&attr.value);
8714            match attr.key.local_name().as_ref() {
8715                b"count" => {
8716                    f_count = val.parse().ok();
8717                }
8718                #[cfg(feature = "extra-attrs")]
8719                unknown => {
8720                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8721                    extra_attrs.insert(key, val.into_owned());
8722                }
8723                #[cfg(not(feature = "extra-attrs"))]
8724                _ => {}
8725            }
8726        }
8727
8728        // Parse child elements
8729        if !is_empty {
8730            let mut buf = Vec::new();
8731            loop {
8732                match reader.read_event_into(&mut buf)? {
8733                    Event::Start(e) => {
8734                        match e.local_name().as_ref() {
8735                            b"group" => {
8736                                f_group.push(CTLevelGroup::from_xml(reader, &e, false)?);
8737                                #[cfg(feature = "extra-children")]
8738                                {
8739                                    child_idx += 1;
8740                                }
8741                            }
8742                            #[cfg(feature = "extra-children")]
8743                            _ => {
8744                                // Capture unknown element for roundtrip
8745                                let elem = RawXmlElement::from_reader(reader, &e)?;
8746                                extra_children.push(PositionedNode::new(
8747                                    child_idx,
8748                                    RawXmlNode::Element(elem),
8749                                ));
8750                                child_idx += 1;
8751                            }
8752                            #[cfg(not(feature = "extra-children"))]
8753                            _ => {
8754                                // Skip unknown element
8755                                skip_element(reader)?;
8756                            }
8757                        }
8758                    }
8759                    Event::Empty(e) => {
8760                        match e.local_name().as_ref() {
8761                            b"group" => {
8762                                f_group.push(CTLevelGroup::from_xml(reader, &e, true)?);
8763                                #[cfg(feature = "extra-children")]
8764                                {
8765                                    child_idx += 1;
8766                                }
8767                            }
8768                            #[cfg(feature = "extra-children")]
8769                            _ => {
8770                                // Capture unknown empty element for roundtrip
8771                                let elem = RawXmlElement::from_empty(&e);
8772                                extra_children.push(PositionedNode::new(
8773                                    child_idx,
8774                                    RawXmlNode::Element(elem),
8775                                ));
8776                                child_idx += 1;
8777                            }
8778                            #[cfg(not(feature = "extra-children"))]
8779                            _ => {}
8780                        }
8781                    }
8782                    Event::End(_) => break,
8783                    Event::Eof => break,
8784                    _ => {}
8785                }
8786                buf.clear();
8787            }
8788        }
8789
8790        Ok(Self {
8791            count: f_count,
8792            group: f_group,
8793            #[cfg(feature = "extra-attrs")]
8794            extra_attrs,
8795            #[cfg(feature = "extra-children")]
8796            extra_children,
8797        })
8798    }
8799}
8800
8801impl FromXml for CTLevelGroup {
8802    fn from_xml<R: BufRead>(
8803        reader: &mut Reader<R>,
8804        start_tag: &BytesStart,
8805        is_empty: bool,
8806    ) -> Result<Self, ParseError> {
8807        let mut f_name: Option<XmlString> = None;
8808        let mut f_unique_name: Option<XmlString> = None;
8809        let mut f_caption: Option<XmlString> = None;
8810        let mut f_unique_parent = None;
8811        let mut f_id = None;
8812        let mut f_group_members: Option<Box<CTGroupMembers>> = None;
8813        #[cfg(feature = "extra-attrs")]
8814        let mut extra_attrs = std::collections::HashMap::new();
8815        #[cfg(feature = "extra-children")]
8816        let mut extra_children = Vec::new();
8817        #[cfg(feature = "extra-children")]
8818        let mut child_idx: usize = 0;
8819
8820        // Parse attributes
8821        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8822            let val = String::from_utf8_lossy(&attr.value);
8823            match attr.key.local_name().as_ref() {
8824                b"name" => {
8825                    f_name = Some(val.into_owned());
8826                }
8827                b"uniqueName" => {
8828                    f_unique_name = Some(val.into_owned());
8829                }
8830                b"caption" => {
8831                    f_caption = Some(val.into_owned());
8832                }
8833                b"uniqueParent" => {
8834                    f_unique_parent = Some(val.into_owned());
8835                }
8836                b"id" => {
8837                    f_id = val.parse().ok();
8838                }
8839                #[cfg(feature = "extra-attrs")]
8840                unknown => {
8841                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8842                    extra_attrs.insert(key, val.into_owned());
8843                }
8844                #[cfg(not(feature = "extra-attrs"))]
8845                _ => {}
8846            }
8847        }
8848
8849        // Parse child elements
8850        if !is_empty {
8851            let mut buf = Vec::new();
8852            loop {
8853                match reader.read_event_into(&mut buf)? {
8854                    Event::Start(e) => {
8855                        match e.local_name().as_ref() {
8856                            b"groupMembers" => {
8857                                f_group_members =
8858                                    Some(Box::new(CTGroupMembers::from_xml(reader, &e, false)?));
8859                                #[cfg(feature = "extra-children")]
8860                                {
8861                                    child_idx += 1;
8862                                }
8863                            }
8864                            #[cfg(feature = "extra-children")]
8865                            _ => {
8866                                // Capture unknown element for roundtrip
8867                                let elem = RawXmlElement::from_reader(reader, &e)?;
8868                                extra_children.push(PositionedNode::new(
8869                                    child_idx,
8870                                    RawXmlNode::Element(elem),
8871                                ));
8872                                child_idx += 1;
8873                            }
8874                            #[cfg(not(feature = "extra-children"))]
8875                            _ => {
8876                                // Skip unknown element
8877                                skip_element(reader)?;
8878                            }
8879                        }
8880                    }
8881                    Event::Empty(e) => {
8882                        match e.local_name().as_ref() {
8883                            b"groupMembers" => {
8884                                f_group_members =
8885                                    Some(Box::new(CTGroupMembers::from_xml(reader, &e, true)?));
8886                                #[cfg(feature = "extra-children")]
8887                                {
8888                                    child_idx += 1;
8889                                }
8890                            }
8891                            #[cfg(feature = "extra-children")]
8892                            _ => {
8893                                // Capture unknown empty element for roundtrip
8894                                let elem = RawXmlElement::from_empty(&e);
8895                                extra_children.push(PositionedNode::new(
8896                                    child_idx,
8897                                    RawXmlNode::Element(elem),
8898                                ));
8899                                child_idx += 1;
8900                            }
8901                            #[cfg(not(feature = "extra-children"))]
8902                            _ => {}
8903                        }
8904                    }
8905                    Event::End(_) => break,
8906                    Event::Eof => break,
8907                    _ => {}
8908                }
8909                buf.clear();
8910            }
8911        }
8912
8913        Ok(Self {
8914            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
8915            unique_name: f_unique_name
8916                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
8917            caption: f_caption
8918                .ok_or_else(|| ParseError::MissingAttribute("caption".to_string()))?,
8919            unique_parent: f_unique_parent,
8920            id: f_id,
8921            group_members: f_group_members
8922                .ok_or_else(|| ParseError::MissingAttribute("groupMembers".to_string()))?,
8923            #[cfg(feature = "extra-attrs")]
8924            extra_attrs,
8925            #[cfg(feature = "extra-children")]
8926            extra_children,
8927        })
8928    }
8929}
8930
8931impl FromXml for CTGroupMembers {
8932    fn from_xml<R: BufRead>(
8933        reader: &mut Reader<R>,
8934        start_tag: &BytesStart,
8935        is_empty: bool,
8936    ) -> Result<Self, ParseError> {
8937        let mut f_count = None;
8938        let mut f_group_member = Vec::new();
8939        #[cfg(feature = "extra-attrs")]
8940        let mut extra_attrs = std::collections::HashMap::new();
8941        #[cfg(feature = "extra-children")]
8942        let mut extra_children = Vec::new();
8943        #[cfg(feature = "extra-children")]
8944        let mut child_idx: usize = 0;
8945
8946        // Parse attributes
8947        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
8948            let val = String::from_utf8_lossy(&attr.value);
8949            match attr.key.local_name().as_ref() {
8950                b"count" => {
8951                    f_count = val.parse().ok();
8952                }
8953                #[cfg(feature = "extra-attrs")]
8954                unknown => {
8955                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
8956                    extra_attrs.insert(key, val.into_owned());
8957                }
8958                #[cfg(not(feature = "extra-attrs"))]
8959                _ => {}
8960            }
8961        }
8962
8963        // Parse child elements
8964        if !is_empty {
8965            let mut buf = Vec::new();
8966            loop {
8967                match reader.read_event_into(&mut buf)? {
8968                    Event::Start(e) => {
8969                        match e.local_name().as_ref() {
8970                            b"groupMember" => {
8971                                f_group_member.push(CTGroupMember::from_xml(reader, &e, false)?);
8972                                #[cfg(feature = "extra-children")]
8973                                {
8974                                    child_idx += 1;
8975                                }
8976                            }
8977                            #[cfg(feature = "extra-children")]
8978                            _ => {
8979                                // Capture unknown element for roundtrip
8980                                let elem = RawXmlElement::from_reader(reader, &e)?;
8981                                extra_children.push(PositionedNode::new(
8982                                    child_idx,
8983                                    RawXmlNode::Element(elem),
8984                                ));
8985                                child_idx += 1;
8986                            }
8987                            #[cfg(not(feature = "extra-children"))]
8988                            _ => {
8989                                // Skip unknown element
8990                                skip_element(reader)?;
8991                            }
8992                        }
8993                    }
8994                    Event::Empty(e) => {
8995                        match e.local_name().as_ref() {
8996                            b"groupMember" => {
8997                                f_group_member.push(CTGroupMember::from_xml(reader, &e, true)?);
8998                                #[cfg(feature = "extra-children")]
8999                                {
9000                                    child_idx += 1;
9001                                }
9002                            }
9003                            #[cfg(feature = "extra-children")]
9004                            _ => {
9005                                // Capture unknown empty element for roundtrip
9006                                let elem = RawXmlElement::from_empty(&e);
9007                                extra_children.push(PositionedNode::new(
9008                                    child_idx,
9009                                    RawXmlNode::Element(elem),
9010                                ));
9011                                child_idx += 1;
9012                            }
9013                            #[cfg(not(feature = "extra-children"))]
9014                            _ => {}
9015                        }
9016                    }
9017                    Event::End(_) => break,
9018                    Event::Eof => break,
9019                    _ => {}
9020                }
9021                buf.clear();
9022            }
9023        }
9024
9025        Ok(Self {
9026            count: f_count,
9027            group_member: f_group_member,
9028            #[cfg(feature = "extra-attrs")]
9029            extra_attrs,
9030            #[cfg(feature = "extra-children")]
9031            extra_children,
9032        })
9033    }
9034}
9035
9036impl FromXml for CTGroupMember {
9037    fn from_xml<R: BufRead>(
9038        reader: &mut Reader<R>,
9039        start_tag: &BytesStart,
9040        is_empty: bool,
9041    ) -> Result<Self, ParseError> {
9042        let mut f_unique_name: Option<XmlString> = None;
9043        let mut f_group = None;
9044        #[cfg(feature = "extra-attrs")]
9045        let mut extra_attrs = std::collections::HashMap::new();
9046
9047        // Parse attributes
9048        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9049            let val = String::from_utf8_lossy(&attr.value);
9050            match attr.key.local_name().as_ref() {
9051                b"uniqueName" => {
9052                    f_unique_name = Some(val.into_owned());
9053                }
9054                b"group" => {
9055                    f_group = Some(val == "true" || val == "1");
9056                }
9057                #[cfg(feature = "extra-attrs")]
9058                unknown => {
9059                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9060                    extra_attrs.insert(key, val.into_owned());
9061                }
9062                #[cfg(not(feature = "extra-attrs"))]
9063                _ => {}
9064            }
9065        }
9066
9067        if !is_empty {
9068            let mut buf = Vec::new();
9069            loop {
9070                match reader.read_event_into(&mut buf)? {
9071                    Event::End(_) => break,
9072                    Event::Eof => break,
9073                    _ => {}
9074                }
9075                buf.clear();
9076            }
9077        }
9078
9079        Ok(Self {
9080            unique_name: f_unique_name
9081                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
9082            group: f_group,
9083            #[cfg(feature = "extra-attrs")]
9084            extra_attrs,
9085        })
9086    }
9087}
9088
9089impl FromXml for CTTupleCache {
9090    fn from_xml<R: BufRead>(
9091        reader: &mut Reader<R>,
9092        start_tag: &BytesStart,
9093        is_empty: bool,
9094    ) -> Result<Self, ParseError> {
9095        let mut f_entries = None;
9096        let mut f_sets = None;
9097        let mut f_query_cache = None;
9098        let mut f_server_formats = None;
9099        let mut f_extension_list = None;
9100        #[cfg(feature = "extra-children")]
9101        let mut extra_children = Vec::new();
9102        #[cfg(feature = "extra-children")]
9103        let mut child_idx: usize = 0;
9104
9105        // Parse child elements
9106        if !is_empty {
9107            let mut buf = Vec::new();
9108            loop {
9109                match reader.read_event_into(&mut buf)? {
9110                    Event::Start(e) => {
9111                        match e.local_name().as_ref() {
9112                            b"entries" => {
9113                                f_entries =
9114                                    Some(Box::new(CTPCDSDTCEntries::from_xml(reader, &e, false)?));
9115                                #[cfg(feature = "extra-children")]
9116                                {
9117                                    child_idx += 1;
9118                                }
9119                            }
9120                            b"sets" => {
9121                                f_sets = Some(Box::new(CTSets::from_xml(reader, &e, false)?));
9122                                #[cfg(feature = "extra-children")]
9123                                {
9124                                    child_idx += 1;
9125                                }
9126                            }
9127                            b"queryCache" => {
9128                                f_query_cache =
9129                                    Some(Box::new(CTQueryCache::from_xml(reader, &e, false)?));
9130                                #[cfg(feature = "extra-children")]
9131                                {
9132                                    child_idx += 1;
9133                                }
9134                            }
9135                            b"serverFormats" => {
9136                                f_server_formats =
9137                                    Some(Box::new(CTServerFormats::from_xml(reader, &e, false)?));
9138                                #[cfg(feature = "extra-children")]
9139                                {
9140                                    child_idx += 1;
9141                                }
9142                            }
9143                            b"extLst" => {
9144                                f_extension_list =
9145                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
9146                                #[cfg(feature = "extra-children")]
9147                                {
9148                                    child_idx += 1;
9149                                }
9150                            }
9151                            #[cfg(feature = "extra-children")]
9152                            _ => {
9153                                // Capture unknown element for roundtrip
9154                                let elem = RawXmlElement::from_reader(reader, &e)?;
9155                                extra_children.push(PositionedNode::new(
9156                                    child_idx,
9157                                    RawXmlNode::Element(elem),
9158                                ));
9159                                child_idx += 1;
9160                            }
9161                            #[cfg(not(feature = "extra-children"))]
9162                            _ => {
9163                                // Skip unknown element
9164                                skip_element(reader)?;
9165                            }
9166                        }
9167                    }
9168                    Event::Empty(e) => {
9169                        match e.local_name().as_ref() {
9170                            b"entries" => {
9171                                f_entries =
9172                                    Some(Box::new(CTPCDSDTCEntries::from_xml(reader, &e, true)?));
9173                                #[cfg(feature = "extra-children")]
9174                                {
9175                                    child_idx += 1;
9176                                }
9177                            }
9178                            b"sets" => {
9179                                f_sets = Some(Box::new(CTSets::from_xml(reader, &e, true)?));
9180                                #[cfg(feature = "extra-children")]
9181                                {
9182                                    child_idx += 1;
9183                                }
9184                            }
9185                            b"queryCache" => {
9186                                f_query_cache =
9187                                    Some(Box::new(CTQueryCache::from_xml(reader, &e, true)?));
9188                                #[cfg(feature = "extra-children")]
9189                                {
9190                                    child_idx += 1;
9191                                }
9192                            }
9193                            b"serverFormats" => {
9194                                f_server_formats =
9195                                    Some(Box::new(CTServerFormats::from_xml(reader, &e, true)?));
9196                                #[cfg(feature = "extra-children")]
9197                                {
9198                                    child_idx += 1;
9199                                }
9200                            }
9201                            b"extLst" => {
9202                                f_extension_list =
9203                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
9204                                #[cfg(feature = "extra-children")]
9205                                {
9206                                    child_idx += 1;
9207                                }
9208                            }
9209                            #[cfg(feature = "extra-children")]
9210                            _ => {
9211                                // Capture unknown empty element for roundtrip
9212                                let elem = RawXmlElement::from_empty(&e);
9213                                extra_children.push(PositionedNode::new(
9214                                    child_idx,
9215                                    RawXmlNode::Element(elem),
9216                                ));
9217                                child_idx += 1;
9218                            }
9219                            #[cfg(not(feature = "extra-children"))]
9220                            _ => {}
9221                        }
9222                    }
9223                    Event::End(_) => break,
9224                    Event::Eof => break,
9225                    _ => {}
9226                }
9227                buf.clear();
9228            }
9229        }
9230
9231        Ok(Self {
9232            entries: f_entries,
9233            sets: f_sets,
9234            query_cache: f_query_cache,
9235            server_formats: f_server_formats,
9236            extension_list: f_extension_list,
9237            #[cfg(feature = "extra-children")]
9238            extra_children,
9239        })
9240    }
9241}
9242
9243impl FromXml for CTServerFormat {
9244    fn from_xml<R: BufRead>(
9245        reader: &mut Reader<R>,
9246        start_tag: &BytesStart,
9247        is_empty: bool,
9248    ) -> Result<Self, ParseError> {
9249        let mut f_culture = None;
9250        let mut f_format = None;
9251        #[cfg(feature = "extra-attrs")]
9252        let mut extra_attrs = std::collections::HashMap::new();
9253
9254        // Parse attributes
9255        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9256            let val = String::from_utf8_lossy(&attr.value);
9257            match attr.key.local_name().as_ref() {
9258                b"culture" => {
9259                    f_culture = Some(val.into_owned());
9260                }
9261                b"format" => {
9262                    f_format = Some(val.into_owned());
9263                }
9264                #[cfg(feature = "extra-attrs")]
9265                unknown => {
9266                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9267                    extra_attrs.insert(key, val.into_owned());
9268                }
9269                #[cfg(not(feature = "extra-attrs"))]
9270                _ => {}
9271            }
9272        }
9273
9274        if !is_empty {
9275            let mut buf = Vec::new();
9276            loop {
9277                match reader.read_event_into(&mut buf)? {
9278                    Event::End(_) => break,
9279                    Event::Eof => break,
9280                    _ => {}
9281                }
9282                buf.clear();
9283            }
9284        }
9285
9286        Ok(Self {
9287            culture: f_culture,
9288            format: f_format,
9289            #[cfg(feature = "extra-attrs")]
9290            extra_attrs,
9291        })
9292    }
9293}
9294
9295impl FromXml for CTServerFormats {
9296    fn from_xml<R: BufRead>(
9297        reader: &mut Reader<R>,
9298        start_tag: &BytesStart,
9299        is_empty: bool,
9300    ) -> Result<Self, ParseError> {
9301        let mut f_count = None;
9302        let mut f_server_format = Vec::new();
9303        #[cfg(feature = "extra-attrs")]
9304        let mut extra_attrs = std::collections::HashMap::new();
9305        #[cfg(feature = "extra-children")]
9306        let mut extra_children = Vec::new();
9307        #[cfg(feature = "extra-children")]
9308        let mut child_idx: usize = 0;
9309
9310        // Parse attributes
9311        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9312            let val = String::from_utf8_lossy(&attr.value);
9313            match attr.key.local_name().as_ref() {
9314                b"count" => {
9315                    f_count = val.parse().ok();
9316                }
9317                #[cfg(feature = "extra-attrs")]
9318                unknown => {
9319                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9320                    extra_attrs.insert(key, val.into_owned());
9321                }
9322                #[cfg(not(feature = "extra-attrs"))]
9323                _ => {}
9324            }
9325        }
9326
9327        // Parse child elements
9328        if !is_empty {
9329            let mut buf = Vec::new();
9330            loop {
9331                match reader.read_event_into(&mut buf)? {
9332                    Event::Start(e) => {
9333                        match e.local_name().as_ref() {
9334                            b"serverFormat" => {
9335                                f_server_format.push(CTServerFormat::from_xml(reader, &e, false)?);
9336                                #[cfg(feature = "extra-children")]
9337                                {
9338                                    child_idx += 1;
9339                                }
9340                            }
9341                            #[cfg(feature = "extra-children")]
9342                            _ => {
9343                                // Capture unknown element for roundtrip
9344                                let elem = RawXmlElement::from_reader(reader, &e)?;
9345                                extra_children.push(PositionedNode::new(
9346                                    child_idx,
9347                                    RawXmlNode::Element(elem),
9348                                ));
9349                                child_idx += 1;
9350                            }
9351                            #[cfg(not(feature = "extra-children"))]
9352                            _ => {
9353                                // Skip unknown element
9354                                skip_element(reader)?;
9355                            }
9356                        }
9357                    }
9358                    Event::Empty(e) => {
9359                        match e.local_name().as_ref() {
9360                            b"serverFormat" => {
9361                                f_server_format.push(CTServerFormat::from_xml(reader, &e, true)?);
9362                                #[cfg(feature = "extra-children")]
9363                                {
9364                                    child_idx += 1;
9365                                }
9366                            }
9367                            #[cfg(feature = "extra-children")]
9368                            _ => {
9369                                // Capture unknown empty element for roundtrip
9370                                let elem = RawXmlElement::from_empty(&e);
9371                                extra_children.push(PositionedNode::new(
9372                                    child_idx,
9373                                    RawXmlNode::Element(elem),
9374                                ));
9375                                child_idx += 1;
9376                            }
9377                            #[cfg(not(feature = "extra-children"))]
9378                            _ => {}
9379                        }
9380                    }
9381                    Event::End(_) => break,
9382                    Event::Eof => break,
9383                    _ => {}
9384                }
9385                buf.clear();
9386            }
9387        }
9388
9389        Ok(Self {
9390            count: f_count,
9391            server_format: f_server_format,
9392            #[cfg(feature = "extra-attrs")]
9393            extra_attrs,
9394            #[cfg(feature = "extra-children")]
9395            extra_children,
9396        })
9397    }
9398}
9399
9400impl FromXml for CTPCDSDTCEntries {
9401    fn from_xml<R: BufRead>(
9402        reader: &mut Reader<R>,
9403        start_tag: &BytesStart,
9404        is_empty: bool,
9405    ) -> Result<Self, ParseError> {
9406        let mut f_count = None;
9407        let mut f_m = Vec::new();
9408        let mut f_n = Vec::new();
9409        let mut f_e = Vec::new();
9410        let mut f_style_index = Vec::new();
9411        #[cfg(feature = "extra-attrs")]
9412        let mut extra_attrs = std::collections::HashMap::new();
9413        #[cfg(feature = "extra-children")]
9414        let mut extra_children = Vec::new();
9415        #[cfg(feature = "extra-children")]
9416        let mut child_idx: usize = 0;
9417
9418        // Parse attributes
9419        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9420            let val = String::from_utf8_lossy(&attr.value);
9421            match attr.key.local_name().as_ref() {
9422                b"count" => {
9423                    f_count = val.parse().ok();
9424                }
9425                #[cfg(feature = "extra-attrs")]
9426                unknown => {
9427                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9428                    extra_attrs.insert(key, val.into_owned());
9429                }
9430                #[cfg(not(feature = "extra-attrs"))]
9431                _ => {}
9432            }
9433        }
9434
9435        // Parse child elements
9436        if !is_empty {
9437            let mut buf = Vec::new();
9438            loop {
9439                match reader.read_event_into(&mut buf)? {
9440                    Event::Start(e) => {
9441                        match e.local_name().as_ref() {
9442                            b"m" => {
9443                                f_m.push(CTMissing::from_xml(reader, &e, false)?);
9444                                #[cfg(feature = "extra-children")]
9445                                {
9446                                    child_idx += 1;
9447                                }
9448                            }
9449                            b"n" => {
9450                                f_n.push(CTNumber::from_xml(reader, &e, false)?);
9451                                #[cfg(feature = "extra-children")]
9452                                {
9453                                    child_idx += 1;
9454                                }
9455                            }
9456                            b"e" => {
9457                                f_e.push(CTError::from_xml(reader, &e, false)?);
9458                                #[cfg(feature = "extra-children")]
9459                                {
9460                                    child_idx += 1;
9461                                }
9462                            }
9463                            b"s" => {
9464                                f_style_index.push(CTString::from_xml(reader, &e, false)?);
9465                                #[cfg(feature = "extra-children")]
9466                                {
9467                                    child_idx += 1;
9468                                }
9469                            }
9470                            #[cfg(feature = "extra-children")]
9471                            _ => {
9472                                // Capture unknown element for roundtrip
9473                                let elem = RawXmlElement::from_reader(reader, &e)?;
9474                                extra_children.push(PositionedNode::new(
9475                                    child_idx,
9476                                    RawXmlNode::Element(elem),
9477                                ));
9478                                child_idx += 1;
9479                            }
9480                            #[cfg(not(feature = "extra-children"))]
9481                            _ => {
9482                                // Skip unknown element
9483                                skip_element(reader)?;
9484                            }
9485                        }
9486                    }
9487                    Event::Empty(e) => {
9488                        match e.local_name().as_ref() {
9489                            b"m" => {
9490                                f_m.push(CTMissing::from_xml(reader, &e, true)?);
9491                                #[cfg(feature = "extra-children")]
9492                                {
9493                                    child_idx += 1;
9494                                }
9495                            }
9496                            b"n" => {
9497                                f_n.push(CTNumber::from_xml(reader, &e, true)?);
9498                                #[cfg(feature = "extra-children")]
9499                                {
9500                                    child_idx += 1;
9501                                }
9502                            }
9503                            b"e" => {
9504                                f_e.push(CTError::from_xml(reader, &e, true)?);
9505                                #[cfg(feature = "extra-children")]
9506                                {
9507                                    child_idx += 1;
9508                                }
9509                            }
9510                            b"s" => {
9511                                f_style_index.push(CTString::from_xml(reader, &e, true)?);
9512                                #[cfg(feature = "extra-children")]
9513                                {
9514                                    child_idx += 1;
9515                                }
9516                            }
9517                            #[cfg(feature = "extra-children")]
9518                            _ => {
9519                                // Capture unknown empty element for roundtrip
9520                                let elem = RawXmlElement::from_empty(&e);
9521                                extra_children.push(PositionedNode::new(
9522                                    child_idx,
9523                                    RawXmlNode::Element(elem),
9524                                ));
9525                                child_idx += 1;
9526                            }
9527                            #[cfg(not(feature = "extra-children"))]
9528                            _ => {}
9529                        }
9530                    }
9531                    Event::End(_) => break,
9532                    Event::Eof => break,
9533                    _ => {}
9534                }
9535                buf.clear();
9536            }
9537        }
9538
9539        Ok(Self {
9540            count: f_count,
9541            m: f_m,
9542            n: f_n,
9543            e: f_e,
9544            style_index: f_style_index,
9545            #[cfg(feature = "extra-attrs")]
9546            extra_attrs,
9547            #[cfg(feature = "extra-children")]
9548            extra_children,
9549        })
9550    }
9551}
9552
9553impl FromXml for CTTuples {
9554    fn from_xml<R: BufRead>(
9555        reader: &mut Reader<R>,
9556        start_tag: &BytesStart,
9557        is_empty: bool,
9558    ) -> Result<Self, ParseError> {
9559        let mut f_cells = None;
9560        let mut f_tpl = Vec::new();
9561        #[cfg(feature = "extra-attrs")]
9562        let mut extra_attrs = std::collections::HashMap::new();
9563        #[cfg(feature = "extra-children")]
9564        let mut extra_children = Vec::new();
9565        #[cfg(feature = "extra-children")]
9566        let mut child_idx: usize = 0;
9567
9568        // Parse attributes
9569        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9570            let val = String::from_utf8_lossy(&attr.value);
9571            match attr.key.local_name().as_ref() {
9572                b"c" => {
9573                    f_cells = val.parse().ok();
9574                }
9575                #[cfg(feature = "extra-attrs")]
9576                unknown => {
9577                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9578                    extra_attrs.insert(key, val.into_owned());
9579                }
9580                #[cfg(not(feature = "extra-attrs"))]
9581                _ => {}
9582            }
9583        }
9584
9585        // Parse child elements
9586        if !is_empty {
9587            let mut buf = Vec::new();
9588            loop {
9589                match reader.read_event_into(&mut buf)? {
9590                    Event::Start(e) => {
9591                        match e.local_name().as_ref() {
9592                            b"tpl" => {
9593                                f_tpl.push(CTTuple::from_xml(reader, &e, false)?);
9594                                #[cfg(feature = "extra-children")]
9595                                {
9596                                    child_idx += 1;
9597                                }
9598                            }
9599                            #[cfg(feature = "extra-children")]
9600                            _ => {
9601                                // Capture unknown element for roundtrip
9602                                let elem = RawXmlElement::from_reader(reader, &e)?;
9603                                extra_children.push(PositionedNode::new(
9604                                    child_idx,
9605                                    RawXmlNode::Element(elem),
9606                                ));
9607                                child_idx += 1;
9608                            }
9609                            #[cfg(not(feature = "extra-children"))]
9610                            _ => {
9611                                // Skip unknown element
9612                                skip_element(reader)?;
9613                            }
9614                        }
9615                    }
9616                    Event::Empty(e) => {
9617                        match e.local_name().as_ref() {
9618                            b"tpl" => {
9619                                f_tpl.push(CTTuple::from_xml(reader, &e, true)?);
9620                                #[cfg(feature = "extra-children")]
9621                                {
9622                                    child_idx += 1;
9623                                }
9624                            }
9625                            #[cfg(feature = "extra-children")]
9626                            _ => {
9627                                // Capture unknown empty element for roundtrip
9628                                let elem = RawXmlElement::from_empty(&e);
9629                                extra_children.push(PositionedNode::new(
9630                                    child_idx,
9631                                    RawXmlNode::Element(elem),
9632                                ));
9633                                child_idx += 1;
9634                            }
9635                            #[cfg(not(feature = "extra-children"))]
9636                            _ => {}
9637                        }
9638                    }
9639                    Event::End(_) => break,
9640                    Event::Eof => break,
9641                    _ => {}
9642                }
9643                buf.clear();
9644            }
9645        }
9646
9647        Ok(Self {
9648            cells: f_cells,
9649            tpl: f_tpl,
9650            #[cfg(feature = "extra-attrs")]
9651            extra_attrs,
9652            #[cfg(feature = "extra-children")]
9653            extra_children,
9654        })
9655    }
9656}
9657
9658impl FromXml for CTTuple {
9659    fn from_xml<R: BufRead>(
9660        reader: &mut Reader<R>,
9661        start_tag: &BytesStart,
9662        is_empty: bool,
9663    ) -> Result<Self, ParseError> {
9664        let mut f_fld = None;
9665        let mut f_hier = None;
9666        let mut f_item: Option<u32> = None;
9667        #[cfg(feature = "extra-attrs")]
9668        let mut extra_attrs = std::collections::HashMap::new();
9669
9670        // Parse attributes
9671        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9672            let val = String::from_utf8_lossy(&attr.value);
9673            match attr.key.local_name().as_ref() {
9674                b"fld" => {
9675                    f_fld = val.parse().ok();
9676                }
9677                b"hier" => {
9678                    f_hier = val.parse().ok();
9679                }
9680                b"item" => {
9681                    f_item = val.parse().ok();
9682                }
9683                #[cfg(feature = "extra-attrs")]
9684                unknown => {
9685                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9686                    extra_attrs.insert(key, val.into_owned());
9687                }
9688                #[cfg(not(feature = "extra-attrs"))]
9689                _ => {}
9690            }
9691        }
9692
9693        if !is_empty {
9694            let mut buf = Vec::new();
9695            loop {
9696                match reader.read_event_into(&mut buf)? {
9697                    Event::End(_) => break,
9698                    Event::Eof => break,
9699                    _ => {}
9700                }
9701                buf.clear();
9702            }
9703        }
9704
9705        Ok(Self {
9706            fld: f_fld,
9707            hier: f_hier,
9708            item: f_item.ok_or_else(|| ParseError::MissingAttribute("item".to_string()))?,
9709            #[cfg(feature = "extra-attrs")]
9710            extra_attrs,
9711        })
9712    }
9713}
9714
9715impl FromXml for CTSets {
9716    fn from_xml<R: BufRead>(
9717        reader: &mut Reader<R>,
9718        start_tag: &BytesStart,
9719        is_empty: bool,
9720    ) -> Result<Self, ParseError> {
9721        let mut f_count = None;
9722        let mut f_set = Vec::new();
9723        #[cfg(feature = "extra-attrs")]
9724        let mut extra_attrs = std::collections::HashMap::new();
9725        #[cfg(feature = "extra-children")]
9726        let mut extra_children = Vec::new();
9727        #[cfg(feature = "extra-children")]
9728        let mut child_idx: usize = 0;
9729
9730        // Parse attributes
9731        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9732            let val = String::from_utf8_lossy(&attr.value);
9733            match attr.key.local_name().as_ref() {
9734                b"count" => {
9735                    f_count = val.parse().ok();
9736                }
9737                #[cfg(feature = "extra-attrs")]
9738                unknown => {
9739                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9740                    extra_attrs.insert(key, val.into_owned());
9741                }
9742                #[cfg(not(feature = "extra-attrs"))]
9743                _ => {}
9744            }
9745        }
9746
9747        // Parse child elements
9748        if !is_empty {
9749            let mut buf = Vec::new();
9750            loop {
9751                match reader.read_event_into(&mut buf)? {
9752                    Event::Start(e) => {
9753                        match e.local_name().as_ref() {
9754                            b"set" => {
9755                                f_set.push(CTSet::from_xml(reader, &e, false)?);
9756                                #[cfg(feature = "extra-children")]
9757                                {
9758                                    child_idx += 1;
9759                                }
9760                            }
9761                            #[cfg(feature = "extra-children")]
9762                            _ => {
9763                                // Capture unknown element for roundtrip
9764                                let elem = RawXmlElement::from_reader(reader, &e)?;
9765                                extra_children.push(PositionedNode::new(
9766                                    child_idx,
9767                                    RawXmlNode::Element(elem),
9768                                ));
9769                                child_idx += 1;
9770                            }
9771                            #[cfg(not(feature = "extra-children"))]
9772                            _ => {
9773                                // Skip unknown element
9774                                skip_element(reader)?;
9775                            }
9776                        }
9777                    }
9778                    Event::Empty(e) => {
9779                        match e.local_name().as_ref() {
9780                            b"set" => {
9781                                f_set.push(CTSet::from_xml(reader, &e, true)?);
9782                                #[cfg(feature = "extra-children")]
9783                                {
9784                                    child_idx += 1;
9785                                }
9786                            }
9787                            #[cfg(feature = "extra-children")]
9788                            _ => {
9789                                // Capture unknown empty element for roundtrip
9790                                let elem = RawXmlElement::from_empty(&e);
9791                                extra_children.push(PositionedNode::new(
9792                                    child_idx,
9793                                    RawXmlNode::Element(elem),
9794                                ));
9795                                child_idx += 1;
9796                            }
9797                            #[cfg(not(feature = "extra-children"))]
9798                            _ => {}
9799                        }
9800                    }
9801                    Event::End(_) => break,
9802                    Event::Eof => break,
9803                    _ => {}
9804                }
9805                buf.clear();
9806            }
9807        }
9808
9809        Ok(Self {
9810            count: f_count,
9811            set: f_set,
9812            #[cfg(feature = "extra-attrs")]
9813            extra_attrs,
9814            #[cfg(feature = "extra-children")]
9815            extra_children,
9816        })
9817    }
9818}
9819
9820impl FromXml for CTSet {
9821    fn from_xml<R: BufRead>(
9822        reader: &mut Reader<R>,
9823        start_tag: &BytesStart,
9824        is_empty: bool,
9825    ) -> Result<Self, ParseError> {
9826        let mut f_count = None;
9827        let mut f_max_rank: Option<i32> = None;
9828        let mut f_set_definition: Option<XmlString> = None;
9829        let mut f_sort_type = None;
9830        let mut f_query_failed = None;
9831        let mut f_tpls = Vec::new();
9832        let mut f_sort_by_tuple = None;
9833        #[cfg(feature = "extra-attrs")]
9834        let mut extra_attrs = std::collections::HashMap::new();
9835        #[cfg(feature = "extra-children")]
9836        let mut extra_children = Vec::new();
9837        #[cfg(feature = "extra-children")]
9838        let mut child_idx: usize = 0;
9839
9840        // Parse attributes
9841        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9842            let val = String::from_utf8_lossy(&attr.value);
9843            match attr.key.local_name().as_ref() {
9844                b"count" => {
9845                    f_count = val.parse().ok();
9846                }
9847                b"maxRank" => {
9848                    f_max_rank = val.parse().ok();
9849                }
9850                b"setDefinition" => {
9851                    f_set_definition = Some(val.into_owned());
9852                }
9853                b"sortType" => {
9854                    f_sort_type = val.parse().ok();
9855                }
9856                b"queryFailed" => {
9857                    f_query_failed = Some(val == "true" || val == "1");
9858                }
9859                #[cfg(feature = "extra-attrs")]
9860                unknown => {
9861                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9862                    extra_attrs.insert(key, val.into_owned());
9863                }
9864                #[cfg(not(feature = "extra-attrs"))]
9865                _ => {}
9866            }
9867        }
9868
9869        // Parse child elements
9870        if !is_empty {
9871            let mut buf = Vec::new();
9872            loop {
9873                match reader.read_event_into(&mut buf)? {
9874                    Event::Start(e) => {
9875                        match e.local_name().as_ref() {
9876                            b"tpls" => {
9877                                f_tpls.push(CTTuples::from_xml(reader, &e, false)?);
9878                                #[cfg(feature = "extra-children")]
9879                                {
9880                                    child_idx += 1;
9881                                }
9882                            }
9883                            b"sortByTuple" => {
9884                                f_sort_by_tuple =
9885                                    Some(Box::new(CTTuples::from_xml(reader, &e, false)?));
9886                                #[cfg(feature = "extra-children")]
9887                                {
9888                                    child_idx += 1;
9889                                }
9890                            }
9891                            #[cfg(feature = "extra-children")]
9892                            _ => {
9893                                // Capture unknown element for roundtrip
9894                                let elem = RawXmlElement::from_reader(reader, &e)?;
9895                                extra_children.push(PositionedNode::new(
9896                                    child_idx,
9897                                    RawXmlNode::Element(elem),
9898                                ));
9899                                child_idx += 1;
9900                            }
9901                            #[cfg(not(feature = "extra-children"))]
9902                            _ => {
9903                                // Skip unknown element
9904                                skip_element(reader)?;
9905                            }
9906                        }
9907                    }
9908                    Event::Empty(e) => {
9909                        match e.local_name().as_ref() {
9910                            b"tpls" => {
9911                                f_tpls.push(CTTuples::from_xml(reader, &e, true)?);
9912                                #[cfg(feature = "extra-children")]
9913                                {
9914                                    child_idx += 1;
9915                                }
9916                            }
9917                            b"sortByTuple" => {
9918                                f_sort_by_tuple =
9919                                    Some(Box::new(CTTuples::from_xml(reader, &e, true)?));
9920                                #[cfg(feature = "extra-children")]
9921                                {
9922                                    child_idx += 1;
9923                                }
9924                            }
9925                            #[cfg(feature = "extra-children")]
9926                            _ => {
9927                                // Capture unknown empty element for roundtrip
9928                                let elem = RawXmlElement::from_empty(&e);
9929                                extra_children.push(PositionedNode::new(
9930                                    child_idx,
9931                                    RawXmlNode::Element(elem),
9932                                ));
9933                                child_idx += 1;
9934                            }
9935                            #[cfg(not(feature = "extra-children"))]
9936                            _ => {}
9937                        }
9938                    }
9939                    Event::End(_) => break,
9940                    Event::Eof => break,
9941                    _ => {}
9942                }
9943                buf.clear();
9944            }
9945        }
9946
9947        Ok(Self {
9948            count: f_count,
9949            max_rank: f_max_rank
9950                .ok_or_else(|| ParseError::MissingAttribute("maxRank".to_string()))?,
9951            set_definition: f_set_definition
9952                .ok_or_else(|| ParseError::MissingAttribute("setDefinition".to_string()))?,
9953            sort_type: f_sort_type,
9954            query_failed: f_query_failed,
9955            tpls: f_tpls,
9956            sort_by_tuple: f_sort_by_tuple,
9957            #[cfg(feature = "extra-attrs")]
9958            extra_attrs,
9959            #[cfg(feature = "extra-children")]
9960            extra_children,
9961        })
9962    }
9963}
9964
9965impl FromXml for CTQueryCache {
9966    fn from_xml<R: BufRead>(
9967        reader: &mut Reader<R>,
9968        start_tag: &BytesStart,
9969        is_empty: bool,
9970    ) -> Result<Self, ParseError> {
9971        let mut f_count = None;
9972        let mut f_query = Vec::new();
9973        #[cfg(feature = "extra-attrs")]
9974        let mut extra_attrs = std::collections::HashMap::new();
9975        #[cfg(feature = "extra-children")]
9976        let mut extra_children = Vec::new();
9977        #[cfg(feature = "extra-children")]
9978        let mut child_idx: usize = 0;
9979
9980        // Parse attributes
9981        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
9982            let val = String::from_utf8_lossy(&attr.value);
9983            match attr.key.local_name().as_ref() {
9984                b"count" => {
9985                    f_count = val.parse().ok();
9986                }
9987                #[cfg(feature = "extra-attrs")]
9988                unknown => {
9989                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
9990                    extra_attrs.insert(key, val.into_owned());
9991                }
9992                #[cfg(not(feature = "extra-attrs"))]
9993                _ => {}
9994            }
9995        }
9996
9997        // Parse child elements
9998        if !is_empty {
9999            let mut buf = Vec::new();
10000            loop {
10001                match reader.read_event_into(&mut buf)? {
10002                    Event::Start(e) => {
10003                        match e.local_name().as_ref() {
10004                            b"query" => {
10005                                f_query.push(CTQuery::from_xml(reader, &e, false)?);
10006                                #[cfg(feature = "extra-children")]
10007                                {
10008                                    child_idx += 1;
10009                                }
10010                            }
10011                            #[cfg(feature = "extra-children")]
10012                            _ => {
10013                                // Capture unknown element for roundtrip
10014                                let elem = RawXmlElement::from_reader(reader, &e)?;
10015                                extra_children.push(PositionedNode::new(
10016                                    child_idx,
10017                                    RawXmlNode::Element(elem),
10018                                ));
10019                                child_idx += 1;
10020                            }
10021                            #[cfg(not(feature = "extra-children"))]
10022                            _ => {
10023                                // Skip unknown element
10024                                skip_element(reader)?;
10025                            }
10026                        }
10027                    }
10028                    Event::Empty(e) => {
10029                        match e.local_name().as_ref() {
10030                            b"query" => {
10031                                f_query.push(CTQuery::from_xml(reader, &e, true)?);
10032                                #[cfg(feature = "extra-children")]
10033                                {
10034                                    child_idx += 1;
10035                                }
10036                            }
10037                            #[cfg(feature = "extra-children")]
10038                            _ => {
10039                                // Capture unknown empty element for roundtrip
10040                                let elem = RawXmlElement::from_empty(&e);
10041                                extra_children.push(PositionedNode::new(
10042                                    child_idx,
10043                                    RawXmlNode::Element(elem),
10044                                ));
10045                                child_idx += 1;
10046                            }
10047                            #[cfg(not(feature = "extra-children"))]
10048                            _ => {}
10049                        }
10050                    }
10051                    Event::End(_) => break,
10052                    Event::Eof => break,
10053                    _ => {}
10054                }
10055                buf.clear();
10056            }
10057        }
10058
10059        Ok(Self {
10060            count: f_count,
10061            query: f_query,
10062            #[cfg(feature = "extra-attrs")]
10063            extra_attrs,
10064            #[cfg(feature = "extra-children")]
10065            extra_children,
10066        })
10067    }
10068}
10069
10070impl FromXml for CTQuery {
10071    fn from_xml<R: BufRead>(
10072        reader: &mut Reader<R>,
10073        start_tag: &BytesStart,
10074        is_empty: bool,
10075    ) -> Result<Self, ParseError> {
10076        let mut f_mdx: Option<XmlString> = None;
10077        let mut f_tpls = None;
10078        #[cfg(feature = "extra-attrs")]
10079        let mut extra_attrs = std::collections::HashMap::new();
10080        #[cfg(feature = "extra-children")]
10081        let mut extra_children = Vec::new();
10082        #[cfg(feature = "extra-children")]
10083        let mut child_idx: usize = 0;
10084
10085        // Parse attributes
10086        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10087            let val = String::from_utf8_lossy(&attr.value);
10088            match attr.key.local_name().as_ref() {
10089                b"mdx" => {
10090                    f_mdx = Some(val.into_owned());
10091                }
10092                #[cfg(feature = "extra-attrs")]
10093                unknown => {
10094                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10095                    extra_attrs.insert(key, val.into_owned());
10096                }
10097                #[cfg(not(feature = "extra-attrs"))]
10098                _ => {}
10099            }
10100        }
10101
10102        // Parse child elements
10103        if !is_empty {
10104            let mut buf = Vec::new();
10105            loop {
10106                match reader.read_event_into(&mut buf)? {
10107                    Event::Start(e) => {
10108                        match e.local_name().as_ref() {
10109                            b"tpls" => {
10110                                f_tpls = Some(Box::new(CTTuples::from_xml(reader, &e, false)?));
10111                                #[cfg(feature = "extra-children")]
10112                                {
10113                                    child_idx += 1;
10114                                }
10115                            }
10116                            #[cfg(feature = "extra-children")]
10117                            _ => {
10118                                // Capture unknown element for roundtrip
10119                                let elem = RawXmlElement::from_reader(reader, &e)?;
10120                                extra_children.push(PositionedNode::new(
10121                                    child_idx,
10122                                    RawXmlNode::Element(elem),
10123                                ));
10124                                child_idx += 1;
10125                            }
10126                            #[cfg(not(feature = "extra-children"))]
10127                            _ => {
10128                                // Skip unknown element
10129                                skip_element(reader)?;
10130                            }
10131                        }
10132                    }
10133                    Event::Empty(e) => {
10134                        match e.local_name().as_ref() {
10135                            b"tpls" => {
10136                                f_tpls = Some(Box::new(CTTuples::from_xml(reader, &e, true)?));
10137                                #[cfg(feature = "extra-children")]
10138                                {
10139                                    child_idx += 1;
10140                                }
10141                            }
10142                            #[cfg(feature = "extra-children")]
10143                            _ => {
10144                                // Capture unknown empty element for roundtrip
10145                                let elem = RawXmlElement::from_empty(&e);
10146                                extra_children.push(PositionedNode::new(
10147                                    child_idx,
10148                                    RawXmlNode::Element(elem),
10149                                ));
10150                                child_idx += 1;
10151                            }
10152                            #[cfg(not(feature = "extra-children"))]
10153                            _ => {}
10154                        }
10155                    }
10156                    Event::End(_) => break,
10157                    Event::Eof => break,
10158                    _ => {}
10159                }
10160                buf.clear();
10161            }
10162        }
10163
10164        Ok(Self {
10165            mdx: f_mdx.ok_or_else(|| ParseError::MissingAttribute("mdx".to_string()))?,
10166            tpls: f_tpls,
10167            #[cfg(feature = "extra-attrs")]
10168            extra_attrs,
10169            #[cfg(feature = "extra-children")]
10170            extra_children,
10171        })
10172    }
10173}
10174
10175impl FromXml for CTCalculatedItems {
10176    fn from_xml<R: BufRead>(
10177        reader: &mut Reader<R>,
10178        start_tag: &BytesStart,
10179        is_empty: bool,
10180    ) -> Result<Self, ParseError> {
10181        let mut f_count = None;
10182        let mut f_calculated_item = Vec::new();
10183        #[cfg(feature = "extra-attrs")]
10184        let mut extra_attrs = std::collections::HashMap::new();
10185        #[cfg(feature = "extra-children")]
10186        let mut extra_children = Vec::new();
10187        #[cfg(feature = "extra-children")]
10188        let mut child_idx: usize = 0;
10189
10190        // Parse attributes
10191        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10192            let val = String::from_utf8_lossy(&attr.value);
10193            match attr.key.local_name().as_ref() {
10194                b"count" => {
10195                    f_count = val.parse().ok();
10196                }
10197                #[cfg(feature = "extra-attrs")]
10198                unknown => {
10199                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10200                    extra_attrs.insert(key, val.into_owned());
10201                }
10202                #[cfg(not(feature = "extra-attrs"))]
10203                _ => {}
10204            }
10205        }
10206
10207        // Parse child elements
10208        if !is_empty {
10209            let mut buf = Vec::new();
10210            loop {
10211                match reader.read_event_into(&mut buf)? {
10212                    Event::Start(e) => {
10213                        match e.local_name().as_ref() {
10214                            b"calculatedItem" => {
10215                                f_calculated_item
10216                                    .push(CTCalculatedItem::from_xml(reader, &e, false)?);
10217                                #[cfg(feature = "extra-children")]
10218                                {
10219                                    child_idx += 1;
10220                                }
10221                            }
10222                            #[cfg(feature = "extra-children")]
10223                            _ => {
10224                                // Capture unknown element for roundtrip
10225                                let elem = RawXmlElement::from_reader(reader, &e)?;
10226                                extra_children.push(PositionedNode::new(
10227                                    child_idx,
10228                                    RawXmlNode::Element(elem),
10229                                ));
10230                                child_idx += 1;
10231                            }
10232                            #[cfg(not(feature = "extra-children"))]
10233                            _ => {
10234                                // Skip unknown element
10235                                skip_element(reader)?;
10236                            }
10237                        }
10238                    }
10239                    Event::Empty(e) => {
10240                        match e.local_name().as_ref() {
10241                            b"calculatedItem" => {
10242                                f_calculated_item
10243                                    .push(CTCalculatedItem::from_xml(reader, &e, true)?);
10244                                #[cfg(feature = "extra-children")]
10245                                {
10246                                    child_idx += 1;
10247                                }
10248                            }
10249                            #[cfg(feature = "extra-children")]
10250                            _ => {
10251                                // Capture unknown empty element for roundtrip
10252                                let elem = RawXmlElement::from_empty(&e);
10253                                extra_children.push(PositionedNode::new(
10254                                    child_idx,
10255                                    RawXmlNode::Element(elem),
10256                                ));
10257                                child_idx += 1;
10258                            }
10259                            #[cfg(not(feature = "extra-children"))]
10260                            _ => {}
10261                        }
10262                    }
10263                    Event::End(_) => break,
10264                    Event::Eof => break,
10265                    _ => {}
10266                }
10267                buf.clear();
10268            }
10269        }
10270
10271        Ok(Self {
10272            count: f_count,
10273            calculated_item: f_calculated_item,
10274            #[cfg(feature = "extra-attrs")]
10275            extra_attrs,
10276            #[cfg(feature = "extra-children")]
10277            extra_children,
10278        })
10279    }
10280}
10281
10282impl FromXml for CTCalculatedItem {
10283    fn from_xml<R: BufRead>(
10284        reader: &mut Reader<R>,
10285        start_tag: &BytesStart,
10286        is_empty: bool,
10287    ) -> Result<Self, ParseError> {
10288        let mut f_field = None;
10289        let mut f_formula = None;
10290        let mut f_pivot_area: Option<Box<PivotArea>> = None;
10291        let mut f_extension_list = None;
10292        #[cfg(feature = "extra-attrs")]
10293        let mut extra_attrs = std::collections::HashMap::new();
10294        #[cfg(feature = "extra-children")]
10295        let mut extra_children = Vec::new();
10296        #[cfg(feature = "extra-children")]
10297        let mut child_idx: usize = 0;
10298
10299        // Parse attributes
10300        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10301            let val = String::from_utf8_lossy(&attr.value);
10302            match attr.key.local_name().as_ref() {
10303                b"field" => {
10304                    f_field = val.parse().ok();
10305                }
10306                b"formula" => {
10307                    f_formula = Some(val.into_owned());
10308                }
10309                #[cfg(feature = "extra-attrs")]
10310                unknown => {
10311                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10312                    extra_attrs.insert(key, val.into_owned());
10313                }
10314                #[cfg(not(feature = "extra-attrs"))]
10315                _ => {}
10316            }
10317        }
10318
10319        // Parse child elements
10320        if !is_empty {
10321            let mut buf = Vec::new();
10322            loop {
10323                match reader.read_event_into(&mut buf)? {
10324                    Event::Start(e) => {
10325                        match e.local_name().as_ref() {
10326                            b"pivotArea" => {
10327                                f_pivot_area =
10328                                    Some(Box::new(PivotArea::from_xml(reader, &e, false)?));
10329                                #[cfg(feature = "extra-children")]
10330                                {
10331                                    child_idx += 1;
10332                                }
10333                            }
10334                            b"extLst" => {
10335                                f_extension_list =
10336                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
10337                                #[cfg(feature = "extra-children")]
10338                                {
10339                                    child_idx += 1;
10340                                }
10341                            }
10342                            #[cfg(feature = "extra-children")]
10343                            _ => {
10344                                // Capture unknown element for roundtrip
10345                                let elem = RawXmlElement::from_reader(reader, &e)?;
10346                                extra_children.push(PositionedNode::new(
10347                                    child_idx,
10348                                    RawXmlNode::Element(elem),
10349                                ));
10350                                child_idx += 1;
10351                            }
10352                            #[cfg(not(feature = "extra-children"))]
10353                            _ => {
10354                                // Skip unknown element
10355                                skip_element(reader)?;
10356                            }
10357                        }
10358                    }
10359                    Event::Empty(e) => {
10360                        match e.local_name().as_ref() {
10361                            b"pivotArea" => {
10362                                f_pivot_area =
10363                                    Some(Box::new(PivotArea::from_xml(reader, &e, true)?));
10364                                #[cfg(feature = "extra-children")]
10365                                {
10366                                    child_idx += 1;
10367                                }
10368                            }
10369                            b"extLst" => {
10370                                f_extension_list =
10371                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
10372                                #[cfg(feature = "extra-children")]
10373                                {
10374                                    child_idx += 1;
10375                                }
10376                            }
10377                            #[cfg(feature = "extra-children")]
10378                            _ => {
10379                                // Capture unknown empty element for roundtrip
10380                                let elem = RawXmlElement::from_empty(&e);
10381                                extra_children.push(PositionedNode::new(
10382                                    child_idx,
10383                                    RawXmlNode::Element(elem),
10384                                ));
10385                                child_idx += 1;
10386                            }
10387                            #[cfg(not(feature = "extra-children"))]
10388                            _ => {}
10389                        }
10390                    }
10391                    Event::End(_) => break,
10392                    Event::Eof => break,
10393                    _ => {}
10394                }
10395                buf.clear();
10396            }
10397        }
10398
10399        Ok(Self {
10400            field: f_field,
10401            formula: f_formula,
10402            pivot_area: f_pivot_area
10403                .ok_or_else(|| ParseError::MissingAttribute("pivotArea".to_string()))?,
10404            extension_list: f_extension_list,
10405            #[cfg(feature = "extra-attrs")]
10406            extra_attrs,
10407            #[cfg(feature = "extra-children")]
10408            extra_children,
10409        })
10410    }
10411}
10412
10413impl FromXml for CTCalculatedMembers {
10414    fn from_xml<R: BufRead>(
10415        reader: &mut Reader<R>,
10416        start_tag: &BytesStart,
10417        is_empty: bool,
10418    ) -> Result<Self, ParseError> {
10419        let mut f_count = None;
10420        let mut f_calculated_member = Vec::new();
10421        #[cfg(feature = "extra-attrs")]
10422        let mut extra_attrs = std::collections::HashMap::new();
10423        #[cfg(feature = "extra-children")]
10424        let mut extra_children = Vec::new();
10425        #[cfg(feature = "extra-children")]
10426        let mut child_idx: usize = 0;
10427
10428        // Parse attributes
10429        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10430            let val = String::from_utf8_lossy(&attr.value);
10431            match attr.key.local_name().as_ref() {
10432                b"count" => {
10433                    f_count = val.parse().ok();
10434                }
10435                #[cfg(feature = "extra-attrs")]
10436                unknown => {
10437                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10438                    extra_attrs.insert(key, val.into_owned());
10439                }
10440                #[cfg(not(feature = "extra-attrs"))]
10441                _ => {}
10442            }
10443        }
10444
10445        // Parse child elements
10446        if !is_empty {
10447            let mut buf = Vec::new();
10448            loop {
10449                match reader.read_event_into(&mut buf)? {
10450                    Event::Start(e) => {
10451                        match e.local_name().as_ref() {
10452                            b"calculatedMember" => {
10453                                f_calculated_member
10454                                    .push(CTCalculatedMember::from_xml(reader, &e, false)?);
10455                                #[cfg(feature = "extra-children")]
10456                                {
10457                                    child_idx += 1;
10458                                }
10459                            }
10460                            #[cfg(feature = "extra-children")]
10461                            _ => {
10462                                // Capture unknown element for roundtrip
10463                                let elem = RawXmlElement::from_reader(reader, &e)?;
10464                                extra_children.push(PositionedNode::new(
10465                                    child_idx,
10466                                    RawXmlNode::Element(elem),
10467                                ));
10468                                child_idx += 1;
10469                            }
10470                            #[cfg(not(feature = "extra-children"))]
10471                            _ => {
10472                                // Skip unknown element
10473                                skip_element(reader)?;
10474                            }
10475                        }
10476                    }
10477                    Event::Empty(e) => {
10478                        match e.local_name().as_ref() {
10479                            b"calculatedMember" => {
10480                                f_calculated_member
10481                                    .push(CTCalculatedMember::from_xml(reader, &e, true)?);
10482                                #[cfg(feature = "extra-children")]
10483                                {
10484                                    child_idx += 1;
10485                                }
10486                            }
10487                            #[cfg(feature = "extra-children")]
10488                            _ => {
10489                                // Capture unknown empty element for roundtrip
10490                                let elem = RawXmlElement::from_empty(&e);
10491                                extra_children.push(PositionedNode::new(
10492                                    child_idx,
10493                                    RawXmlNode::Element(elem),
10494                                ));
10495                                child_idx += 1;
10496                            }
10497                            #[cfg(not(feature = "extra-children"))]
10498                            _ => {}
10499                        }
10500                    }
10501                    Event::End(_) => break,
10502                    Event::Eof => break,
10503                    _ => {}
10504                }
10505                buf.clear();
10506            }
10507        }
10508
10509        Ok(Self {
10510            count: f_count,
10511            calculated_member: f_calculated_member,
10512            #[cfg(feature = "extra-attrs")]
10513            extra_attrs,
10514            #[cfg(feature = "extra-children")]
10515            extra_children,
10516        })
10517    }
10518}
10519
10520impl FromXml for CTCalculatedMember {
10521    fn from_xml<R: BufRead>(
10522        reader: &mut Reader<R>,
10523        start_tag: &BytesStart,
10524        is_empty: bool,
10525    ) -> Result<Self, ParseError> {
10526        let mut f_name: Option<XmlString> = None;
10527        let mut f_mdx: Option<XmlString> = None;
10528        let mut f_member_name = None;
10529        let mut f_hierarchy = None;
10530        let mut f_parent = None;
10531        let mut f_solve_order = None;
10532        let mut f_set = None;
10533        let mut f_extension_list = None;
10534        #[cfg(feature = "extra-attrs")]
10535        let mut extra_attrs = std::collections::HashMap::new();
10536        #[cfg(feature = "extra-children")]
10537        let mut extra_children = Vec::new();
10538        #[cfg(feature = "extra-children")]
10539        let mut child_idx: usize = 0;
10540
10541        // Parse attributes
10542        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10543            let val = String::from_utf8_lossy(&attr.value);
10544            match attr.key.local_name().as_ref() {
10545                b"name" => {
10546                    f_name = Some(val.into_owned());
10547                }
10548                b"mdx" => {
10549                    f_mdx = Some(val.into_owned());
10550                }
10551                b"memberName" => {
10552                    f_member_name = Some(val.into_owned());
10553                }
10554                b"hierarchy" => {
10555                    f_hierarchy = Some(val.into_owned());
10556                }
10557                b"parent" => {
10558                    f_parent = Some(val.into_owned());
10559                }
10560                b"solveOrder" => {
10561                    f_solve_order = val.parse().ok();
10562                }
10563                b"set" => {
10564                    f_set = Some(val == "true" || val == "1");
10565                }
10566                #[cfg(feature = "extra-attrs")]
10567                unknown => {
10568                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10569                    extra_attrs.insert(key, val.into_owned());
10570                }
10571                #[cfg(not(feature = "extra-attrs"))]
10572                _ => {}
10573            }
10574        }
10575
10576        // Parse child elements
10577        if !is_empty {
10578            let mut buf = Vec::new();
10579            loop {
10580                match reader.read_event_into(&mut buf)? {
10581                    Event::Start(e) => {
10582                        match e.local_name().as_ref() {
10583                            b"extLst" => {
10584                                f_extension_list =
10585                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
10586                                #[cfg(feature = "extra-children")]
10587                                {
10588                                    child_idx += 1;
10589                                }
10590                            }
10591                            #[cfg(feature = "extra-children")]
10592                            _ => {
10593                                // Capture unknown element for roundtrip
10594                                let elem = RawXmlElement::from_reader(reader, &e)?;
10595                                extra_children.push(PositionedNode::new(
10596                                    child_idx,
10597                                    RawXmlNode::Element(elem),
10598                                ));
10599                                child_idx += 1;
10600                            }
10601                            #[cfg(not(feature = "extra-children"))]
10602                            _ => {
10603                                // Skip unknown element
10604                                skip_element(reader)?;
10605                            }
10606                        }
10607                    }
10608                    Event::Empty(e) => {
10609                        match e.local_name().as_ref() {
10610                            b"extLst" => {
10611                                f_extension_list =
10612                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
10613                                #[cfg(feature = "extra-children")]
10614                                {
10615                                    child_idx += 1;
10616                                }
10617                            }
10618                            #[cfg(feature = "extra-children")]
10619                            _ => {
10620                                // Capture unknown empty element for roundtrip
10621                                let elem = RawXmlElement::from_empty(&e);
10622                                extra_children.push(PositionedNode::new(
10623                                    child_idx,
10624                                    RawXmlNode::Element(elem),
10625                                ));
10626                                child_idx += 1;
10627                            }
10628                            #[cfg(not(feature = "extra-children"))]
10629                            _ => {}
10630                        }
10631                    }
10632                    Event::End(_) => break,
10633                    Event::Eof => break,
10634                    _ => {}
10635                }
10636                buf.clear();
10637            }
10638        }
10639
10640        Ok(Self {
10641            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
10642            mdx: f_mdx.ok_or_else(|| ParseError::MissingAttribute("mdx".to_string()))?,
10643            member_name: f_member_name,
10644            hierarchy: f_hierarchy,
10645            parent: f_parent,
10646            solve_order: f_solve_order,
10647            set: f_set,
10648            extension_list: f_extension_list,
10649            #[cfg(feature = "extra-attrs")]
10650            extra_attrs,
10651            #[cfg(feature = "extra-children")]
10652            extra_children,
10653        })
10654    }
10655}
10656
10657impl FromXml for CTPivotTableDefinition {
10658    fn from_xml<R: BufRead>(
10659        reader: &mut Reader<R>,
10660        start_tag: &BytesStart,
10661        is_empty: bool,
10662    ) -> Result<Self, ParseError> {
10663        let mut f_name: Option<XmlString> = None;
10664        let mut f_cache_id: Option<u32> = None;
10665        let mut f_data_on_rows = None;
10666        let mut f_data_position = None;
10667        let mut f_auto_format_id = None;
10668        let mut f_apply_number_formats = None;
10669        let mut f_apply_border_formats = None;
10670        let mut f_apply_font_formats = None;
10671        let mut f_apply_pattern_formats = None;
10672        let mut f_apply_alignment_formats = None;
10673        let mut f_apply_width_height_formats = None;
10674        let mut f_data_caption: Option<XmlString> = None;
10675        let mut f_grand_total_caption = None;
10676        let mut f_error_caption = None;
10677        let mut f_show_error = None;
10678        let mut f_missing_caption = None;
10679        let mut f_show_missing = None;
10680        let mut f_page_style = None;
10681        let mut f_pivot_table_style = None;
10682        let mut f_vacated_style = None;
10683        let mut f_tag = None;
10684        let mut f_updated_version = None;
10685        let mut f_min_refreshable_version = None;
10686        let mut f_asterisk_totals = None;
10687        let mut f_show_items = None;
10688        let mut f_edit_data = None;
10689        let mut f_disable_field_list = None;
10690        let mut f_show_calc_mbrs = None;
10691        let mut f_visual_totals = None;
10692        let mut f_show_multiple_label = None;
10693        let mut f_show_data_drop_down = None;
10694        let mut f_show_drill = None;
10695        let mut f_print_drill = None;
10696        let mut f_show_member_property_tips = None;
10697        let mut f_show_data_tips = None;
10698        let mut f_enable_wizard = None;
10699        let mut f_enable_drill = None;
10700        let mut f_enable_field_properties = None;
10701        let mut f_preserve_formatting = None;
10702        let mut f_use_auto_formatting = None;
10703        let mut f_page_wrap = None;
10704        let mut f_page_over_then_down = None;
10705        let mut f_subtotal_hidden_items = None;
10706        let mut f_row_grand_totals = None;
10707        let mut f_col_grand_totals = None;
10708        let mut f_field_print_titles = None;
10709        let mut f_item_print_titles = None;
10710        let mut f_merge_item = None;
10711        let mut f_show_drop_zones = None;
10712        let mut f_created_version = None;
10713        let mut f_indent = None;
10714        let mut f_show_empty_row = None;
10715        let mut f_show_empty_col = None;
10716        let mut f_show_headers = None;
10717        let mut f_compact = None;
10718        let mut f_outline = None;
10719        let mut f_outline_data = None;
10720        let mut f_compact_data = None;
10721        let mut f_published = None;
10722        let mut f_grid_drop_zones = None;
10723        let mut f_immersive = None;
10724        let mut f_multiple_field_filters = None;
10725        let mut f_chart_format = None;
10726        let mut f_row_header_caption = None;
10727        let mut f_col_header_caption = None;
10728        let mut f_field_list_sort_ascending = None;
10729        let mut f_mdx_subqueries = None;
10730        let mut f_custom_list_sort = None;
10731        let mut f_location: Option<Box<PivotLocation>> = None;
10732        let mut f_pivot_fields = None;
10733        let mut f_row_fields = None;
10734        let mut f_row_items = None;
10735        let mut f_col_fields = None;
10736        let mut f_col_items = None;
10737        let mut f_page_fields = None;
10738        let mut f_data_fields = None;
10739        let mut f_formats = None;
10740        let mut f_conditional_formats = None;
10741        let mut f_chart_formats = None;
10742        let mut f_pivot_hierarchies = None;
10743        let mut f_pivot_table_style_info = None;
10744        let mut f_filters = None;
10745        let mut f_row_hierarchies_usage = None;
10746        let mut f_col_hierarchies_usage = None;
10747        let mut f_extension_list = None;
10748        #[cfg(feature = "extra-attrs")]
10749        let mut extra_attrs = std::collections::HashMap::new();
10750        #[cfg(feature = "extra-children")]
10751        let mut extra_children = Vec::new();
10752        #[cfg(feature = "extra-children")]
10753        let mut child_idx: usize = 0;
10754
10755        // Parse attributes
10756        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
10757            let val = String::from_utf8_lossy(&attr.value);
10758            match attr.key.local_name().as_ref() {
10759                b"name" => {
10760                    f_name = Some(val.into_owned());
10761                }
10762                b"cacheId" => {
10763                    f_cache_id = val.parse().ok();
10764                }
10765                b"dataOnRows" => {
10766                    f_data_on_rows = Some(val == "true" || val == "1");
10767                }
10768                b"dataPosition" => {
10769                    f_data_position = val.parse().ok();
10770                }
10771                b"autoFormatId" => {
10772                    f_auto_format_id = val.parse().ok();
10773                }
10774                b"applyNumberFormats" => {
10775                    f_apply_number_formats = Some(val == "true" || val == "1");
10776                }
10777                b"applyBorderFormats" => {
10778                    f_apply_border_formats = Some(val == "true" || val == "1");
10779                }
10780                b"applyFontFormats" => {
10781                    f_apply_font_formats = Some(val == "true" || val == "1");
10782                }
10783                b"applyPatternFormats" => {
10784                    f_apply_pattern_formats = Some(val == "true" || val == "1");
10785                }
10786                b"applyAlignmentFormats" => {
10787                    f_apply_alignment_formats = Some(val == "true" || val == "1");
10788                }
10789                b"applyWidthHeightFormats" => {
10790                    f_apply_width_height_formats = Some(val == "true" || val == "1");
10791                }
10792                b"dataCaption" => {
10793                    f_data_caption = Some(val.into_owned());
10794                }
10795                b"grandTotalCaption" => {
10796                    f_grand_total_caption = Some(val.into_owned());
10797                }
10798                b"errorCaption" => {
10799                    f_error_caption = Some(val.into_owned());
10800                }
10801                b"showError" => {
10802                    f_show_error = Some(val == "true" || val == "1");
10803                }
10804                b"missingCaption" => {
10805                    f_missing_caption = Some(val.into_owned());
10806                }
10807                b"showMissing" => {
10808                    f_show_missing = Some(val == "true" || val == "1");
10809                }
10810                b"pageStyle" => {
10811                    f_page_style = Some(val.into_owned());
10812                }
10813                b"pivotTableStyle" => {
10814                    f_pivot_table_style = Some(val.into_owned());
10815                }
10816                b"vacatedStyle" => {
10817                    f_vacated_style = Some(val.into_owned());
10818                }
10819                b"tag" => {
10820                    f_tag = Some(val.into_owned());
10821                }
10822                b"updatedVersion" => {
10823                    f_updated_version = val.parse().ok();
10824                }
10825                b"minRefreshableVersion" => {
10826                    f_min_refreshable_version = val.parse().ok();
10827                }
10828                b"asteriskTotals" => {
10829                    f_asterisk_totals = Some(val == "true" || val == "1");
10830                }
10831                b"showItems" => {
10832                    f_show_items = Some(val == "true" || val == "1");
10833                }
10834                b"editData" => {
10835                    f_edit_data = Some(val == "true" || val == "1");
10836                }
10837                b"disableFieldList" => {
10838                    f_disable_field_list = Some(val == "true" || val == "1");
10839                }
10840                b"showCalcMbrs" => {
10841                    f_show_calc_mbrs = Some(val == "true" || val == "1");
10842                }
10843                b"visualTotals" => {
10844                    f_visual_totals = Some(val == "true" || val == "1");
10845                }
10846                b"showMultipleLabel" => {
10847                    f_show_multiple_label = Some(val == "true" || val == "1");
10848                }
10849                b"showDataDropDown" => {
10850                    f_show_data_drop_down = Some(val == "true" || val == "1");
10851                }
10852                b"showDrill" => {
10853                    f_show_drill = Some(val == "true" || val == "1");
10854                }
10855                b"printDrill" => {
10856                    f_print_drill = Some(val == "true" || val == "1");
10857                }
10858                b"showMemberPropertyTips" => {
10859                    f_show_member_property_tips = Some(val == "true" || val == "1");
10860                }
10861                b"showDataTips" => {
10862                    f_show_data_tips = Some(val == "true" || val == "1");
10863                }
10864                b"enableWizard" => {
10865                    f_enable_wizard = Some(val == "true" || val == "1");
10866                }
10867                b"enableDrill" => {
10868                    f_enable_drill = Some(val == "true" || val == "1");
10869                }
10870                b"enableFieldProperties" => {
10871                    f_enable_field_properties = Some(val == "true" || val == "1");
10872                }
10873                b"preserveFormatting" => {
10874                    f_preserve_formatting = Some(val == "true" || val == "1");
10875                }
10876                b"useAutoFormatting" => {
10877                    f_use_auto_formatting = Some(val == "true" || val == "1");
10878                }
10879                b"pageWrap" => {
10880                    f_page_wrap = val.parse().ok();
10881                }
10882                b"pageOverThenDown" => {
10883                    f_page_over_then_down = Some(val == "true" || val == "1");
10884                }
10885                b"subtotalHiddenItems" => {
10886                    f_subtotal_hidden_items = Some(val == "true" || val == "1");
10887                }
10888                b"rowGrandTotals" => {
10889                    f_row_grand_totals = Some(val == "true" || val == "1");
10890                }
10891                b"colGrandTotals" => {
10892                    f_col_grand_totals = Some(val == "true" || val == "1");
10893                }
10894                b"fieldPrintTitles" => {
10895                    f_field_print_titles = Some(val == "true" || val == "1");
10896                }
10897                b"itemPrintTitles" => {
10898                    f_item_print_titles = Some(val == "true" || val == "1");
10899                }
10900                b"mergeItem" => {
10901                    f_merge_item = Some(val == "true" || val == "1");
10902                }
10903                b"showDropZones" => {
10904                    f_show_drop_zones = Some(val == "true" || val == "1");
10905                }
10906                b"createdVersion" => {
10907                    f_created_version = val.parse().ok();
10908                }
10909                b"indent" => {
10910                    f_indent = val.parse().ok();
10911                }
10912                b"showEmptyRow" => {
10913                    f_show_empty_row = Some(val == "true" || val == "1");
10914                }
10915                b"showEmptyCol" => {
10916                    f_show_empty_col = Some(val == "true" || val == "1");
10917                }
10918                b"showHeaders" => {
10919                    f_show_headers = Some(val == "true" || val == "1");
10920                }
10921                b"compact" => {
10922                    f_compact = Some(val == "true" || val == "1");
10923                }
10924                b"outline" => {
10925                    f_outline = Some(val == "true" || val == "1");
10926                }
10927                b"outlineData" => {
10928                    f_outline_data = Some(val == "true" || val == "1");
10929                }
10930                b"compactData" => {
10931                    f_compact_data = Some(val == "true" || val == "1");
10932                }
10933                b"published" => {
10934                    f_published = Some(val == "true" || val == "1");
10935                }
10936                b"gridDropZones" => {
10937                    f_grid_drop_zones = Some(val == "true" || val == "1");
10938                }
10939                b"immersive" => {
10940                    f_immersive = Some(val == "true" || val == "1");
10941                }
10942                b"multipleFieldFilters" => {
10943                    f_multiple_field_filters = Some(val == "true" || val == "1");
10944                }
10945                b"chartFormat" => {
10946                    f_chart_format = val.parse().ok();
10947                }
10948                b"rowHeaderCaption" => {
10949                    f_row_header_caption = Some(val.into_owned());
10950                }
10951                b"colHeaderCaption" => {
10952                    f_col_header_caption = Some(val.into_owned());
10953                }
10954                b"fieldListSortAscending" => {
10955                    f_field_list_sort_ascending = Some(val == "true" || val == "1");
10956                }
10957                b"mdxSubqueries" => {
10958                    f_mdx_subqueries = Some(val == "true" || val == "1");
10959                }
10960                b"customListSort" => {
10961                    f_custom_list_sort = Some(val == "true" || val == "1");
10962                }
10963                #[cfg(feature = "extra-attrs")]
10964                unknown => {
10965                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
10966                    extra_attrs.insert(key, val.into_owned());
10967                }
10968                #[cfg(not(feature = "extra-attrs"))]
10969                _ => {}
10970            }
10971        }
10972
10973        // Parse child elements
10974        if !is_empty {
10975            let mut buf = Vec::new();
10976            loop {
10977                match reader.read_event_into(&mut buf)? {
10978                    Event::Start(e) => {
10979                        match e.local_name().as_ref() {
10980                            b"location" => {
10981                                f_location =
10982                                    Some(Box::new(PivotLocation::from_xml(reader, &e, false)?));
10983                                #[cfg(feature = "extra-children")]
10984                                {
10985                                    child_idx += 1;
10986                                }
10987                            }
10988                            b"pivotFields" => {
10989                                f_pivot_fields =
10990                                    Some(Box::new(PivotFields::from_xml(reader, &e, false)?));
10991                                #[cfg(feature = "extra-children")]
10992                                {
10993                                    child_idx += 1;
10994                                }
10995                            }
10996                            b"rowFields" => {
10997                                f_row_fields =
10998                                    Some(Box::new(RowFields::from_xml(reader, &e, false)?));
10999                                #[cfg(feature = "extra-children")]
11000                                {
11001                                    child_idx += 1;
11002                                }
11003                            }
11004                            b"rowItems" => {
11005                                f_row_items =
11006                                    Some(Box::new(CTRowItems::from_xml(reader, &e, false)?));
11007                                #[cfg(feature = "extra-children")]
11008                                {
11009                                    child_idx += 1;
11010                                }
11011                            }
11012                            b"colFields" => {
11013                                f_col_fields =
11014                                    Some(Box::new(ColFields::from_xml(reader, &e, false)?));
11015                                #[cfg(feature = "extra-children")]
11016                                {
11017                                    child_idx += 1;
11018                                }
11019                            }
11020                            b"colItems" => {
11021                                f_col_items =
11022                                    Some(Box::new(CTColItems::from_xml(reader, &e, false)?));
11023                                #[cfg(feature = "extra-children")]
11024                                {
11025                                    child_idx += 1;
11026                                }
11027                            }
11028                            b"pageFields" => {
11029                                f_page_fields =
11030                                    Some(Box::new(PageFields::from_xml(reader, &e, false)?));
11031                                #[cfg(feature = "extra-children")]
11032                                {
11033                                    child_idx += 1;
11034                                }
11035                            }
11036                            b"dataFields" => {
11037                                f_data_fields =
11038                                    Some(Box::new(DataFields::from_xml(reader, &e, false)?));
11039                                #[cfg(feature = "extra-children")]
11040                                {
11041                                    child_idx += 1;
11042                                }
11043                            }
11044                            b"formats" => {
11045                                f_formats = Some(Box::new(CTFormats::from_xml(reader, &e, false)?));
11046                                #[cfg(feature = "extra-children")]
11047                                {
11048                                    child_idx += 1;
11049                                }
11050                            }
11051                            b"conditionalFormats" => {
11052                                f_conditional_formats = Some(Box::new(
11053                                    CTConditionalFormats::from_xml(reader, &e, false)?,
11054                                ));
11055                                #[cfg(feature = "extra-children")]
11056                                {
11057                                    child_idx += 1;
11058                                }
11059                            }
11060                            b"chartFormats" => {
11061                                f_chart_formats =
11062                                    Some(Box::new(CTChartFormats::from_xml(reader, &e, false)?));
11063                                #[cfg(feature = "extra-children")]
11064                                {
11065                                    child_idx += 1;
11066                                }
11067                            }
11068                            b"pivotHierarchies" => {
11069                                f_pivot_hierarchies = Some(Box::new(CTPivotHierarchies::from_xml(
11070                                    reader, &e, false,
11071                                )?));
11072                                #[cfg(feature = "extra-children")]
11073                                {
11074                                    child_idx += 1;
11075                                }
11076                            }
11077                            b"pivotTableStyleInfo" => {
11078                                f_pivot_table_style_info =
11079                                    Some(Box::new(CTPivotTableStyle::from_xml(reader, &e, false)?));
11080                                #[cfg(feature = "extra-children")]
11081                                {
11082                                    child_idx += 1;
11083                                }
11084                            }
11085                            b"filters" => {
11086                                f_filters =
11087                                    Some(Box::new(PivotFilters::from_xml(reader, &e, false)?));
11088                                #[cfg(feature = "extra-children")]
11089                                {
11090                                    child_idx += 1;
11091                                }
11092                            }
11093                            b"rowHierarchiesUsage" => {
11094                                f_row_hierarchies_usage = Some(Box::new(
11095                                    CTRowHierarchiesUsage::from_xml(reader, &e, false)?,
11096                                ));
11097                                #[cfg(feature = "extra-children")]
11098                                {
11099                                    child_idx += 1;
11100                                }
11101                            }
11102                            b"colHierarchiesUsage" => {
11103                                f_col_hierarchies_usage = Some(Box::new(
11104                                    CTColHierarchiesUsage::from_xml(reader, &e, false)?,
11105                                ));
11106                                #[cfg(feature = "extra-children")]
11107                                {
11108                                    child_idx += 1;
11109                                }
11110                            }
11111                            b"extLst" => {
11112                                f_extension_list =
11113                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
11114                                #[cfg(feature = "extra-children")]
11115                                {
11116                                    child_idx += 1;
11117                                }
11118                            }
11119                            #[cfg(feature = "extra-children")]
11120                            _ => {
11121                                // Capture unknown element for roundtrip
11122                                let elem = RawXmlElement::from_reader(reader, &e)?;
11123                                extra_children.push(PositionedNode::new(
11124                                    child_idx,
11125                                    RawXmlNode::Element(elem),
11126                                ));
11127                                child_idx += 1;
11128                            }
11129                            #[cfg(not(feature = "extra-children"))]
11130                            _ => {
11131                                // Skip unknown element
11132                                skip_element(reader)?;
11133                            }
11134                        }
11135                    }
11136                    Event::Empty(e) => {
11137                        match e.local_name().as_ref() {
11138                            b"location" => {
11139                                f_location =
11140                                    Some(Box::new(PivotLocation::from_xml(reader, &e, true)?));
11141                                #[cfg(feature = "extra-children")]
11142                                {
11143                                    child_idx += 1;
11144                                }
11145                            }
11146                            b"pivotFields" => {
11147                                f_pivot_fields =
11148                                    Some(Box::new(PivotFields::from_xml(reader, &e, true)?));
11149                                #[cfg(feature = "extra-children")]
11150                                {
11151                                    child_idx += 1;
11152                                }
11153                            }
11154                            b"rowFields" => {
11155                                f_row_fields =
11156                                    Some(Box::new(RowFields::from_xml(reader, &e, true)?));
11157                                #[cfg(feature = "extra-children")]
11158                                {
11159                                    child_idx += 1;
11160                                }
11161                            }
11162                            b"rowItems" => {
11163                                f_row_items =
11164                                    Some(Box::new(CTRowItems::from_xml(reader, &e, true)?));
11165                                #[cfg(feature = "extra-children")]
11166                                {
11167                                    child_idx += 1;
11168                                }
11169                            }
11170                            b"colFields" => {
11171                                f_col_fields =
11172                                    Some(Box::new(ColFields::from_xml(reader, &e, true)?));
11173                                #[cfg(feature = "extra-children")]
11174                                {
11175                                    child_idx += 1;
11176                                }
11177                            }
11178                            b"colItems" => {
11179                                f_col_items =
11180                                    Some(Box::new(CTColItems::from_xml(reader, &e, true)?));
11181                                #[cfg(feature = "extra-children")]
11182                                {
11183                                    child_idx += 1;
11184                                }
11185                            }
11186                            b"pageFields" => {
11187                                f_page_fields =
11188                                    Some(Box::new(PageFields::from_xml(reader, &e, true)?));
11189                                #[cfg(feature = "extra-children")]
11190                                {
11191                                    child_idx += 1;
11192                                }
11193                            }
11194                            b"dataFields" => {
11195                                f_data_fields =
11196                                    Some(Box::new(DataFields::from_xml(reader, &e, true)?));
11197                                #[cfg(feature = "extra-children")]
11198                                {
11199                                    child_idx += 1;
11200                                }
11201                            }
11202                            b"formats" => {
11203                                f_formats = Some(Box::new(CTFormats::from_xml(reader, &e, true)?));
11204                                #[cfg(feature = "extra-children")]
11205                                {
11206                                    child_idx += 1;
11207                                }
11208                            }
11209                            b"conditionalFormats" => {
11210                                f_conditional_formats = Some(Box::new(
11211                                    CTConditionalFormats::from_xml(reader, &e, true)?,
11212                                ));
11213                                #[cfg(feature = "extra-children")]
11214                                {
11215                                    child_idx += 1;
11216                                }
11217                            }
11218                            b"chartFormats" => {
11219                                f_chart_formats =
11220                                    Some(Box::new(CTChartFormats::from_xml(reader, &e, true)?));
11221                                #[cfg(feature = "extra-children")]
11222                                {
11223                                    child_idx += 1;
11224                                }
11225                            }
11226                            b"pivotHierarchies" => {
11227                                f_pivot_hierarchies =
11228                                    Some(Box::new(CTPivotHierarchies::from_xml(reader, &e, true)?));
11229                                #[cfg(feature = "extra-children")]
11230                                {
11231                                    child_idx += 1;
11232                                }
11233                            }
11234                            b"pivotTableStyleInfo" => {
11235                                f_pivot_table_style_info =
11236                                    Some(Box::new(CTPivotTableStyle::from_xml(reader, &e, true)?));
11237                                #[cfg(feature = "extra-children")]
11238                                {
11239                                    child_idx += 1;
11240                                }
11241                            }
11242                            b"filters" => {
11243                                f_filters =
11244                                    Some(Box::new(PivotFilters::from_xml(reader, &e, true)?));
11245                                #[cfg(feature = "extra-children")]
11246                                {
11247                                    child_idx += 1;
11248                                }
11249                            }
11250                            b"rowHierarchiesUsage" => {
11251                                f_row_hierarchies_usage = Some(Box::new(
11252                                    CTRowHierarchiesUsage::from_xml(reader, &e, true)?,
11253                                ));
11254                                #[cfg(feature = "extra-children")]
11255                                {
11256                                    child_idx += 1;
11257                                }
11258                            }
11259                            b"colHierarchiesUsage" => {
11260                                f_col_hierarchies_usage = Some(Box::new(
11261                                    CTColHierarchiesUsage::from_xml(reader, &e, true)?,
11262                                ));
11263                                #[cfg(feature = "extra-children")]
11264                                {
11265                                    child_idx += 1;
11266                                }
11267                            }
11268                            b"extLst" => {
11269                                f_extension_list =
11270                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
11271                                #[cfg(feature = "extra-children")]
11272                                {
11273                                    child_idx += 1;
11274                                }
11275                            }
11276                            #[cfg(feature = "extra-children")]
11277                            _ => {
11278                                // Capture unknown empty element for roundtrip
11279                                let elem = RawXmlElement::from_empty(&e);
11280                                extra_children.push(PositionedNode::new(
11281                                    child_idx,
11282                                    RawXmlNode::Element(elem),
11283                                ));
11284                                child_idx += 1;
11285                            }
11286                            #[cfg(not(feature = "extra-children"))]
11287                            _ => {}
11288                        }
11289                    }
11290                    Event::End(_) => break,
11291                    Event::Eof => break,
11292                    _ => {}
11293                }
11294                buf.clear();
11295            }
11296        }
11297
11298        Ok(Self {
11299            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
11300            cache_id: f_cache_id
11301                .ok_or_else(|| ParseError::MissingAttribute("cacheId".to_string()))?,
11302            data_on_rows: f_data_on_rows,
11303            data_position: f_data_position,
11304            auto_format_id: f_auto_format_id,
11305            apply_number_formats: f_apply_number_formats,
11306            apply_border_formats: f_apply_border_formats,
11307            apply_font_formats: f_apply_font_formats,
11308            apply_pattern_formats: f_apply_pattern_formats,
11309            apply_alignment_formats: f_apply_alignment_formats,
11310            apply_width_height_formats: f_apply_width_height_formats,
11311            data_caption: f_data_caption
11312                .ok_or_else(|| ParseError::MissingAttribute("dataCaption".to_string()))?,
11313            grand_total_caption: f_grand_total_caption,
11314            error_caption: f_error_caption,
11315            show_error: f_show_error,
11316            missing_caption: f_missing_caption,
11317            show_missing: f_show_missing,
11318            page_style: f_page_style,
11319            pivot_table_style: f_pivot_table_style,
11320            vacated_style: f_vacated_style,
11321            tag: f_tag,
11322            updated_version: f_updated_version,
11323            min_refreshable_version: f_min_refreshable_version,
11324            asterisk_totals: f_asterisk_totals,
11325            show_items: f_show_items,
11326            edit_data: f_edit_data,
11327            disable_field_list: f_disable_field_list,
11328            show_calc_mbrs: f_show_calc_mbrs,
11329            visual_totals: f_visual_totals,
11330            show_multiple_label: f_show_multiple_label,
11331            show_data_drop_down: f_show_data_drop_down,
11332            show_drill: f_show_drill,
11333            print_drill: f_print_drill,
11334            show_member_property_tips: f_show_member_property_tips,
11335            show_data_tips: f_show_data_tips,
11336            enable_wizard: f_enable_wizard,
11337            enable_drill: f_enable_drill,
11338            enable_field_properties: f_enable_field_properties,
11339            preserve_formatting: f_preserve_formatting,
11340            use_auto_formatting: f_use_auto_formatting,
11341            page_wrap: f_page_wrap,
11342            page_over_then_down: f_page_over_then_down,
11343            subtotal_hidden_items: f_subtotal_hidden_items,
11344            row_grand_totals: f_row_grand_totals,
11345            col_grand_totals: f_col_grand_totals,
11346            field_print_titles: f_field_print_titles,
11347            item_print_titles: f_item_print_titles,
11348            merge_item: f_merge_item,
11349            show_drop_zones: f_show_drop_zones,
11350            created_version: f_created_version,
11351            indent: f_indent,
11352            show_empty_row: f_show_empty_row,
11353            show_empty_col: f_show_empty_col,
11354            show_headers: f_show_headers,
11355            compact: f_compact,
11356            outline: f_outline,
11357            outline_data: f_outline_data,
11358            compact_data: f_compact_data,
11359            published: f_published,
11360            grid_drop_zones: f_grid_drop_zones,
11361            immersive: f_immersive,
11362            multiple_field_filters: f_multiple_field_filters,
11363            chart_format: f_chart_format,
11364            row_header_caption: f_row_header_caption,
11365            col_header_caption: f_col_header_caption,
11366            field_list_sort_ascending: f_field_list_sort_ascending,
11367            mdx_subqueries: f_mdx_subqueries,
11368            custom_list_sort: f_custom_list_sort,
11369            location: f_location
11370                .ok_or_else(|| ParseError::MissingAttribute("location".to_string()))?,
11371            pivot_fields: f_pivot_fields,
11372            row_fields: f_row_fields,
11373            row_items: f_row_items,
11374            col_fields: f_col_fields,
11375            col_items: f_col_items,
11376            page_fields: f_page_fields,
11377            data_fields: f_data_fields,
11378            formats: f_formats,
11379            conditional_formats: f_conditional_formats,
11380            chart_formats: f_chart_formats,
11381            pivot_hierarchies: f_pivot_hierarchies,
11382            pivot_table_style_info: f_pivot_table_style_info,
11383            filters: f_filters,
11384            row_hierarchies_usage: f_row_hierarchies_usage,
11385            col_hierarchies_usage: f_col_hierarchies_usage,
11386            extension_list: f_extension_list,
11387            #[cfg(feature = "extra-attrs")]
11388            extra_attrs,
11389            #[cfg(feature = "extra-children")]
11390            extra_children,
11391        })
11392    }
11393}
11394
11395impl FromXml for PivotLocation {
11396    fn from_xml<R: BufRead>(
11397        reader: &mut Reader<R>,
11398        start_tag: &BytesStart,
11399        is_empty: bool,
11400    ) -> Result<Self, ParseError> {
11401        let mut f_reference: Option<Reference> = None;
11402        let mut f_first_header_row: Option<u32> = None;
11403        let mut f_first_data_row: Option<u32> = None;
11404        let mut f_first_data_col: Option<u32> = None;
11405        let mut f_row_page_count = None;
11406        let mut f_col_page_count = None;
11407        #[cfg(feature = "extra-attrs")]
11408        let mut extra_attrs = std::collections::HashMap::new();
11409
11410        // Parse attributes
11411        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
11412            let val = String::from_utf8_lossy(&attr.value);
11413            match attr.key.local_name().as_ref() {
11414                b"ref" => {
11415                    f_reference = Some(val.into_owned());
11416                }
11417                b"firstHeaderRow" => {
11418                    f_first_header_row = val.parse().ok();
11419                }
11420                b"firstDataRow" => {
11421                    f_first_data_row = val.parse().ok();
11422                }
11423                b"firstDataCol" => {
11424                    f_first_data_col = val.parse().ok();
11425                }
11426                b"rowPageCount" => {
11427                    f_row_page_count = val.parse().ok();
11428                }
11429                b"colPageCount" => {
11430                    f_col_page_count = val.parse().ok();
11431                }
11432                #[cfg(feature = "extra-attrs")]
11433                unknown => {
11434                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
11435                    extra_attrs.insert(key, val.into_owned());
11436                }
11437                #[cfg(not(feature = "extra-attrs"))]
11438                _ => {}
11439            }
11440        }
11441
11442        if !is_empty {
11443            let mut buf = Vec::new();
11444            loop {
11445                match reader.read_event_into(&mut buf)? {
11446                    Event::End(_) => break,
11447                    Event::Eof => break,
11448                    _ => {}
11449                }
11450                buf.clear();
11451            }
11452        }
11453
11454        Ok(Self {
11455            reference: f_reference
11456                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
11457            first_header_row: f_first_header_row
11458                .ok_or_else(|| ParseError::MissingAttribute("firstHeaderRow".to_string()))?,
11459            first_data_row: f_first_data_row
11460                .ok_or_else(|| ParseError::MissingAttribute("firstDataRow".to_string()))?,
11461            first_data_col: f_first_data_col
11462                .ok_or_else(|| ParseError::MissingAttribute("firstDataCol".to_string()))?,
11463            row_page_count: f_row_page_count,
11464            col_page_count: f_col_page_count,
11465            #[cfg(feature = "extra-attrs")]
11466            extra_attrs,
11467        })
11468    }
11469}
11470
11471impl FromXml for PivotFields {
11472    fn from_xml<R: BufRead>(
11473        reader: &mut Reader<R>,
11474        start_tag: &BytesStart,
11475        is_empty: bool,
11476    ) -> Result<Self, ParseError> {
11477        let mut f_count = None;
11478        let mut f_pivot_field = Vec::new();
11479        #[cfg(feature = "extra-attrs")]
11480        let mut extra_attrs = std::collections::HashMap::new();
11481        #[cfg(feature = "extra-children")]
11482        let mut extra_children = Vec::new();
11483        #[cfg(feature = "extra-children")]
11484        let mut child_idx: usize = 0;
11485
11486        // Parse attributes
11487        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
11488            let val = String::from_utf8_lossy(&attr.value);
11489            match attr.key.local_name().as_ref() {
11490                b"count" => {
11491                    f_count = val.parse().ok();
11492                }
11493                #[cfg(feature = "extra-attrs")]
11494                unknown => {
11495                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
11496                    extra_attrs.insert(key, val.into_owned());
11497                }
11498                #[cfg(not(feature = "extra-attrs"))]
11499                _ => {}
11500            }
11501        }
11502
11503        // Parse child elements
11504        if !is_empty {
11505            let mut buf = Vec::new();
11506            loop {
11507                match reader.read_event_into(&mut buf)? {
11508                    Event::Start(e) => {
11509                        match e.local_name().as_ref() {
11510                            b"pivotField" => {
11511                                f_pivot_field.push(PivotField::from_xml(reader, &e, false)?);
11512                                #[cfg(feature = "extra-children")]
11513                                {
11514                                    child_idx += 1;
11515                                }
11516                            }
11517                            #[cfg(feature = "extra-children")]
11518                            _ => {
11519                                // Capture unknown element for roundtrip
11520                                let elem = RawXmlElement::from_reader(reader, &e)?;
11521                                extra_children.push(PositionedNode::new(
11522                                    child_idx,
11523                                    RawXmlNode::Element(elem),
11524                                ));
11525                                child_idx += 1;
11526                            }
11527                            #[cfg(not(feature = "extra-children"))]
11528                            _ => {
11529                                // Skip unknown element
11530                                skip_element(reader)?;
11531                            }
11532                        }
11533                    }
11534                    Event::Empty(e) => {
11535                        match e.local_name().as_ref() {
11536                            b"pivotField" => {
11537                                f_pivot_field.push(PivotField::from_xml(reader, &e, true)?);
11538                                #[cfg(feature = "extra-children")]
11539                                {
11540                                    child_idx += 1;
11541                                }
11542                            }
11543                            #[cfg(feature = "extra-children")]
11544                            _ => {
11545                                // Capture unknown empty element for roundtrip
11546                                let elem = RawXmlElement::from_empty(&e);
11547                                extra_children.push(PositionedNode::new(
11548                                    child_idx,
11549                                    RawXmlNode::Element(elem),
11550                                ));
11551                                child_idx += 1;
11552                            }
11553                            #[cfg(not(feature = "extra-children"))]
11554                            _ => {}
11555                        }
11556                    }
11557                    Event::End(_) => break,
11558                    Event::Eof => break,
11559                    _ => {}
11560                }
11561                buf.clear();
11562            }
11563        }
11564
11565        Ok(Self {
11566            count: f_count,
11567            pivot_field: f_pivot_field,
11568            #[cfg(feature = "extra-attrs")]
11569            extra_attrs,
11570            #[cfg(feature = "extra-children")]
11571            extra_children,
11572        })
11573    }
11574}
11575
11576impl FromXml for PivotField {
11577    fn from_xml<R: BufRead>(
11578        reader: &mut Reader<R>,
11579        start_tag: &BytesStart,
11580        is_empty: bool,
11581    ) -> Result<Self, ParseError> {
11582        let mut f_name = None;
11583        let mut f_axis = None;
11584        let mut f_data_field = None;
11585        let mut f_subtotal_caption = None;
11586        let mut f_show_drop_downs = None;
11587        let mut f_hidden_level = None;
11588        let mut f_unique_member_property = None;
11589        let mut f_compact = None;
11590        let mut f_all_drilled = None;
11591        let mut f_number_format_id = None;
11592        let mut f_outline = None;
11593        let mut f_subtotal_top = None;
11594        let mut f_drag_to_row = None;
11595        let mut f_drag_to_col = None;
11596        let mut f_multiple_item_selection_allowed = None;
11597        let mut f_drag_to_page = None;
11598        let mut f_drag_to_data = None;
11599        let mut f_drag_off = None;
11600        let mut f_show_all = None;
11601        let mut f_insert_blank_row = None;
11602        let mut f_server_field = None;
11603        let mut f_insert_page_break = None;
11604        let mut f_auto_show = None;
11605        let mut f_top_auto_show = None;
11606        let mut f_hide_new_items = None;
11607        let mut f_measure_filter = None;
11608        let mut f_include_new_items_in_filter = None;
11609        let mut f_item_page_count = None;
11610        let mut f_sort_type = None;
11611        let mut f_data_source_sort = None;
11612        let mut f_non_auto_sort_default = None;
11613        let mut f_rank_by = None;
11614        let mut f_default_subtotal = None;
11615        let mut f_sum_subtotal = None;
11616        let mut f_count_a_subtotal = None;
11617        let mut f_avg_subtotal = None;
11618        let mut f_max_subtotal = None;
11619        let mut f_min_subtotal = None;
11620        let mut f_product_subtotal = None;
11621        let mut f_count_subtotal = None;
11622        let mut f_std_dev_subtotal = None;
11623        let mut f_std_dev_p_subtotal = None;
11624        let mut f_var_subtotal = None;
11625        let mut f_var_p_subtotal = None;
11626        let mut f_show_prop_cell = None;
11627        let mut f_show_prop_tip = None;
11628        let mut f_show_prop_as_caption = None;
11629        let mut f_default_attribute_drill_state = None;
11630        let mut f_items = None;
11631        let mut f_auto_sort_scope = None;
11632        let mut f_extension_list = None;
11633        #[cfg(feature = "extra-attrs")]
11634        let mut extra_attrs = std::collections::HashMap::new();
11635        #[cfg(feature = "extra-children")]
11636        let mut extra_children = Vec::new();
11637        #[cfg(feature = "extra-children")]
11638        let mut child_idx: usize = 0;
11639
11640        // Parse attributes
11641        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
11642            let val = String::from_utf8_lossy(&attr.value);
11643            match attr.key.local_name().as_ref() {
11644                b"name" => {
11645                    f_name = Some(val.into_owned());
11646                }
11647                b"axis" => {
11648                    f_axis = val.parse().ok();
11649                }
11650                b"dataField" => {
11651                    f_data_field = Some(val == "true" || val == "1");
11652                }
11653                b"subtotalCaption" => {
11654                    f_subtotal_caption = Some(val.into_owned());
11655                }
11656                b"showDropDowns" => {
11657                    f_show_drop_downs = Some(val == "true" || val == "1");
11658                }
11659                b"hiddenLevel" => {
11660                    f_hidden_level = Some(val == "true" || val == "1");
11661                }
11662                b"uniqueMemberProperty" => {
11663                    f_unique_member_property = Some(val.into_owned());
11664                }
11665                b"compact" => {
11666                    f_compact = Some(val == "true" || val == "1");
11667                }
11668                b"allDrilled" => {
11669                    f_all_drilled = Some(val == "true" || val == "1");
11670                }
11671                b"numFmtId" => {
11672                    f_number_format_id = val.parse().ok();
11673                }
11674                b"outline" => {
11675                    f_outline = Some(val == "true" || val == "1");
11676                }
11677                b"subtotalTop" => {
11678                    f_subtotal_top = Some(val == "true" || val == "1");
11679                }
11680                b"dragToRow" => {
11681                    f_drag_to_row = Some(val == "true" || val == "1");
11682                }
11683                b"dragToCol" => {
11684                    f_drag_to_col = Some(val == "true" || val == "1");
11685                }
11686                b"multipleItemSelectionAllowed" => {
11687                    f_multiple_item_selection_allowed = Some(val == "true" || val == "1");
11688                }
11689                b"dragToPage" => {
11690                    f_drag_to_page = Some(val == "true" || val == "1");
11691                }
11692                b"dragToData" => {
11693                    f_drag_to_data = Some(val == "true" || val == "1");
11694                }
11695                b"dragOff" => {
11696                    f_drag_off = Some(val == "true" || val == "1");
11697                }
11698                b"showAll" => {
11699                    f_show_all = Some(val == "true" || val == "1");
11700                }
11701                b"insertBlankRow" => {
11702                    f_insert_blank_row = Some(val == "true" || val == "1");
11703                }
11704                b"serverField" => {
11705                    f_server_field = Some(val == "true" || val == "1");
11706                }
11707                b"insertPageBreak" => {
11708                    f_insert_page_break = Some(val == "true" || val == "1");
11709                }
11710                b"autoShow" => {
11711                    f_auto_show = Some(val == "true" || val == "1");
11712                }
11713                b"topAutoShow" => {
11714                    f_top_auto_show = Some(val == "true" || val == "1");
11715                }
11716                b"hideNewItems" => {
11717                    f_hide_new_items = Some(val == "true" || val == "1");
11718                }
11719                b"measureFilter" => {
11720                    f_measure_filter = Some(val == "true" || val == "1");
11721                }
11722                b"includeNewItemsInFilter" => {
11723                    f_include_new_items_in_filter = Some(val == "true" || val == "1");
11724                }
11725                b"itemPageCount" => {
11726                    f_item_page_count = val.parse().ok();
11727                }
11728                b"sortType" => {
11729                    f_sort_type = val.parse().ok();
11730                }
11731                b"dataSourceSort" => {
11732                    f_data_source_sort = Some(val == "true" || val == "1");
11733                }
11734                b"nonAutoSortDefault" => {
11735                    f_non_auto_sort_default = Some(val == "true" || val == "1");
11736                }
11737                b"rankBy" => {
11738                    f_rank_by = val.parse().ok();
11739                }
11740                b"defaultSubtotal" => {
11741                    f_default_subtotal = Some(val == "true" || val == "1");
11742                }
11743                b"sumSubtotal" => {
11744                    f_sum_subtotal = Some(val == "true" || val == "1");
11745                }
11746                b"countASubtotal" => {
11747                    f_count_a_subtotal = Some(val == "true" || val == "1");
11748                }
11749                b"avgSubtotal" => {
11750                    f_avg_subtotal = Some(val == "true" || val == "1");
11751                }
11752                b"maxSubtotal" => {
11753                    f_max_subtotal = Some(val == "true" || val == "1");
11754                }
11755                b"minSubtotal" => {
11756                    f_min_subtotal = Some(val == "true" || val == "1");
11757                }
11758                b"productSubtotal" => {
11759                    f_product_subtotal = Some(val == "true" || val == "1");
11760                }
11761                b"countSubtotal" => {
11762                    f_count_subtotal = Some(val == "true" || val == "1");
11763                }
11764                b"stdDevSubtotal" => {
11765                    f_std_dev_subtotal = Some(val == "true" || val == "1");
11766                }
11767                b"stdDevPSubtotal" => {
11768                    f_std_dev_p_subtotal = Some(val == "true" || val == "1");
11769                }
11770                b"varSubtotal" => {
11771                    f_var_subtotal = Some(val == "true" || val == "1");
11772                }
11773                b"varPSubtotal" => {
11774                    f_var_p_subtotal = Some(val == "true" || val == "1");
11775                }
11776                b"showPropCell" => {
11777                    f_show_prop_cell = Some(val == "true" || val == "1");
11778                }
11779                b"showPropTip" => {
11780                    f_show_prop_tip = Some(val == "true" || val == "1");
11781                }
11782                b"showPropAsCaption" => {
11783                    f_show_prop_as_caption = Some(val == "true" || val == "1");
11784                }
11785                b"defaultAttributeDrillState" => {
11786                    f_default_attribute_drill_state = Some(val == "true" || val == "1");
11787                }
11788                #[cfg(feature = "extra-attrs")]
11789                unknown => {
11790                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
11791                    extra_attrs.insert(key, val.into_owned());
11792                }
11793                #[cfg(not(feature = "extra-attrs"))]
11794                _ => {}
11795            }
11796        }
11797
11798        // Parse child elements
11799        if !is_empty {
11800            let mut buf = Vec::new();
11801            loop {
11802                match reader.read_event_into(&mut buf)? {
11803                    Event::Start(e) => {
11804                        match e.local_name().as_ref() {
11805                            b"items" => {
11806                                f_items = Some(Box::new(PivotItems::from_xml(reader, &e, false)?));
11807                                #[cfg(feature = "extra-children")]
11808                                {
11809                                    child_idx += 1;
11810                                }
11811                            }
11812                            b"autoSortScope" => {
11813                                f_auto_sort_scope =
11814                                    Some(Box::new(PivotArea::from_xml(reader, &e, false)?));
11815                                #[cfg(feature = "extra-children")]
11816                                {
11817                                    child_idx += 1;
11818                                }
11819                            }
11820                            b"extLst" => {
11821                                f_extension_list =
11822                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
11823                                #[cfg(feature = "extra-children")]
11824                                {
11825                                    child_idx += 1;
11826                                }
11827                            }
11828                            #[cfg(feature = "extra-children")]
11829                            _ => {
11830                                // Capture unknown element for roundtrip
11831                                let elem = RawXmlElement::from_reader(reader, &e)?;
11832                                extra_children.push(PositionedNode::new(
11833                                    child_idx,
11834                                    RawXmlNode::Element(elem),
11835                                ));
11836                                child_idx += 1;
11837                            }
11838                            #[cfg(not(feature = "extra-children"))]
11839                            _ => {
11840                                // Skip unknown element
11841                                skip_element(reader)?;
11842                            }
11843                        }
11844                    }
11845                    Event::Empty(e) => {
11846                        match e.local_name().as_ref() {
11847                            b"items" => {
11848                                f_items = Some(Box::new(PivotItems::from_xml(reader, &e, true)?));
11849                                #[cfg(feature = "extra-children")]
11850                                {
11851                                    child_idx += 1;
11852                                }
11853                            }
11854                            b"autoSortScope" => {
11855                                f_auto_sort_scope =
11856                                    Some(Box::new(PivotArea::from_xml(reader, &e, true)?));
11857                                #[cfg(feature = "extra-children")]
11858                                {
11859                                    child_idx += 1;
11860                                }
11861                            }
11862                            b"extLst" => {
11863                                f_extension_list =
11864                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
11865                                #[cfg(feature = "extra-children")]
11866                                {
11867                                    child_idx += 1;
11868                                }
11869                            }
11870                            #[cfg(feature = "extra-children")]
11871                            _ => {
11872                                // Capture unknown empty element for roundtrip
11873                                let elem = RawXmlElement::from_empty(&e);
11874                                extra_children.push(PositionedNode::new(
11875                                    child_idx,
11876                                    RawXmlNode::Element(elem),
11877                                ));
11878                                child_idx += 1;
11879                            }
11880                            #[cfg(not(feature = "extra-children"))]
11881                            _ => {}
11882                        }
11883                    }
11884                    Event::End(_) => break,
11885                    Event::Eof => break,
11886                    _ => {}
11887                }
11888                buf.clear();
11889            }
11890        }
11891
11892        Ok(Self {
11893            name: f_name,
11894            axis: f_axis,
11895            data_field: f_data_field,
11896            subtotal_caption: f_subtotal_caption,
11897            show_drop_downs: f_show_drop_downs,
11898            hidden_level: f_hidden_level,
11899            unique_member_property: f_unique_member_property,
11900            compact: f_compact,
11901            all_drilled: f_all_drilled,
11902            number_format_id: f_number_format_id,
11903            outline: f_outline,
11904            subtotal_top: f_subtotal_top,
11905            drag_to_row: f_drag_to_row,
11906            drag_to_col: f_drag_to_col,
11907            multiple_item_selection_allowed: f_multiple_item_selection_allowed,
11908            drag_to_page: f_drag_to_page,
11909            drag_to_data: f_drag_to_data,
11910            drag_off: f_drag_off,
11911            show_all: f_show_all,
11912            insert_blank_row: f_insert_blank_row,
11913            server_field: f_server_field,
11914            insert_page_break: f_insert_page_break,
11915            auto_show: f_auto_show,
11916            top_auto_show: f_top_auto_show,
11917            hide_new_items: f_hide_new_items,
11918            measure_filter: f_measure_filter,
11919            include_new_items_in_filter: f_include_new_items_in_filter,
11920            item_page_count: f_item_page_count,
11921            sort_type: f_sort_type,
11922            data_source_sort: f_data_source_sort,
11923            non_auto_sort_default: f_non_auto_sort_default,
11924            rank_by: f_rank_by,
11925            default_subtotal: f_default_subtotal,
11926            sum_subtotal: f_sum_subtotal,
11927            count_a_subtotal: f_count_a_subtotal,
11928            avg_subtotal: f_avg_subtotal,
11929            max_subtotal: f_max_subtotal,
11930            min_subtotal: f_min_subtotal,
11931            product_subtotal: f_product_subtotal,
11932            count_subtotal: f_count_subtotal,
11933            std_dev_subtotal: f_std_dev_subtotal,
11934            std_dev_p_subtotal: f_std_dev_p_subtotal,
11935            var_subtotal: f_var_subtotal,
11936            var_p_subtotal: f_var_p_subtotal,
11937            show_prop_cell: f_show_prop_cell,
11938            show_prop_tip: f_show_prop_tip,
11939            show_prop_as_caption: f_show_prop_as_caption,
11940            default_attribute_drill_state: f_default_attribute_drill_state,
11941            items: f_items,
11942            auto_sort_scope: f_auto_sort_scope,
11943            extension_list: f_extension_list,
11944            #[cfg(feature = "extra-attrs")]
11945            extra_attrs,
11946            #[cfg(feature = "extra-children")]
11947            extra_children,
11948        })
11949    }
11950}
11951
11952impl FromXml for PivotItems {
11953    fn from_xml<R: BufRead>(
11954        reader: &mut Reader<R>,
11955        start_tag: &BytesStart,
11956        is_empty: bool,
11957    ) -> Result<Self, ParseError> {
11958        let mut f_count = None;
11959        let mut f_item = Vec::new();
11960        #[cfg(feature = "extra-attrs")]
11961        let mut extra_attrs = std::collections::HashMap::new();
11962        #[cfg(feature = "extra-children")]
11963        let mut extra_children = Vec::new();
11964        #[cfg(feature = "extra-children")]
11965        let mut child_idx: usize = 0;
11966
11967        // Parse attributes
11968        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
11969            let val = String::from_utf8_lossy(&attr.value);
11970            match attr.key.local_name().as_ref() {
11971                b"count" => {
11972                    f_count = val.parse().ok();
11973                }
11974                #[cfg(feature = "extra-attrs")]
11975                unknown => {
11976                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
11977                    extra_attrs.insert(key, val.into_owned());
11978                }
11979                #[cfg(not(feature = "extra-attrs"))]
11980                _ => {}
11981            }
11982        }
11983
11984        // Parse child elements
11985        if !is_empty {
11986            let mut buf = Vec::new();
11987            loop {
11988                match reader.read_event_into(&mut buf)? {
11989                    Event::Start(e) => {
11990                        match e.local_name().as_ref() {
11991                            b"item" => {
11992                                f_item.push(PivotItem::from_xml(reader, &e, false)?);
11993                                #[cfg(feature = "extra-children")]
11994                                {
11995                                    child_idx += 1;
11996                                }
11997                            }
11998                            #[cfg(feature = "extra-children")]
11999                            _ => {
12000                                // Capture unknown element for roundtrip
12001                                let elem = RawXmlElement::from_reader(reader, &e)?;
12002                                extra_children.push(PositionedNode::new(
12003                                    child_idx,
12004                                    RawXmlNode::Element(elem),
12005                                ));
12006                                child_idx += 1;
12007                            }
12008                            #[cfg(not(feature = "extra-children"))]
12009                            _ => {
12010                                // Skip unknown element
12011                                skip_element(reader)?;
12012                            }
12013                        }
12014                    }
12015                    Event::Empty(e) => {
12016                        match e.local_name().as_ref() {
12017                            b"item" => {
12018                                f_item.push(PivotItem::from_xml(reader, &e, true)?);
12019                                #[cfg(feature = "extra-children")]
12020                                {
12021                                    child_idx += 1;
12022                                }
12023                            }
12024                            #[cfg(feature = "extra-children")]
12025                            _ => {
12026                                // Capture unknown empty element for roundtrip
12027                                let elem = RawXmlElement::from_empty(&e);
12028                                extra_children.push(PositionedNode::new(
12029                                    child_idx,
12030                                    RawXmlNode::Element(elem),
12031                                ));
12032                                child_idx += 1;
12033                            }
12034                            #[cfg(not(feature = "extra-children"))]
12035                            _ => {}
12036                        }
12037                    }
12038                    Event::End(_) => break,
12039                    Event::Eof => break,
12040                    _ => {}
12041                }
12042                buf.clear();
12043            }
12044        }
12045
12046        Ok(Self {
12047            count: f_count,
12048            item: f_item,
12049            #[cfg(feature = "extra-attrs")]
12050            extra_attrs,
12051            #[cfg(feature = "extra-children")]
12052            extra_children,
12053        })
12054    }
12055}
12056
12057impl FromXml for PivotItem {
12058    fn from_xml<R: BufRead>(
12059        reader: &mut Reader<R>,
12060        start_tag: &BytesStart,
12061        is_empty: bool,
12062    ) -> Result<Self, ParseError> {
12063        let mut f_n = None;
12064        let mut f_cell_type = None;
12065        let mut f_height = None;
12066        let mut f_style_index = None;
12067        let mut f_sd = None;
12068        let mut f_formula = None;
12069        let mut f_m = None;
12070        let mut f_cells = None;
12071        let mut f_x = None;
12072        let mut f_d = None;
12073        let mut f_e = None;
12074        #[cfg(feature = "extra-attrs")]
12075        let mut extra_attrs = std::collections::HashMap::new();
12076
12077        // Parse attributes
12078        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12079            let val = String::from_utf8_lossy(&attr.value);
12080            match attr.key.local_name().as_ref() {
12081                b"n" => {
12082                    f_n = Some(val.into_owned());
12083                }
12084                b"t" => {
12085                    f_cell_type = val.parse().ok();
12086                }
12087                b"h" => {
12088                    f_height = Some(val == "true" || val == "1");
12089                }
12090                b"s" => {
12091                    f_style_index = Some(val == "true" || val == "1");
12092                }
12093                b"sd" => {
12094                    f_sd = Some(val == "true" || val == "1");
12095                }
12096                b"f" => {
12097                    f_formula = Some(val == "true" || val == "1");
12098                }
12099                b"m" => {
12100                    f_m = Some(val == "true" || val == "1");
12101                }
12102                b"c" => {
12103                    f_cells = Some(val == "true" || val == "1");
12104                }
12105                b"x" => {
12106                    f_x = val.parse().ok();
12107                }
12108                b"d" => {
12109                    f_d = Some(val == "true" || val == "1");
12110                }
12111                b"e" => {
12112                    f_e = Some(val == "true" || val == "1");
12113                }
12114                #[cfg(feature = "extra-attrs")]
12115                unknown => {
12116                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12117                    extra_attrs.insert(key, val.into_owned());
12118                }
12119                #[cfg(not(feature = "extra-attrs"))]
12120                _ => {}
12121            }
12122        }
12123
12124        if !is_empty {
12125            let mut buf = Vec::new();
12126            loop {
12127                match reader.read_event_into(&mut buf)? {
12128                    Event::End(_) => break,
12129                    Event::Eof => break,
12130                    _ => {}
12131                }
12132                buf.clear();
12133            }
12134        }
12135
12136        Ok(Self {
12137            n: f_n,
12138            cell_type: f_cell_type,
12139            height: f_height,
12140            style_index: f_style_index,
12141            sd: f_sd,
12142            formula: f_formula,
12143            m: f_m,
12144            cells: f_cells,
12145            x: f_x,
12146            d: f_d,
12147            e: f_e,
12148            #[cfg(feature = "extra-attrs")]
12149            extra_attrs,
12150        })
12151    }
12152}
12153
12154impl FromXml for PageFields {
12155    fn from_xml<R: BufRead>(
12156        reader: &mut Reader<R>,
12157        start_tag: &BytesStart,
12158        is_empty: bool,
12159    ) -> Result<Self, ParseError> {
12160        let mut f_count = None;
12161        let mut f_page_field = Vec::new();
12162        #[cfg(feature = "extra-attrs")]
12163        let mut extra_attrs = std::collections::HashMap::new();
12164        #[cfg(feature = "extra-children")]
12165        let mut extra_children = Vec::new();
12166        #[cfg(feature = "extra-children")]
12167        let mut child_idx: usize = 0;
12168
12169        // Parse attributes
12170        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12171            let val = String::from_utf8_lossy(&attr.value);
12172            match attr.key.local_name().as_ref() {
12173                b"count" => {
12174                    f_count = val.parse().ok();
12175                }
12176                #[cfg(feature = "extra-attrs")]
12177                unknown => {
12178                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12179                    extra_attrs.insert(key, val.into_owned());
12180                }
12181                #[cfg(not(feature = "extra-attrs"))]
12182                _ => {}
12183            }
12184        }
12185
12186        // Parse child elements
12187        if !is_empty {
12188            let mut buf = Vec::new();
12189            loop {
12190                match reader.read_event_into(&mut buf)? {
12191                    Event::Start(e) => {
12192                        match e.local_name().as_ref() {
12193                            b"pageField" => {
12194                                f_page_field.push(PageField::from_xml(reader, &e, false)?);
12195                                #[cfg(feature = "extra-children")]
12196                                {
12197                                    child_idx += 1;
12198                                }
12199                            }
12200                            #[cfg(feature = "extra-children")]
12201                            _ => {
12202                                // Capture unknown element for roundtrip
12203                                let elem = RawXmlElement::from_reader(reader, &e)?;
12204                                extra_children.push(PositionedNode::new(
12205                                    child_idx,
12206                                    RawXmlNode::Element(elem),
12207                                ));
12208                                child_idx += 1;
12209                            }
12210                            #[cfg(not(feature = "extra-children"))]
12211                            _ => {
12212                                // Skip unknown element
12213                                skip_element(reader)?;
12214                            }
12215                        }
12216                    }
12217                    Event::Empty(e) => {
12218                        match e.local_name().as_ref() {
12219                            b"pageField" => {
12220                                f_page_field.push(PageField::from_xml(reader, &e, true)?);
12221                                #[cfg(feature = "extra-children")]
12222                                {
12223                                    child_idx += 1;
12224                                }
12225                            }
12226                            #[cfg(feature = "extra-children")]
12227                            _ => {
12228                                // Capture unknown empty element for roundtrip
12229                                let elem = RawXmlElement::from_empty(&e);
12230                                extra_children.push(PositionedNode::new(
12231                                    child_idx,
12232                                    RawXmlNode::Element(elem),
12233                                ));
12234                                child_idx += 1;
12235                            }
12236                            #[cfg(not(feature = "extra-children"))]
12237                            _ => {}
12238                        }
12239                    }
12240                    Event::End(_) => break,
12241                    Event::Eof => break,
12242                    _ => {}
12243                }
12244                buf.clear();
12245            }
12246        }
12247
12248        Ok(Self {
12249            count: f_count,
12250            page_field: f_page_field,
12251            #[cfg(feature = "extra-attrs")]
12252            extra_attrs,
12253            #[cfg(feature = "extra-children")]
12254            extra_children,
12255        })
12256    }
12257}
12258
12259impl FromXml for PageField {
12260    fn from_xml<R: BufRead>(
12261        reader: &mut Reader<R>,
12262        start_tag: &BytesStart,
12263        is_empty: bool,
12264    ) -> Result<Self, ParseError> {
12265        let mut f_fld: Option<i32> = None;
12266        let mut f_item = None;
12267        let mut f_hier = None;
12268        let mut f_name = None;
12269        let mut f_cap = None;
12270        let mut f_extension_list = None;
12271        #[cfg(feature = "extra-attrs")]
12272        let mut extra_attrs = std::collections::HashMap::new();
12273        #[cfg(feature = "extra-children")]
12274        let mut extra_children = Vec::new();
12275        #[cfg(feature = "extra-children")]
12276        let mut child_idx: usize = 0;
12277
12278        // Parse attributes
12279        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12280            let val = String::from_utf8_lossy(&attr.value);
12281            match attr.key.local_name().as_ref() {
12282                b"fld" => {
12283                    f_fld = val.parse().ok();
12284                }
12285                b"item" => {
12286                    f_item = val.parse().ok();
12287                }
12288                b"hier" => {
12289                    f_hier = val.parse().ok();
12290                }
12291                b"name" => {
12292                    f_name = Some(val.into_owned());
12293                }
12294                b"cap" => {
12295                    f_cap = Some(val.into_owned());
12296                }
12297                #[cfg(feature = "extra-attrs")]
12298                unknown => {
12299                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12300                    extra_attrs.insert(key, val.into_owned());
12301                }
12302                #[cfg(not(feature = "extra-attrs"))]
12303                _ => {}
12304            }
12305        }
12306
12307        // Parse child elements
12308        if !is_empty {
12309            let mut buf = Vec::new();
12310            loop {
12311                match reader.read_event_into(&mut buf)? {
12312                    Event::Start(e) => {
12313                        match e.local_name().as_ref() {
12314                            b"extLst" => {
12315                                f_extension_list =
12316                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
12317                                #[cfg(feature = "extra-children")]
12318                                {
12319                                    child_idx += 1;
12320                                }
12321                            }
12322                            #[cfg(feature = "extra-children")]
12323                            _ => {
12324                                // Capture unknown element for roundtrip
12325                                let elem = RawXmlElement::from_reader(reader, &e)?;
12326                                extra_children.push(PositionedNode::new(
12327                                    child_idx,
12328                                    RawXmlNode::Element(elem),
12329                                ));
12330                                child_idx += 1;
12331                            }
12332                            #[cfg(not(feature = "extra-children"))]
12333                            _ => {
12334                                // Skip unknown element
12335                                skip_element(reader)?;
12336                            }
12337                        }
12338                    }
12339                    Event::Empty(e) => {
12340                        match e.local_name().as_ref() {
12341                            b"extLst" => {
12342                                f_extension_list =
12343                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
12344                                #[cfg(feature = "extra-children")]
12345                                {
12346                                    child_idx += 1;
12347                                }
12348                            }
12349                            #[cfg(feature = "extra-children")]
12350                            _ => {
12351                                // Capture unknown empty element for roundtrip
12352                                let elem = RawXmlElement::from_empty(&e);
12353                                extra_children.push(PositionedNode::new(
12354                                    child_idx,
12355                                    RawXmlNode::Element(elem),
12356                                ));
12357                                child_idx += 1;
12358                            }
12359                            #[cfg(not(feature = "extra-children"))]
12360                            _ => {}
12361                        }
12362                    }
12363                    Event::End(_) => break,
12364                    Event::Eof => break,
12365                    _ => {}
12366                }
12367                buf.clear();
12368            }
12369        }
12370
12371        Ok(Self {
12372            fld: f_fld.ok_or_else(|| ParseError::MissingAttribute("fld".to_string()))?,
12373            item: f_item,
12374            hier: f_hier,
12375            name: f_name,
12376            cap: f_cap,
12377            extension_list: f_extension_list,
12378            #[cfg(feature = "extra-attrs")]
12379            extra_attrs,
12380            #[cfg(feature = "extra-children")]
12381            extra_children,
12382        })
12383    }
12384}
12385
12386impl FromXml for DataFields {
12387    fn from_xml<R: BufRead>(
12388        reader: &mut Reader<R>,
12389        start_tag: &BytesStart,
12390        is_empty: bool,
12391    ) -> Result<Self, ParseError> {
12392        let mut f_count = None;
12393        let mut f_data_field = Vec::new();
12394        #[cfg(feature = "extra-attrs")]
12395        let mut extra_attrs = std::collections::HashMap::new();
12396        #[cfg(feature = "extra-children")]
12397        let mut extra_children = Vec::new();
12398        #[cfg(feature = "extra-children")]
12399        let mut child_idx: usize = 0;
12400
12401        // Parse attributes
12402        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12403            let val = String::from_utf8_lossy(&attr.value);
12404            match attr.key.local_name().as_ref() {
12405                b"count" => {
12406                    f_count = val.parse().ok();
12407                }
12408                #[cfg(feature = "extra-attrs")]
12409                unknown => {
12410                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12411                    extra_attrs.insert(key, val.into_owned());
12412                }
12413                #[cfg(not(feature = "extra-attrs"))]
12414                _ => {}
12415            }
12416        }
12417
12418        // Parse child elements
12419        if !is_empty {
12420            let mut buf = Vec::new();
12421            loop {
12422                match reader.read_event_into(&mut buf)? {
12423                    Event::Start(e) => {
12424                        match e.local_name().as_ref() {
12425                            b"dataField" => {
12426                                f_data_field.push(DataField::from_xml(reader, &e, false)?);
12427                                #[cfg(feature = "extra-children")]
12428                                {
12429                                    child_idx += 1;
12430                                }
12431                            }
12432                            #[cfg(feature = "extra-children")]
12433                            _ => {
12434                                // Capture unknown element for roundtrip
12435                                let elem = RawXmlElement::from_reader(reader, &e)?;
12436                                extra_children.push(PositionedNode::new(
12437                                    child_idx,
12438                                    RawXmlNode::Element(elem),
12439                                ));
12440                                child_idx += 1;
12441                            }
12442                            #[cfg(not(feature = "extra-children"))]
12443                            _ => {
12444                                // Skip unknown element
12445                                skip_element(reader)?;
12446                            }
12447                        }
12448                    }
12449                    Event::Empty(e) => {
12450                        match e.local_name().as_ref() {
12451                            b"dataField" => {
12452                                f_data_field.push(DataField::from_xml(reader, &e, true)?);
12453                                #[cfg(feature = "extra-children")]
12454                                {
12455                                    child_idx += 1;
12456                                }
12457                            }
12458                            #[cfg(feature = "extra-children")]
12459                            _ => {
12460                                // Capture unknown empty element for roundtrip
12461                                let elem = RawXmlElement::from_empty(&e);
12462                                extra_children.push(PositionedNode::new(
12463                                    child_idx,
12464                                    RawXmlNode::Element(elem),
12465                                ));
12466                                child_idx += 1;
12467                            }
12468                            #[cfg(not(feature = "extra-children"))]
12469                            _ => {}
12470                        }
12471                    }
12472                    Event::End(_) => break,
12473                    Event::Eof => break,
12474                    _ => {}
12475                }
12476                buf.clear();
12477            }
12478        }
12479
12480        Ok(Self {
12481            count: f_count,
12482            data_field: f_data_field,
12483            #[cfg(feature = "extra-attrs")]
12484            extra_attrs,
12485            #[cfg(feature = "extra-children")]
12486            extra_children,
12487        })
12488    }
12489}
12490
12491impl FromXml for DataField {
12492    fn from_xml<R: BufRead>(
12493        reader: &mut Reader<R>,
12494        start_tag: &BytesStart,
12495        is_empty: bool,
12496    ) -> Result<Self, ParseError> {
12497        let mut f_name = None;
12498        let mut f_fld: Option<u32> = None;
12499        let mut f_subtotal = None;
12500        let mut f_show_data_as = None;
12501        let mut f_base_field = None;
12502        let mut f_base_item = None;
12503        let mut f_number_format_id = None;
12504        let mut f_extension_list = None;
12505        #[cfg(feature = "extra-attrs")]
12506        let mut extra_attrs = std::collections::HashMap::new();
12507        #[cfg(feature = "extra-children")]
12508        let mut extra_children = Vec::new();
12509        #[cfg(feature = "extra-children")]
12510        let mut child_idx: usize = 0;
12511
12512        // Parse attributes
12513        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12514            let val = String::from_utf8_lossy(&attr.value);
12515            match attr.key.local_name().as_ref() {
12516                b"name" => {
12517                    f_name = Some(val.into_owned());
12518                }
12519                b"fld" => {
12520                    f_fld = val.parse().ok();
12521                }
12522                b"subtotal" => {
12523                    f_subtotal = val.parse().ok();
12524                }
12525                b"showDataAs" => {
12526                    f_show_data_as = val.parse().ok();
12527                }
12528                b"baseField" => {
12529                    f_base_field = val.parse().ok();
12530                }
12531                b"baseItem" => {
12532                    f_base_item = val.parse().ok();
12533                }
12534                b"numFmtId" => {
12535                    f_number_format_id = val.parse().ok();
12536                }
12537                #[cfg(feature = "extra-attrs")]
12538                unknown => {
12539                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12540                    extra_attrs.insert(key, val.into_owned());
12541                }
12542                #[cfg(not(feature = "extra-attrs"))]
12543                _ => {}
12544            }
12545        }
12546
12547        // Parse child elements
12548        if !is_empty {
12549            let mut buf = Vec::new();
12550            loop {
12551                match reader.read_event_into(&mut buf)? {
12552                    Event::Start(e) => {
12553                        match e.local_name().as_ref() {
12554                            b"extLst" => {
12555                                f_extension_list =
12556                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
12557                                #[cfg(feature = "extra-children")]
12558                                {
12559                                    child_idx += 1;
12560                                }
12561                            }
12562                            #[cfg(feature = "extra-children")]
12563                            _ => {
12564                                // Capture unknown element for roundtrip
12565                                let elem = RawXmlElement::from_reader(reader, &e)?;
12566                                extra_children.push(PositionedNode::new(
12567                                    child_idx,
12568                                    RawXmlNode::Element(elem),
12569                                ));
12570                                child_idx += 1;
12571                            }
12572                            #[cfg(not(feature = "extra-children"))]
12573                            _ => {
12574                                // Skip unknown element
12575                                skip_element(reader)?;
12576                            }
12577                        }
12578                    }
12579                    Event::Empty(e) => {
12580                        match e.local_name().as_ref() {
12581                            b"extLst" => {
12582                                f_extension_list =
12583                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
12584                                #[cfg(feature = "extra-children")]
12585                                {
12586                                    child_idx += 1;
12587                                }
12588                            }
12589                            #[cfg(feature = "extra-children")]
12590                            _ => {
12591                                // Capture unknown empty element for roundtrip
12592                                let elem = RawXmlElement::from_empty(&e);
12593                                extra_children.push(PositionedNode::new(
12594                                    child_idx,
12595                                    RawXmlNode::Element(elem),
12596                                ));
12597                                child_idx += 1;
12598                            }
12599                            #[cfg(not(feature = "extra-children"))]
12600                            _ => {}
12601                        }
12602                    }
12603                    Event::End(_) => break,
12604                    Event::Eof => break,
12605                    _ => {}
12606                }
12607                buf.clear();
12608            }
12609        }
12610
12611        Ok(Self {
12612            name: f_name,
12613            fld: f_fld.ok_or_else(|| ParseError::MissingAttribute("fld".to_string()))?,
12614            subtotal: f_subtotal,
12615            show_data_as: f_show_data_as,
12616            base_field: f_base_field,
12617            base_item: f_base_item,
12618            number_format_id: f_number_format_id,
12619            extension_list: f_extension_list,
12620            #[cfg(feature = "extra-attrs")]
12621            extra_attrs,
12622            #[cfg(feature = "extra-children")]
12623            extra_children,
12624        })
12625    }
12626}
12627
12628impl FromXml for CTRowItems {
12629    fn from_xml<R: BufRead>(
12630        reader: &mut Reader<R>,
12631        start_tag: &BytesStart,
12632        is_empty: bool,
12633    ) -> Result<Self, ParseError> {
12634        let mut f_count = None;
12635        let mut f_i = Vec::new();
12636        #[cfg(feature = "extra-attrs")]
12637        let mut extra_attrs = std::collections::HashMap::new();
12638        #[cfg(feature = "extra-children")]
12639        let mut extra_children = Vec::new();
12640        #[cfg(feature = "extra-children")]
12641        let mut child_idx: usize = 0;
12642
12643        // Parse attributes
12644        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12645            let val = String::from_utf8_lossy(&attr.value);
12646            match attr.key.local_name().as_ref() {
12647                b"count" => {
12648                    f_count = val.parse().ok();
12649                }
12650                #[cfg(feature = "extra-attrs")]
12651                unknown => {
12652                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12653                    extra_attrs.insert(key, val.into_owned());
12654                }
12655                #[cfg(not(feature = "extra-attrs"))]
12656                _ => {}
12657            }
12658        }
12659
12660        // Parse child elements
12661        if !is_empty {
12662            let mut buf = Vec::new();
12663            loop {
12664                match reader.read_event_into(&mut buf)? {
12665                    Event::Start(e) => {
12666                        match e.local_name().as_ref() {
12667                            b"i" => {
12668                                f_i.push(CTI::from_xml(reader, &e, false)?);
12669                                #[cfg(feature = "extra-children")]
12670                                {
12671                                    child_idx += 1;
12672                                }
12673                            }
12674                            #[cfg(feature = "extra-children")]
12675                            _ => {
12676                                // Capture unknown element for roundtrip
12677                                let elem = RawXmlElement::from_reader(reader, &e)?;
12678                                extra_children.push(PositionedNode::new(
12679                                    child_idx,
12680                                    RawXmlNode::Element(elem),
12681                                ));
12682                                child_idx += 1;
12683                            }
12684                            #[cfg(not(feature = "extra-children"))]
12685                            _ => {
12686                                // Skip unknown element
12687                                skip_element(reader)?;
12688                            }
12689                        }
12690                    }
12691                    Event::Empty(e) => {
12692                        match e.local_name().as_ref() {
12693                            b"i" => {
12694                                f_i.push(CTI::from_xml(reader, &e, true)?);
12695                                #[cfg(feature = "extra-children")]
12696                                {
12697                                    child_idx += 1;
12698                                }
12699                            }
12700                            #[cfg(feature = "extra-children")]
12701                            _ => {
12702                                // Capture unknown empty element for roundtrip
12703                                let elem = RawXmlElement::from_empty(&e);
12704                                extra_children.push(PositionedNode::new(
12705                                    child_idx,
12706                                    RawXmlNode::Element(elem),
12707                                ));
12708                                child_idx += 1;
12709                            }
12710                            #[cfg(not(feature = "extra-children"))]
12711                            _ => {}
12712                        }
12713                    }
12714                    Event::End(_) => break,
12715                    Event::Eof => break,
12716                    _ => {}
12717                }
12718                buf.clear();
12719            }
12720        }
12721
12722        Ok(Self {
12723            count: f_count,
12724            i: f_i,
12725            #[cfg(feature = "extra-attrs")]
12726            extra_attrs,
12727            #[cfg(feature = "extra-children")]
12728            extra_children,
12729        })
12730    }
12731}
12732
12733impl FromXml for CTColItems {
12734    fn from_xml<R: BufRead>(
12735        reader: &mut Reader<R>,
12736        start_tag: &BytesStart,
12737        is_empty: bool,
12738    ) -> Result<Self, ParseError> {
12739        let mut f_count = None;
12740        let mut f_i = Vec::new();
12741        #[cfg(feature = "extra-attrs")]
12742        let mut extra_attrs = std::collections::HashMap::new();
12743        #[cfg(feature = "extra-children")]
12744        let mut extra_children = Vec::new();
12745        #[cfg(feature = "extra-children")]
12746        let mut child_idx: usize = 0;
12747
12748        // Parse attributes
12749        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12750            let val = String::from_utf8_lossy(&attr.value);
12751            match attr.key.local_name().as_ref() {
12752                b"count" => {
12753                    f_count = val.parse().ok();
12754                }
12755                #[cfg(feature = "extra-attrs")]
12756                unknown => {
12757                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12758                    extra_attrs.insert(key, val.into_owned());
12759                }
12760                #[cfg(not(feature = "extra-attrs"))]
12761                _ => {}
12762            }
12763        }
12764
12765        // Parse child elements
12766        if !is_empty {
12767            let mut buf = Vec::new();
12768            loop {
12769                match reader.read_event_into(&mut buf)? {
12770                    Event::Start(e) => {
12771                        match e.local_name().as_ref() {
12772                            b"i" => {
12773                                f_i.push(CTI::from_xml(reader, &e, false)?);
12774                                #[cfg(feature = "extra-children")]
12775                                {
12776                                    child_idx += 1;
12777                                }
12778                            }
12779                            #[cfg(feature = "extra-children")]
12780                            _ => {
12781                                // Capture unknown element for roundtrip
12782                                let elem = RawXmlElement::from_reader(reader, &e)?;
12783                                extra_children.push(PositionedNode::new(
12784                                    child_idx,
12785                                    RawXmlNode::Element(elem),
12786                                ));
12787                                child_idx += 1;
12788                            }
12789                            #[cfg(not(feature = "extra-children"))]
12790                            _ => {
12791                                // Skip unknown element
12792                                skip_element(reader)?;
12793                            }
12794                        }
12795                    }
12796                    Event::Empty(e) => {
12797                        match e.local_name().as_ref() {
12798                            b"i" => {
12799                                f_i.push(CTI::from_xml(reader, &e, true)?);
12800                                #[cfg(feature = "extra-children")]
12801                                {
12802                                    child_idx += 1;
12803                                }
12804                            }
12805                            #[cfg(feature = "extra-children")]
12806                            _ => {
12807                                // Capture unknown empty element for roundtrip
12808                                let elem = RawXmlElement::from_empty(&e);
12809                                extra_children.push(PositionedNode::new(
12810                                    child_idx,
12811                                    RawXmlNode::Element(elem),
12812                                ));
12813                                child_idx += 1;
12814                            }
12815                            #[cfg(not(feature = "extra-children"))]
12816                            _ => {}
12817                        }
12818                    }
12819                    Event::End(_) => break,
12820                    Event::Eof => break,
12821                    _ => {}
12822                }
12823                buf.clear();
12824            }
12825        }
12826
12827        Ok(Self {
12828            count: f_count,
12829            i: f_i,
12830            #[cfg(feature = "extra-attrs")]
12831            extra_attrs,
12832            #[cfg(feature = "extra-children")]
12833            extra_children,
12834        })
12835    }
12836}
12837
12838impl FromXml for CTI {
12839    fn from_xml<R: BufRead>(
12840        reader: &mut Reader<R>,
12841        start_tag: &BytesStart,
12842        is_empty: bool,
12843    ) -> Result<Self, ParseError> {
12844        let mut f_cell_type = None;
12845        let mut f_reference = None;
12846        let mut f_i = None;
12847        let mut f_x = Vec::new();
12848        #[cfg(feature = "extra-attrs")]
12849        let mut extra_attrs = std::collections::HashMap::new();
12850        #[cfg(feature = "extra-children")]
12851        let mut extra_children = Vec::new();
12852        #[cfg(feature = "extra-children")]
12853        let mut child_idx: usize = 0;
12854
12855        // Parse attributes
12856        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12857            let val = String::from_utf8_lossy(&attr.value);
12858            match attr.key.local_name().as_ref() {
12859                b"t" => {
12860                    f_cell_type = val.parse().ok();
12861                }
12862                b"r" => {
12863                    f_reference = val.parse().ok();
12864                }
12865                b"i" => {
12866                    f_i = val.parse().ok();
12867                }
12868                #[cfg(feature = "extra-attrs")]
12869                unknown => {
12870                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12871                    extra_attrs.insert(key, val.into_owned());
12872                }
12873                #[cfg(not(feature = "extra-attrs"))]
12874                _ => {}
12875            }
12876        }
12877
12878        // Parse child elements
12879        if !is_empty {
12880            let mut buf = Vec::new();
12881            loop {
12882                match reader.read_event_into(&mut buf)? {
12883                    Event::Start(e) => {
12884                        match e.local_name().as_ref() {
12885                            b"x" => {
12886                                f_x.push(CTX::from_xml(reader, &e, false)?);
12887                                #[cfg(feature = "extra-children")]
12888                                {
12889                                    child_idx += 1;
12890                                }
12891                            }
12892                            #[cfg(feature = "extra-children")]
12893                            _ => {
12894                                // Capture unknown element for roundtrip
12895                                let elem = RawXmlElement::from_reader(reader, &e)?;
12896                                extra_children.push(PositionedNode::new(
12897                                    child_idx,
12898                                    RawXmlNode::Element(elem),
12899                                ));
12900                                child_idx += 1;
12901                            }
12902                            #[cfg(not(feature = "extra-children"))]
12903                            _ => {
12904                                // Skip unknown element
12905                                skip_element(reader)?;
12906                            }
12907                        }
12908                    }
12909                    Event::Empty(e) => {
12910                        match e.local_name().as_ref() {
12911                            b"x" => {
12912                                f_x.push(CTX::from_xml(reader, &e, true)?);
12913                                #[cfg(feature = "extra-children")]
12914                                {
12915                                    child_idx += 1;
12916                                }
12917                            }
12918                            #[cfg(feature = "extra-children")]
12919                            _ => {
12920                                // Capture unknown empty element for roundtrip
12921                                let elem = RawXmlElement::from_empty(&e);
12922                                extra_children.push(PositionedNode::new(
12923                                    child_idx,
12924                                    RawXmlNode::Element(elem),
12925                                ));
12926                                child_idx += 1;
12927                            }
12928                            #[cfg(not(feature = "extra-children"))]
12929                            _ => {}
12930                        }
12931                    }
12932                    Event::End(_) => break,
12933                    Event::Eof => break,
12934                    _ => {}
12935                }
12936                buf.clear();
12937            }
12938        }
12939
12940        Ok(Self {
12941            cell_type: f_cell_type,
12942            reference: f_reference,
12943            i: f_i,
12944            x: f_x,
12945            #[cfg(feature = "extra-attrs")]
12946            extra_attrs,
12947            #[cfg(feature = "extra-children")]
12948            extra_children,
12949        })
12950    }
12951}
12952
12953impl FromXml for CTX {
12954    fn from_xml<R: BufRead>(
12955        reader: &mut Reader<R>,
12956        start_tag: &BytesStart,
12957        is_empty: bool,
12958    ) -> Result<Self, ParseError> {
12959        let mut f_value = None;
12960        #[cfg(feature = "extra-attrs")]
12961        let mut extra_attrs = std::collections::HashMap::new();
12962
12963        // Parse attributes
12964        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
12965            let val = String::from_utf8_lossy(&attr.value);
12966            match attr.key.local_name().as_ref() {
12967                b"v" => {
12968                    f_value = val.parse().ok();
12969                }
12970                #[cfg(feature = "extra-attrs")]
12971                unknown => {
12972                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
12973                    extra_attrs.insert(key, val.into_owned());
12974                }
12975                #[cfg(not(feature = "extra-attrs"))]
12976                _ => {}
12977            }
12978        }
12979
12980        if !is_empty {
12981            let mut buf = Vec::new();
12982            loop {
12983                match reader.read_event_into(&mut buf)? {
12984                    Event::End(_) => break,
12985                    Event::Eof => break,
12986                    _ => {}
12987                }
12988                buf.clear();
12989            }
12990        }
12991
12992        Ok(Self {
12993            value: f_value,
12994            #[cfg(feature = "extra-attrs")]
12995            extra_attrs,
12996        })
12997    }
12998}
12999
13000impl FromXml for RowFields {
13001    fn from_xml<R: BufRead>(
13002        reader: &mut Reader<R>,
13003        start_tag: &BytesStart,
13004        is_empty: bool,
13005    ) -> Result<Self, ParseError> {
13006        let mut f_count = None;
13007        let mut f_field = Vec::new();
13008        #[cfg(feature = "extra-attrs")]
13009        let mut extra_attrs = std::collections::HashMap::new();
13010        #[cfg(feature = "extra-children")]
13011        let mut extra_children = Vec::new();
13012        #[cfg(feature = "extra-children")]
13013        let mut child_idx: usize = 0;
13014
13015        // Parse attributes
13016        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13017            let val = String::from_utf8_lossy(&attr.value);
13018            match attr.key.local_name().as_ref() {
13019                b"count" => {
13020                    f_count = val.parse().ok();
13021                }
13022                #[cfg(feature = "extra-attrs")]
13023                unknown => {
13024                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13025                    extra_attrs.insert(key, val.into_owned());
13026                }
13027                #[cfg(not(feature = "extra-attrs"))]
13028                _ => {}
13029            }
13030        }
13031
13032        // Parse child elements
13033        if !is_empty {
13034            let mut buf = Vec::new();
13035            loop {
13036                match reader.read_event_into(&mut buf)? {
13037                    Event::Start(e) => {
13038                        match e.local_name().as_ref() {
13039                            b"field" => {
13040                                f_field.push(CTField::from_xml(reader, &e, false)?);
13041                                #[cfg(feature = "extra-children")]
13042                                {
13043                                    child_idx += 1;
13044                                }
13045                            }
13046                            #[cfg(feature = "extra-children")]
13047                            _ => {
13048                                // Capture unknown element for roundtrip
13049                                let elem = RawXmlElement::from_reader(reader, &e)?;
13050                                extra_children.push(PositionedNode::new(
13051                                    child_idx,
13052                                    RawXmlNode::Element(elem),
13053                                ));
13054                                child_idx += 1;
13055                            }
13056                            #[cfg(not(feature = "extra-children"))]
13057                            _ => {
13058                                // Skip unknown element
13059                                skip_element(reader)?;
13060                            }
13061                        }
13062                    }
13063                    Event::Empty(e) => {
13064                        match e.local_name().as_ref() {
13065                            b"field" => {
13066                                f_field.push(CTField::from_xml(reader, &e, true)?);
13067                                #[cfg(feature = "extra-children")]
13068                                {
13069                                    child_idx += 1;
13070                                }
13071                            }
13072                            #[cfg(feature = "extra-children")]
13073                            _ => {
13074                                // Capture unknown empty element for roundtrip
13075                                let elem = RawXmlElement::from_empty(&e);
13076                                extra_children.push(PositionedNode::new(
13077                                    child_idx,
13078                                    RawXmlNode::Element(elem),
13079                                ));
13080                                child_idx += 1;
13081                            }
13082                            #[cfg(not(feature = "extra-children"))]
13083                            _ => {}
13084                        }
13085                    }
13086                    Event::End(_) => break,
13087                    Event::Eof => break,
13088                    _ => {}
13089                }
13090                buf.clear();
13091            }
13092        }
13093
13094        Ok(Self {
13095            count: f_count,
13096            field: f_field,
13097            #[cfg(feature = "extra-attrs")]
13098            extra_attrs,
13099            #[cfg(feature = "extra-children")]
13100            extra_children,
13101        })
13102    }
13103}
13104
13105impl FromXml for ColFields {
13106    fn from_xml<R: BufRead>(
13107        reader: &mut Reader<R>,
13108        start_tag: &BytesStart,
13109        is_empty: bool,
13110    ) -> Result<Self, ParseError> {
13111        let mut f_count = None;
13112        let mut f_field = Vec::new();
13113        #[cfg(feature = "extra-attrs")]
13114        let mut extra_attrs = std::collections::HashMap::new();
13115        #[cfg(feature = "extra-children")]
13116        let mut extra_children = Vec::new();
13117        #[cfg(feature = "extra-children")]
13118        let mut child_idx: usize = 0;
13119
13120        // Parse attributes
13121        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13122            let val = String::from_utf8_lossy(&attr.value);
13123            match attr.key.local_name().as_ref() {
13124                b"count" => {
13125                    f_count = val.parse().ok();
13126                }
13127                #[cfg(feature = "extra-attrs")]
13128                unknown => {
13129                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13130                    extra_attrs.insert(key, val.into_owned());
13131                }
13132                #[cfg(not(feature = "extra-attrs"))]
13133                _ => {}
13134            }
13135        }
13136
13137        // Parse child elements
13138        if !is_empty {
13139            let mut buf = Vec::new();
13140            loop {
13141                match reader.read_event_into(&mut buf)? {
13142                    Event::Start(e) => {
13143                        match e.local_name().as_ref() {
13144                            b"field" => {
13145                                f_field.push(CTField::from_xml(reader, &e, false)?);
13146                                #[cfg(feature = "extra-children")]
13147                                {
13148                                    child_idx += 1;
13149                                }
13150                            }
13151                            #[cfg(feature = "extra-children")]
13152                            _ => {
13153                                // Capture unknown element for roundtrip
13154                                let elem = RawXmlElement::from_reader(reader, &e)?;
13155                                extra_children.push(PositionedNode::new(
13156                                    child_idx,
13157                                    RawXmlNode::Element(elem),
13158                                ));
13159                                child_idx += 1;
13160                            }
13161                            #[cfg(not(feature = "extra-children"))]
13162                            _ => {
13163                                // Skip unknown element
13164                                skip_element(reader)?;
13165                            }
13166                        }
13167                    }
13168                    Event::Empty(e) => {
13169                        match e.local_name().as_ref() {
13170                            b"field" => {
13171                                f_field.push(CTField::from_xml(reader, &e, true)?);
13172                                #[cfg(feature = "extra-children")]
13173                                {
13174                                    child_idx += 1;
13175                                }
13176                            }
13177                            #[cfg(feature = "extra-children")]
13178                            _ => {
13179                                // Capture unknown empty element for roundtrip
13180                                let elem = RawXmlElement::from_empty(&e);
13181                                extra_children.push(PositionedNode::new(
13182                                    child_idx,
13183                                    RawXmlNode::Element(elem),
13184                                ));
13185                                child_idx += 1;
13186                            }
13187                            #[cfg(not(feature = "extra-children"))]
13188                            _ => {}
13189                        }
13190                    }
13191                    Event::End(_) => break,
13192                    Event::Eof => break,
13193                    _ => {}
13194                }
13195                buf.clear();
13196            }
13197        }
13198
13199        Ok(Self {
13200            count: f_count,
13201            field: f_field,
13202            #[cfg(feature = "extra-attrs")]
13203            extra_attrs,
13204            #[cfg(feature = "extra-children")]
13205            extra_children,
13206        })
13207    }
13208}
13209
13210impl FromXml for CTField {
13211    fn from_xml<R: BufRead>(
13212        reader: &mut Reader<R>,
13213        start_tag: &BytesStart,
13214        is_empty: bool,
13215    ) -> Result<Self, ParseError> {
13216        let mut f_x: Option<i32> = None;
13217        #[cfg(feature = "extra-attrs")]
13218        let mut extra_attrs = std::collections::HashMap::new();
13219
13220        // Parse attributes
13221        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13222            let val = String::from_utf8_lossy(&attr.value);
13223            match attr.key.local_name().as_ref() {
13224                b"x" => {
13225                    f_x = val.parse().ok();
13226                }
13227                #[cfg(feature = "extra-attrs")]
13228                unknown => {
13229                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13230                    extra_attrs.insert(key, val.into_owned());
13231                }
13232                #[cfg(not(feature = "extra-attrs"))]
13233                _ => {}
13234            }
13235        }
13236
13237        if !is_empty {
13238            let mut buf = Vec::new();
13239            loop {
13240                match reader.read_event_into(&mut buf)? {
13241                    Event::End(_) => break,
13242                    Event::Eof => break,
13243                    _ => {}
13244                }
13245                buf.clear();
13246            }
13247        }
13248
13249        Ok(Self {
13250            x: f_x.ok_or_else(|| ParseError::MissingAttribute("x".to_string()))?,
13251            #[cfg(feature = "extra-attrs")]
13252            extra_attrs,
13253        })
13254    }
13255}
13256
13257impl FromXml for CTFormats {
13258    fn from_xml<R: BufRead>(
13259        reader: &mut Reader<R>,
13260        start_tag: &BytesStart,
13261        is_empty: bool,
13262    ) -> Result<Self, ParseError> {
13263        let mut f_count = None;
13264        let mut f_format = Vec::new();
13265        #[cfg(feature = "extra-attrs")]
13266        let mut extra_attrs = std::collections::HashMap::new();
13267        #[cfg(feature = "extra-children")]
13268        let mut extra_children = Vec::new();
13269        #[cfg(feature = "extra-children")]
13270        let mut child_idx: usize = 0;
13271
13272        // Parse attributes
13273        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13274            let val = String::from_utf8_lossy(&attr.value);
13275            match attr.key.local_name().as_ref() {
13276                b"count" => {
13277                    f_count = val.parse().ok();
13278                }
13279                #[cfg(feature = "extra-attrs")]
13280                unknown => {
13281                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13282                    extra_attrs.insert(key, val.into_owned());
13283                }
13284                #[cfg(not(feature = "extra-attrs"))]
13285                _ => {}
13286            }
13287        }
13288
13289        // Parse child elements
13290        if !is_empty {
13291            let mut buf = Vec::new();
13292            loop {
13293                match reader.read_event_into(&mut buf)? {
13294                    Event::Start(e) => {
13295                        match e.local_name().as_ref() {
13296                            b"format" => {
13297                                f_format.push(CTFormat::from_xml(reader, &e, false)?);
13298                                #[cfg(feature = "extra-children")]
13299                                {
13300                                    child_idx += 1;
13301                                }
13302                            }
13303                            #[cfg(feature = "extra-children")]
13304                            _ => {
13305                                // Capture unknown element for roundtrip
13306                                let elem = RawXmlElement::from_reader(reader, &e)?;
13307                                extra_children.push(PositionedNode::new(
13308                                    child_idx,
13309                                    RawXmlNode::Element(elem),
13310                                ));
13311                                child_idx += 1;
13312                            }
13313                            #[cfg(not(feature = "extra-children"))]
13314                            _ => {
13315                                // Skip unknown element
13316                                skip_element(reader)?;
13317                            }
13318                        }
13319                    }
13320                    Event::Empty(e) => {
13321                        match e.local_name().as_ref() {
13322                            b"format" => {
13323                                f_format.push(CTFormat::from_xml(reader, &e, true)?);
13324                                #[cfg(feature = "extra-children")]
13325                                {
13326                                    child_idx += 1;
13327                                }
13328                            }
13329                            #[cfg(feature = "extra-children")]
13330                            _ => {
13331                                // Capture unknown empty element for roundtrip
13332                                let elem = RawXmlElement::from_empty(&e);
13333                                extra_children.push(PositionedNode::new(
13334                                    child_idx,
13335                                    RawXmlNode::Element(elem),
13336                                ));
13337                                child_idx += 1;
13338                            }
13339                            #[cfg(not(feature = "extra-children"))]
13340                            _ => {}
13341                        }
13342                    }
13343                    Event::End(_) => break,
13344                    Event::Eof => break,
13345                    _ => {}
13346                }
13347                buf.clear();
13348            }
13349        }
13350
13351        Ok(Self {
13352            count: f_count,
13353            format: f_format,
13354            #[cfg(feature = "extra-attrs")]
13355            extra_attrs,
13356            #[cfg(feature = "extra-children")]
13357            extra_children,
13358        })
13359    }
13360}
13361
13362impl FromXml for CTFormat {
13363    fn from_xml<R: BufRead>(
13364        reader: &mut Reader<R>,
13365        start_tag: &BytesStart,
13366        is_empty: bool,
13367    ) -> Result<Self, ParseError> {
13368        let mut f_action = None;
13369        let mut f_dxf_id = None;
13370        let mut f_pivot_area: Option<Box<PivotArea>> = None;
13371        let mut f_extension_list = None;
13372        #[cfg(feature = "extra-attrs")]
13373        let mut extra_attrs = std::collections::HashMap::new();
13374        #[cfg(feature = "extra-children")]
13375        let mut extra_children = Vec::new();
13376        #[cfg(feature = "extra-children")]
13377        let mut child_idx: usize = 0;
13378
13379        // Parse attributes
13380        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13381            let val = String::from_utf8_lossy(&attr.value);
13382            match attr.key.local_name().as_ref() {
13383                b"action" => {
13384                    f_action = val.parse().ok();
13385                }
13386                b"dxfId" => {
13387                    f_dxf_id = val.parse().ok();
13388                }
13389                #[cfg(feature = "extra-attrs")]
13390                unknown => {
13391                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13392                    extra_attrs.insert(key, val.into_owned());
13393                }
13394                #[cfg(not(feature = "extra-attrs"))]
13395                _ => {}
13396            }
13397        }
13398
13399        // Parse child elements
13400        if !is_empty {
13401            let mut buf = Vec::new();
13402            loop {
13403                match reader.read_event_into(&mut buf)? {
13404                    Event::Start(e) => {
13405                        match e.local_name().as_ref() {
13406                            b"pivotArea" => {
13407                                f_pivot_area =
13408                                    Some(Box::new(PivotArea::from_xml(reader, &e, false)?));
13409                                #[cfg(feature = "extra-children")]
13410                                {
13411                                    child_idx += 1;
13412                                }
13413                            }
13414                            b"extLst" => {
13415                                f_extension_list =
13416                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
13417                                #[cfg(feature = "extra-children")]
13418                                {
13419                                    child_idx += 1;
13420                                }
13421                            }
13422                            #[cfg(feature = "extra-children")]
13423                            _ => {
13424                                // Capture unknown element for roundtrip
13425                                let elem = RawXmlElement::from_reader(reader, &e)?;
13426                                extra_children.push(PositionedNode::new(
13427                                    child_idx,
13428                                    RawXmlNode::Element(elem),
13429                                ));
13430                                child_idx += 1;
13431                            }
13432                            #[cfg(not(feature = "extra-children"))]
13433                            _ => {
13434                                // Skip unknown element
13435                                skip_element(reader)?;
13436                            }
13437                        }
13438                    }
13439                    Event::Empty(e) => {
13440                        match e.local_name().as_ref() {
13441                            b"pivotArea" => {
13442                                f_pivot_area =
13443                                    Some(Box::new(PivotArea::from_xml(reader, &e, true)?));
13444                                #[cfg(feature = "extra-children")]
13445                                {
13446                                    child_idx += 1;
13447                                }
13448                            }
13449                            b"extLst" => {
13450                                f_extension_list =
13451                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
13452                                #[cfg(feature = "extra-children")]
13453                                {
13454                                    child_idx += 1;
13455                                }
13456                            }
13457                            #[cfg(feature = "extra-children")]
13458                            _ => {
13459                                // Capture unknown empty element for roundtrip
13460                                let elem = RawXmlElement::from_empty(&e);
13461                                extra_children.push(PositionedNode::new(
13462                                    child_idx,
13463                                    RawXmlNode::Element(elem),
13464                                ));
13465                                child_idx += 1;
13466                            }
13467                            #[cfg(not(feature = "extra-children"))]
13468                            _ => {}
13469                        }
13470                    }
13471                    Event::End(_) => break,
13472                    Event::Eof => break,
13473                    _ => {}
13474                }
13475                buf.clear();
13476            }
13477        }
13478
13479        Ok(Self {
13480            action: f_action,
13481            dxf_id: f_dxf_id,
13482            pivot_area: f_pivot_area
13483                .ok_or_else(|| ParseError::MissingAttribute("pivotArea".to_string()))?,
13484            extension_list: f_extension_list,
13485            #[cfg(feature = "extra-attrs")]
13486            extra_attrs,
13487            #[cfg(feature = "extra-children")]
13488            extra_children,
13489        })
13490    }
13491}
13492
13493impl FromXml for CTConditionalFormats {
13494    fn from_xml<R: BufRead>(
13495        reader: &mut Reader<R>,
13496        start_tag: &BytesStart,
13497        is_empty: bool,
13498    ) -> Result<Self, ParseError> {
13499        let mut f_count = None;
13500        let mut f_conditional_format = Vec::new();
13501        #[cfg(feature = "extra-attrs")]
13502        let mut extra_attrs = std::collections::HashMap::new();
13503        #[cfg(feature = "extra-children")]
13504        let mut extra_children = Vec::new();
13505        #[cfg(feature = "extra-children")]
13506        let mut child_idx: usize = 0;
13507
13508        // Parse attributes
13509        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13510            let val = String::from_utf8_lossy(&attr.value);
13511            match attr.key.local_name().as_ref() {
13512                b"count" => {
13513                    f_count = val.parse().ok();
13514                }
13515                #[cfg(feature = "extra-attrs")]
13516                unknown => {
13517                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13518                    extra_attrs.insert(key, val.into_owned());
13519                }
13520                #[cfg(not(feature = "extra-attrs"))]
13521                _ => {}
13522            }
13523        }
13524
13525        // Parse child elements
13526        if !is_empty {
13527            let mut buf = Vec::new();
13528            loop {
13529                match reader.read_event_into(&mut buf)? {
13530                    Event::Start(e) => {
13531                        match e.local_name().as_ref() {
13532                            b"conditionalFormat" => {
13533                                f_conditional_format
13534                                    .push(CTConditionalFormat::from_xml(reader, &e, false)?);
13535                                #[cfg(feature = "extra-children")]
13536                                {
13537                                    child_idx += 1;
13538                                }
13539                            }
13540                            #[cfg(feature = "extra-children")]
13541                            _ => {
13542                                // Capture unknown element for roundtrip
13543                                let elem = RawXmlElement::from_reader(reader, &e)?;
13544                                extra_children.push(PositionedNode::new(
13545                                    child_idx,
13546                                    RawXmlNode::Element(elem),
13547                                ));
13548                                child_idx += 1;
13549                            }
13550                            #[cfg(not(feature = "extra-children"))]
13551                            _ => {
13552                                // Skip unknown element
13553                                skip_element(reader)?;
13554                            }
13555                        }
13556                    }
13557                    Event::Empty(e) => {
13558                        match e.local_name().as_ref() {
13559                            b"conditionalFormat" => {
13560                                f_conditional_format
13561                                    .push(CTConditionalFormat::from_xml(reader, &e, true)?);
13562                                #[cfg(feature = "extra-children")]
13563                                {
13564                                    child_idx += 1;
13565                                }
13566                            }
13567                            #[cfg(feature = "extra-children")]
13568                            _ => {
13569                                // Capture unknown empty element for roundtrip
13570                                let elem = RawXmlElement::from_empty(&e);
13571                                extra_children.push(PositionedNode::new(
13572                                    child_idx,
13573                                    RawXmlNode::Element(elem),
13574                                ));
13575                                child_idx += 1;
13576                            }
13577                            #[cfg(not(feature = "extra-children"))]
13578                            _ => {}
13579                        }
13580                    }
13581                    Event::End(_) => break,
13582                    Event::Eof => break,
13583                    _ => {}
13584                }
13585                buf.clear();
13586            }
13587        }
13588
13589        Ok(Self {
13590            count: f_count,
13591            conditional_format: f_conditional_format,
13592            #[cfg(feature = "extra-attrs")]
13593            extra_attrs,
13594            #[cfg(feature = "extra-children")]
13595            extra_children,
13596        })
13597    }
13598}
13599
13600impl FromXml for CTConditionalFormat {
13601    fn from_xml<R: BufRead>(
13602        reader: &mut Reader<R>,
13603        start_tag: &BytesStart,
13604        is_empty: bool,
13605    ) -> Result<Self, ParseError> {
13606        let mut f_scope = None;
13607        let mut f_type = None;
13608        let mut f_priority: Option<u32> = None;
13609        let mut f_pivot_areas: Option<Box<PivotAreas>> = None;
13610        let mut f_extension_list = None;
13611        #[cfg(feature = "extra-attrs")]
13612        let mut extra_attrs = std::collections::HashMap::new();
13613        #[cfg(feature = "extra-children")]
13614        let mut extra_children = Vec::new();
13615        #[cfg(feature = "extra-children")]
13616        let mut child_idx: usize = 0;
13617
13618        // Parse attributes
13619        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13620            let val = String::from_utf8_lossy(&attr.value);
13621            match attr.key.local_name().as_ref() {
13622                b"scope" => {
13623                    f_scope = val.parse().ok();
13624                }
13625                b"type" => {
13626                    f_type = val.parse().ok();
13627                }
13628                b"priority" => {
13629                    f_priority = val.parse().ok();
13630                }
13631                #[cfg(feature = "extra-attrs")]
13632                unknown => {
13633                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13634                    extra_attrs.insert(key, val.into_owned());
13635                }
13636                #[cfg(not(feature = "extra-attrs"))]
13637                _ => {}
13638            }
13639        }
13640
13641        // Parse child elements
13642        if !is_empty {
13643            let mut buf = Vec::new();
13644            loop {
13645                match reader.read_event_into(&mut buf)? {
13646                    Event::Start(e) => {
13647                        match e.local_name().as_ref() {
13648                            b"pivotAreas" => {
13649                                f_pivot_areas =
13650                                    Some(Box::new(PivotAreas::from_xml(reader, &e, false)?));
13651                                #[cfg(feature = "extra-children")]
13652                                {
13653                                    child_idx += 1;
13654                                }
13655                            }
13656                            b"extLst" => {
13657                                f_extension_list =
13658                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
13659                                #[cfg(feature = "extra-children")]
13660                                {
13661                                    child_idx += 1;
13662                                }
13663                            }
13664                            #[cfg(feature = "extra-children")]
13665                            _ => {
13666                                // Capture unknown element for roundtrip
13667                                let elem = RawXmlElement::from_reader(reader, &e)?;
13668                                extra_children.push(PositionedNode::new(
13669                                    child_idx,
13670                                    RawXmlNode::Element(elem),
13671                                ));
13672                                child_idx += 1;
13673                            }
13674                            #[cfg(not(feature = "extra-children"))]
13675                            _ => {
13676                                // Skip unknown element
13677                                skip_element(reader)?;
13678                            }
13679                        }
13680                    }
13681                    Event::Empty(e) => {
13682                        match e.local_name().as_ref() {
13683                            b"pivotAreas" => {
13684                                f_pivot_areas =
13685                                    Some(Box::new(PivotAreas::from_xml(reader, &e, true)?));
13686                                #[cfg(feature = "extra-children")]
13687                                {
13688                                    child_idx += 1;
13689                                }
13690                            }
13691                            b"extLst" => {
13692                                f_extension_list =
13693                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
13694                                #[cfg(feature = "extra-children")]
13695                                {
13696                                    child_idx += 1;
13697                                }
13698                            }
13699                            #[cfg(feature = "extra-children")]
13700                            _ => {
13701                                // Capture unknown empty element for roundtrip
13702                                let elem = RawXmlElement::from_empty(&e);
13703                                extra_children.push(PositionedNode::new(
13704                                    child_idx,
13705                                    RawXmlNode::Element(elem),
13706                                ));
13707                                child_idx += 1;
13708                            }
13709                            #[cfg(not(feature = "extra-children"))]
13710                            _ => {}
13711                        }
13712                    }
13713                    Event::End(_) => break,
13714                    Event::Eof => break,
13715                    _ => {}
13716                }
13717                buf.clear();
13718            }
13719        }
13720
13721        Ok(Self {
13722            scope: f_scope,
13723            r#type: f_type,
13724            priority: f_priority
13725                .ok_or_else(|| ParseError::MissingAttribute("priority".to_string()))?,
13726            pivot_areas: f_pivot_areas
13727                .ok_or_else(|| ParseError::MissingAttribute("pivotAreas".to_string()))?,
13728            extension_list: f_extension_list,
13729            #[cfg(feature = "extra-attrs")]
13730            extra_attrs,
13731            #[cfg(feature = "extra-children")]
13732            extra_children,
13733        })
13734    }
13735}
13736
13737impl FromXml for PivotAreas {
13738    fn from_xml<R: BufRead>(
13739        reader: &mut Reader<R>,
13740        start_tag: &BytesStart,
13741        is_empty: bool,
13742    ) -> Result<Self, ParseError> {
13743        let mut f_count = None;
13744        let mut f_pivot_area = Vec::new();
13745        #[cfg(feature = "extra-attrs")]
13746        let mut extra_attrs = std::collections::HashMap::new();
13747        #[cfg(feature = "extra-children")]
13748        let mut extra_children = Vec::new();
13749        #[cfg(feature = "extra-children")]
13750        let mut child_idx: usize = 0;
13751
13752        // Parse attributes
13753        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13754            let val = String::from_utf8_lossy(&attr.value);
13755            match attr.key.local_name().as_ref() {
13756                b"count" => {
13757                    f_count = val.parse().ok();
13758                }
13759                #[cfg(feature = "extra-attrs")]
13760                unknown => {
13761                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13762                    extra_attrs.insert(key, val.into_owned());
13763                }
13764                #[cfg(not(feature = "extra-attrs"))]
13765                _ => {}
13766            }
13767        }
13768
13769        // Parse child elements
13770        if !is_empty {
13771            let mut buf = Vec::new();
13772            loop {
13773                match reader.read_event_into(&mut buf)? {
13774                    Event::Start(e) => {
13775                        match e.local_name().as_ref() {
13776                            b"pivotArea" => {
13777                                f_pivot_area.push(PivotArea::from_xml(reader, &e, false)?);
13778                                #[cfg(feature = "extra-children")]
13779                                {
13780                                    child_idx += 1;
13781                                }
13782                            }
13783                            #[cfg(feature = "extra-children")]
13784                            _ => {
13785                                // Capture unknown element for roundtrip
13786                                let elem = RawXmlElement::from_reader(reader, &e)?;
13787                                extra_children.push(PositionedNode::new(
13788                                    child_idx,
13789                                    RawXmlNode::Element(elem),
13790                                ));
13791                                child_idx += 1;
13792                            }
13793                            #[cfg(not(feature = "extra-children"))]
13794                            _ => {
13795                                // Skip unknown element
13796                                skip_element(reader)?;
13797                            }
13798                        }
13799                    }
13800                    Event::Empty(e) => {
13801                        match e.local_name().as_ref() {
13802                            b"pivotArea" => {
13803                                f_pivot_area.push(PivotArea::from_xml(reader, &e, true)?);
13804                                #[cfg(feature = "extra-children")]
13805                                {
13806                                    child_idx += 1;
13807                                }
13808                            }
13809                            #[cfg(feature = "extra-children")]
13810                            _ => {
13811                                // Capture unknown empty element for roundtrip
13812                                let elem = RawXmlElement::from_empty(&e);
13813                                extra_children.push(PositionedNode::new(
13814                                    child_idx,
13815                                    RawXmlNode::Element(elem),
13816                                ));
13817                                child_idx += 1;
13818                            }
13819                            #[cfg(not(feature = "extra-children"))]
13820                            _ => {}
13821                        }
13822                    }
13823                    Event::End(_) => break,
13824                    Event::Eof => break,
13825                    _ => {}
13826                }
13827                buf.clear();
13828            }
13829        }
13830
13831        Ok(Self {
13832            count: f_count,
13833            pivot_area: f_pivot_area,
13834            #[cfg(feature = "extra-attrs")]
13835            extra_attrs,
13836            #[cfg(feature = "extra-children")]
13837            extra_children,
13838        })
13839    }
13840}
13841
13842impl FromXml for CTChartFormats {
13843    fn from_xml<R: BufRead>(
13844        reader: &mut Reader<R>,
13845        start_tag: &BytesStart,
13846        is_empty: bool,
13847    ) -> Result<Self, ParseError> {
13848        let mut f_count = None;
13849        let mut f_chart_format = Vec::new();
13850        #[cfg(feature = "extra-attrs")]
13851        let mut extra_attrs = std::collections::HashMap::new();
13852        #[cfg(feature = "extra-children")]
13853        let mut extra_children = Vec::new();
13854        #[cfg(feature = "extra-children")]
13855        let mut child_idx: usize = 0;
13856
13857        // Parse attributes
13858        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13859            let val = String::from_utf8_lossy(&attr.value);
13860            match attr.key.local_name().as_ref() {
13861                b"count" => {
13862                    f_count = val.parse().ok();
13863                }
13864                #[cfg(feature = "extra-attrs")]
13865                unknown => {
13866                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13867                    extra_attrs.insert(key, val.into_owned());
13868                }
13869                #[cfg(not(feature = "extra-attrs"))]
13870                _ => {}
13871            }
13872        }
13873
13874        // Parse child elements
13875        if !is_empty {
13876            let mut buf = Vec::new();
13877            loop {
13878                match reader.read_event_into(&mut buf)? {
13879                    Event::Start(e) => {
13880                        match e.local_name().as_ref() {
13881                            b"chartFormat" => {
13882                                f_chart_format.push(CTChartFormat::from_xml(reader, &e, false)?);
13883                                #[cfg(feature = "extra-children")]
13884                                {
13885                                    child_idx += 1;
13886                                }
13887                            }
13888                            #[cfg(feature = "extra-children")]
13889                            _ => {
13890                                // Capture unknown element for roundtrip
13891                                let elem = RawXmlElement::from_reader(reader, &e)?;
13892                                extra_children.push(PositionedNode::new(
13893                                    child_idx,
13894                                    RawXmlNode::Element(elem),
13895                                ));
13896                                child_idx += 1;
13897                            }
13898                            #[cfg(not(feature = "extra-children"))]
13899                            _ => {
13900                                // Skip unknown element
13901                                skip_element(reader)?;
13902                            }
13903                        }
13904                    }
13905                    Event::Empty(e) => {
13906                        match e.local_name().as_ref() {
13907                            b"chartFormat" => {
13908                                f_chart_format.push(CTChartFormat::from_xml(reader, &e, true)?);
13909                                #[cfg(feature = "extra-children")]
13910                                {
13911                                    child_idx += 1;
13912                                }
13913                            }
13914                            #[cfg(feature = "extra-children")]
13915                            _ => {
13916                                // Capture unknown empty element for roundtrip
13917                                let elem = RawXmlElement::from_empty(&e);
13918                                extra_children.push(PositionedNode::new(
13919                                    child_idx,
13920                                    RawXmlNode::Element(elem),
13921                                ));
13922                                child_idx += 1;
13923                            }
13924                            #[cfg(not(feature = "extra-children"))]
13925                            _ => {}
13926                        }
13927                    }
13928                    Event::End(_) => break,
13929                    Event::Eof => break,
13930                    _ => {}
13931                }
13932                buf.clear();
13933            }
13934        }
13935
13936        Ok(Self {
13937            count: f_count,
13938            chart_format: f_chart_format,
13939            #[cfg(feature = "extra-attrs")]
13940            extra_attrs,
13941            #[cfg(feature = "extra-children")]
13942            extra_children,
13943        })
13944    }
13945}
13946
13947impl FromXml for CTChartFormat {
13948    fn from_xml<R: BufRead>(
13949        reader: &mut Reader<R>,
13950        start_tag: &BytesStart,
13951        is_empty: bool,
13952    ) -> Result<Self, ParseError> {
13953        let mut f_chart: Option<u32> = None;
13954        let mut f_format: Option<u32> = None;
13955        let mut f_series = None;
13956        let mut f_pivot_area: Option<Box<PivotArea>> = None;
13957        #[cfg(feature = "extra-attrs")]
13958        let mut extra_attrs = std::collections::HashMap::new();
13959        #[cfg(feature = "extra-children")]
13960        let mut extra_children = Vec::new();
13961        #[cfg(feature = "extra-children")]
13962        let mut child_idx: usize = 0;
13963
13964        // Parse attributes
13965        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
13966            let val = String::from_utf8_lossy(&attr.value);
13967            match attr.key.local_name().as_ref() {
13968                b"chart" => {
13969                    f_chart = val.parse().ok();
13970                }
13971                b"format" => {
13972                    f_format = val.parse().ok();
13973                }
13974                b"series" => {
13975                    f_series = Some(val == "true" || val == "1");
13976                }
13977                #[cfg(feature = "extra-attrs")]
13978                unknown => {
13979                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
13980                    extra_attrs.insert(key, val.into_owned());
13981                }
13982                #[cfg(not(feature = "extra-attrs"))]
13983                _ => {}
13984            }
13985        }
13986
13987        // Parse child elements
13988        if !is_empty {
13989            let mut buf = Vec::new();
13990            loop {
13991                match reader.read_event_into(&mut buf)? {
13992                    Event::Start(e) => {
13993                        match e.local_name().as_ref() {
13994                            b"pivotArea" => {
13995                                f_pivot_area =
13996                                    Some(Box::new(PivotArea::from_xml(reader, &e, false)?));
13997                                #[cfg(feature = "extra-children")]
13998                                {
13999                                    child_idx += 1;
14000                                }
14001                            }
14002                            #[cfg(feature = "extra-children")]
14003                            _ => {
14004                                // Capture unknown element for roundtrip
14005                                let elem = RawXmlElement::from_reader(reader, &e)?;
14006                                extra_children.push(PositionedNode::new(
14007                                    child_idx,
14008                                    RawXmlNode::Element(elem),
14009                                ));
14010                                child_idx += 1;
14011                            }
14012                            #[cfg(not(feature = "extra-children"))]
14013                            _ => {
14014                                // Skip unknown element
14015                                skip_element(reader)?;
14016                            }
14017                        }
14018                    }
14019                    Event::Empty(e) => {
14020                        match e.local_name().as_ref() {
14021                            b"pivotArea" => {
14022                                f_pivot_area =
14023                                    Some(Box::new(PivotArea::from_xml(reader, &e, true)?));
14024                                #[cfg(feature = "extra-children")]
14025                                {
14026                                    child_idx += 1;
14027                                }
14028                            }
14029                            #[cfg(feature = "extra-children")]
14030                            _ => {
14031                                // Capture unknown empty element for roundtrip
14032                                let elem = RawXmlElement::from_empty(&e);
14033                                extra_children.push(PositionedNode::new(
14034                                    child_idx,
14035                                    RawXmlNode::Element(elem),
14036                                ));
14037                                child_idx += 1;
14038                            }
14039                            #[cfg(not(feature = "extra-children"))]
14040                            _ => {}
14041                        }
14042                    }
14043                    Event::End(_) => break,
14044                    Event::Eof => break,
14045                    _ => {}
14046                }
14047                buf.clear();
14048            }
14049        }
14050
14051        Ok(Self {
14052            chart: f_chart.ok_or_else(|| ParseError::MissingAttribute("chart".to_string()))?,
14053            format: f_format.ok_or_else(|| ParseError::MissingAttribute("format".to_string()))?,
14054            series: f_series,
14055            pivot_area: f_pivot_area
14056                .ok_or_else(|| ParseError::MissingAttribute("pivotArea".to_string()))?,
14057            #[cfg(feature = "extra-attrs")]
14058            extra_attrs,
14059            #[cfg(feature = "extra-children")]
14060            extra_children,
14061        })
14062    }
14063}
14064
14065impl FromXml for CTPivotHierarchies {
14066    fn from_xml<R: BufRead>(
14067        reader: &mut Reader<R>,
14068        start_tag: &BytesStart,
14069        is_empty: bool,
14070    ) -> Result<Self, ParseError> {
14071        let mut f_count = None;
14072        let mut f_pivot_hierarchy = Vec::new();
14073        #[cfg(feature = "extra-attrs")]
14074        let mut extra_attrs = std::collections::HashMap::new();
14075        #[cfg(feature = "extra-children")]
14076        let mut extra_children = Vec::new();
14077        #[cfg(feature = "extra-children")]
14078        let mut child_idx: usize = 0;
14079
14080        // Parse attributes
14081        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14082            let val = String::from_utf8_lossy(&attr.value);
14083            match attr.key.local_name().as_ref() {
14084                b"count" => {
14085                    f_count = val.parse().ok();
14086                }
14087                #[cfg(feature = "extra-attrs")]
14088                unknown => {
14089                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14090                    extra_attrs.insert(key, val.into_owned());
14091                }
14092                #[cfg(not(feature = "extra-attrs"))]
14093                _ => {}
14094            }
14095        }
14096
14097        // Parse child elements
14098        if !is_empty {
14099            let mut buf = Vec::new();
14100            loop {
14101                match reader.read_event_into(&mut buf)? {
14102                    Event::Start(e) => {
14103                        match e.local_name().as_ref() {
14104                            b"pivotHierarchy" => {
14105                                f_pivot_hierarchy
14106                                    .push(CTPivotHierarchy::from_xml(reader, &e, false)?);
14107                                #[cfg(feature = "extra-children")]
14108                                {
14109                                    child_idx += 1;
14110                                }
14111                            }
14112                            #[cfg(feature = "extra-children")]
14113                            _ => {
14114                                // Capture unknown element for roundtrip
14115                                let elem = RawXmlElement::from_reader(reader, &e)?;
14116                                extra_children.push(PositionedNode::new(
14117                                    child_idx,
14118                                    RawXmlNode::Element(elem),
14119                                ));
14120                                child_idx += 1;
14121                            }
14122                            #[cfg(not(feature = "extra-children"))]
14123                            _ => {
14124                                // Skip unknown element
14125                                skip_element(reader)?;
14126                            }
14127                        }
14128                    }
14129                    Event::Empty(e) => {
14130                        match e.local_name().as_ref() {
14131                            b"pivotHierarchy" => {
14132                                f_pivot_hierarchy
14133                                    .push(CTPivotHierarchy::from_xml(reader, &e, true)?);
14134                                #[cfg(feature = "extra-children")]
14135                                {
14136                                    child_idx += 1;
14137                                }
14138                            }
14139                            #[cfg(feature = "extra-children")]
14140                            _ => {
14141                                // Capture unknown empty element for roundtrip
14142                                let elem = RawXmlElement::from_empty(&e);
14143                                extra_children.push(PositionedNode::new(
14144                                    child_idx,
14145                                    RawXmlNode::Element(elem),
14146                                ));
14147                                child_idx += 1;
14148                            }
14149                            #[cfg(not(feature = "extra-children"))]
14150                            _ => {}
14151                        }
14152                    }
14153                    Event::End(_) => break,
14154                    Event::Eof => break,
14155                    _ => {}
14156                }
14157                buf.clear();
14158            }
14159        }
14160
14161        Ok(Self {
14162            count: f_count,
14163            pivot_hierarchy: f_pivot_hierarchy,
14164            #[cfg(feature = "extra-attrs")]
14165            extra_attrs,
14166            #[cfg(feature = "extra-children")]
14167            extra_children,
14168        })
14169    }
14170}
14171
14172impl FromXml for CTPivotHierarchy {
14173    fn from_xml<R: BufRead>(
14174        reader: &mut Reader<R>,
14175        start_tag: &BytesStart,
14176        is_empty: bool,
14177    ) -> Result<Self, ParseError> {
14178        let mut f_outline = None;
14179        let mut f_multiple_item_selection_allowed = None;
14180        let mut f_subtotal_top = None;
14181        let mut f_show_in_field_list = None;
14182        let mut f_drag_to_row = None;
14183        let mut f_drag_to_col = None;
14184        let mut f_drag_to_page = None;
14185        let mut f_drag_to_data = None;
14186        let mut f_drag_off = None;
14187        let mut f_include_new_items_in_filter = None;
14188        let mut f_caption = None;
14189        let mut f_mps = None;
14190        let mut f_members = Vec::new();
14191        let mut f_extension_list = None;
14192        #[cfg(feature = "extra-attrs")]
14193        let mut extra_attrs = std::collections::HashMap::new();
14194        #[cfg(feature = "extra-children")]
14195        let mut extra_children = Vec::new();
14196        #[cfg(feature = "extra-children")]
14197        let mut child_idx: usize = 0;
14198
14199        // Parse attributes
14200        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14201            let val = String::from_utf8_lossy(&attr.value);
14202            match attr.key.local_name().as_ref() {
14203                b"outline" => {
14204                    f_outline = Some(val == "true" || val == "1");
14205                }
14206                b"multipleItemSelectionAllowed" => {
14207                    f_multiple_item_selection_allowed = Some(val == "true" || val == "1");
14208                }
14209                b"subtotalTop" => {
14210                    f_subtotal_top = Some(val == "true" || val == "1");
14211                }
14212                b"showInFieldList" => {
14213                    f_show_in_field_list = Some(val == "true" || val == "1");
14214                }
14215                b"dragToRow" => {
14216                    f_drag_to_row = Some(val == "true" || val == "1");
14217                }
14218                b"dragToCol" => {
14219                    f_drag_to_col = Some(val == "true" || val == "1");
14220                }
14221                b"dragToPage" => {
14222                    f_drag_to_page = Some(val == "true" || val == "1");
14223                }
14224                b"dragToData" => {
14225                    f_drag_to_data = Some(val == "true" || val == "1");
14226                }
14227                b"dragOff" => {
14228                    f_drag_off = Some(val == "true" || val == "1");
14229                }
14230                b"includeNewItemsInFilter" => {
14231                    f_include_new_items_in_filter = Some(val == "true" || val == "1");
14232                }
14233                b"caption" => {
14234                    f_caption = Some(val.into_owned());
14235                }
14236                #[cfg(feature = "extra-attrs")]
14237                unknown => {
14238                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14239                    extra_attrs.insert(key, val.into_owned());
14240                }
14241                #[cfg(not(feature = "extra-attrs"))]
14242                _ => {}
14243            }
14244        }
14245
14246        // Parse child elements
14247        if !is_empty {
14248            let mut buf = Vec::new();
14249            loop {
14250                match reader.read_event_into(&mut buf)? {
14251                    Event::Start(e) => {
14252                        match e.local_name().as_ref() {
14253                            b"mps" => {
14254                                f_mps = Some(Box::new(CTMemberProperties::from_xml(
14255                                    reader, &e, false,
14256                                )?));
14257                                #[cfg(feature = "extra-children")]
14258                                {
14259                                    child_idx += 1;
14260                                }
14261                            }
14262                            b"members" => {
14263                                f_members.push(CTMembers::from_xml(reader, &e, false)?);
14264                                #[cfg(feature = "extra-children")]
14265                                {
14266                                    child_idx += 1;
14267                                }
14268                            }
14269                            b"extLst" => {
14270                                f_extension_list =
14271                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
14272                                #[cfg(feature = "extra-children")]
14273                                {
14274                                    child_idx += 1;
14275                                }
14276                            }
14277                            #[cfg(feature = "extra-children")]
14278                            _ => {
14279                                // Capture unknown element for roundtrip
14280                                let elem = RawXmlElement::from_reader(reader, &e)?;
14281                                extra_children.push(PositionedNode::new(
14282                                    child_idx,
14283                                    RawXmlNode::Element(elem),
14284                                ));
14285                                child_idx += 1;
14286                            }
14287                            #[cfg(not(feature = "extra-children"))]
14288                            _ => {
14289                                // Skip unknown element
14290                                skip_element(reader)?;
14291                            }
14292                        }
14293                    }
14294                    Event::Empty(e) => {
14295                        match e.local_name().as_ref() {
14296                            b"mps" => {
14297                                f_mps =
14298                                    Some(Box::new(CTMemberProperties::from_xml(reader, &e, true)?));
14299                                #[cfg(feature = "extra-children")]
14300                                {
14301                                    child_idx += 1;
14302                                }
14303                            }
14304                            b"members" => {
14305                                f_members.push(CTMembers::from_xml(reader, &e, true)?);
14306                                #[cfg(feature = "extra-children")]
14307                                {
14308                                    child_idx += 1;
14309                                }
14310                            }
14311                            b"extLst" => {
14312                                f_extension_list =
14313                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
14314                                #[cfg(feature = "extra-children")]
14315                                {
14316                                    child_idx += 1;
14317                                }
14318                            }
14319                            #[cfg(feature = "extra-children")]
14320                            _ => {
14321                                // Capture unknown empty element for roundtrip
14322                                let elem = RawXmlElement::from_empty(&e);
14323                                extra_children.push(PositionedNode::new(
14324                                    child_idx,
14325                                    RawXmlNode::Element(elem),
14326                                ));
14327                                child_idx += 1;
14328                            }
14329                            #[cfg(not(feature = "extra-children"))]
14330                            _ => {}
14331                        }
14332                    }
14333                    Event::End(_) => break,
14334                    Event::Eof => break,
14335                    _ => {}
14336                }
14337                buf.clear();
14338            }
14339        }
14340
14341        Ok(Self {
14342            outline: f_outline,
14343            multiple_item_selection_allowed: f_multiple_item_selection_allowed,
14344            subtotal_top: f_subtotal_top,
14345            show_in_field_list: f_show_in_field_list,
14346            drag_to_row: f_drag_to_row,
14347            drag_to_col: f_drag_to_col,
14348            drag_to_page: f_drag_to_page,
14349            drag_to_data: f_drag_to_data,
14350            drag_off: f_drag_off,
14351            include_new_items_in_filter: f_include_new_items_in_filter,
14352            caption: f_caption,
14353            mps: f_mps,
14354            members: f_members,
14355            extension_list: f_extension_list,
14356            #[cfg(feature = "extra-attrs")]
14357            extra_attrs,
14358            #[cfg(feature = "extra-children")]
14359            extra_children,
14360        })
14361    }
14362}
14363
14364impl FromXml for CTRowHierarchiesUsage {
14365    fn from_xml<R: BufRead>(
14366        reader: &mut Reader<R>,
14367        start_tag: &BytesStart,
14368        is_empty: bool,
14369    ) -> Result<Self, ParseError> {
14370        let mut f_count = None;
14371        let mut f_row_hierarchy_usage = Vec::new();
14372        #[cfg(feature = "extra-attrs")]
14373        let mut extra_attrs = std::collections::HashMap::new();
14374        #[cfg(feature = "extra-children")]
14375        let mut extra_children = Vec::new();
14376        #[cfg(feature = "extra-children")]
14377        let mut child_idx: usize = 0;
14378
14379        // Parse attributes
14380        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14381            let val = String::from_utf8_lossy(&attr.value);
14382            match attr.key.local_name().as_ref() {
14383                b"count" => {
14384                    f_count = val.parse().ok();
14385                }
14386                #[cfg(feature = "extra-attrs")]
14387                unknown => {
14388                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14389                    extra_attrs.insert(key, val.into_owned());
14390                }
14391                #[cfg(not(feature = "extra-attrs"))]
14392                _ => {}
14393            }
14394        }
14395
14396        // Parse child elements
14397        if !is_empty {
14398            let mut buf = Vec::new();
14399            loop {
14400                match reader.read_event_into(&mut buf)? {
14401                    Event::Start(e) => {
14402                        match e.local_name().as_ref() {
14403                            b"rowHierarchyUsage" => {
14404                                f_row_hierarchy_usage
14405                                    .push(CTHierarchyUsage::from_xml(reader, &e, false)?);
14406                                #[cfg(feature = "extra-children")]
14407                                {
14408                                    child_idx += 1;
14409                                }
14410                            }
14411                            #[cfg(feature = "extra-children")]
14412                            _ => {
14413                                // Capture unknown element for roundtrip
14414                                let elem = RawXmlElement::from_reader(reader, &e)?;
14415                                extra_children.push(PositionedNode::new(
14416                                    child_idx,
14417                                    RawXmlNode::Element(elem),
14418                                ));
14419                                child_idx += 1;
14420                            }
14421                            #[cfg(not(feature = "extra-children"))]
14422                            _ => {
14423                                // Skip unknown element
14424                                skip_element(reader)?;
14425                            }
14426                        }
14427                    }
14428                    Event::Empty(e) => {
14429                        match e.local_name().as_ref() {
14430                            b"rowHierarchyUsage" => {
14431                                f_row_hierarchy_usage
14432                                    .push(CTHierarchyUsage::from_xml(reader, &e, true)?);
14433                                #[cfg(feature = "extra-children")]
14434                                {
14435                                    child_idx += 1;
14436                                }
14437                            }
14438                            #[cfg(feature = "extra-children")]
14439                            _ => {
14440                                // Capture unknown empty element for roundtrip
14441                                let elem = RawXmlElement::from_empty(&e);
14442                                extra_children.push(PositionedNode::new(
14443                                    child_idx,
14444                                    RawXmlNode::Element(elem),
14445                                ));
14446                                child_idx += 1;
14447                            }
14448                            #[cfg(not(feature = "extra-children"))]
14449                            _ => {}
14450                        }
14451                    }
14452                    Event::End(_) => break,
14453                    Event::Eof => break,
14454                    _ => {}
14455                }
14456                buf.clear();
14457            }
14458        }
14459
14460        Ok(Self {
14461            count: f_count,
14462            row_hierarchy_usage: f_row_hierarchy_usage,
14463            #[cfg(feature = "extra-attrs")]
14464            extra_attrs,
14465            #[cfg(feature = "extra-children")]
14466            extra_children,
14467        })
14468    }
14469}
14470
14471impl FromXml for CTColHierarchiesUsage {
14472    fn from_xml<R: BufRead>(
14473        reader: &mut Reader<R>,
14474        start_tag: &BytesStart,
14475        is_empty: bool,
14476    ) -> Result<Self, ParseError> {
14477        let mut f_count = None;
14478        let mut f_col_hierarchy_usage = Vec::new();
14479        #[cfg(feature = "extra-attrs")]
14480        let mut extra_attrs = std::collections::HashMap::new();
14481        #[cfg(feature = "extra-children")]
14482        let mut extra_children = Vec::new();
14483        #[cfg(feature = "extra-children")]
14484        let mut child_idx: usize = 0;
14485
14486        // Parse attributes
14487        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14488            let val = String::from_utf8_lossy(&attr.value);
14489            match attr.key.local_name().as_ref() {
14490                b"count" => {
14491                    f_count = val.parse().ok();
14492                }
14493                #[cfg(feature = "extra-attrs")]
14494                unknown => {
14495                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14496                    extra_attrs.insert(key, val.into_owned());
14497                }
14498                #[cfg(not(feature = "extra-attrs"))]
14499                _ => {}
14500            }
14501        }
14502
14503        // Parse child elements
14504        if !is_empty {
14505            let mut buf = Vec::new();
14506            loop {
14507                match reader.read_event_into(&mut buf)? {
14508                    Event::Start(e) => {
14509                        match e.local_name().as_ref() {
14510                            b"colHierarchyUsage" => {
14511                                f_col_hierarchy_usage
14512                                    .push(CTHierarchyUsage::from_xml(reader, &e, false)?);
14513                                #[cfg(feature = "extra-children")]
14514                                {
14515                                    child_idx += 1;
14516                                }
14517                            }
14518                            #[cfg(feature = "extra-children")]
14519                            _ => {
14520                                // Capture unknown element for roundtrip
14521                                let elem = RawXmlElement::from_reader(reader, &e)?;
14522                                extra_children.push(PositionedNode::new(
14523                                    child_idx,
14524                                    RawXmlNode::Element(elem),
14525                                ));
14526                                child_idx += 1;
14527                            }
14528                            #[cfg(not(feature = "extra-children"))]
14529                            _ => {
14530                                // Skip unknown element
14531                                skip_element(reader)?;
14532                            }
14533                        }
14534                    }
14535                    Event::Empty(e) => {
14536                        match e.local_name().as_ref() {
14537                            b"colHierarchyUsage" => {
14538                                f_col_hierarchy_usage
14539                                    .push(CTHierarchyUsage::from_xml(reader, &e, true)?);
14540                                #[cfg(feature = "extra-children")]
14541                                {
14542                                    child_idx += 1;
14543                                }
14544                            }
14545                            #[cfg(feature = "extra-children")]
14546                            _ => {
14547                                // Capture unknown empty element for roundtrip
14548                                let elem = RawXmlElement::from_empty(&e);
14549                                extra_children.push(PositionedNode::new(
14550                                    child_idx,
14551                                    RawXmlNode::Element(elem),
14552                                ));
14553                                child_idx += 1;
14554                            }
14555                            #[cfg(not(feature = "extra-children"))]
14556                            _ => {}
14557                        }
14558                    }
14559                    Event::End(_) => break,
14560                    Event::Eof => break,
14561                    _ => {}
14562                }
14563                buf.clear();
14564            }
14565        }
14566
14567        Ok(Self {
14568            count: f_count,
14569            col_hierarchy_usage: f_col_hierarchy_usage,
14570            #[cfg(feature = "extra-attrs")]
14571            extra_attrs,
14572            #[cfg(feature = "extra-children")]
14573            extra_children,
14574        })
14575    }
14576}
14577
14578impl FromXml for CTHierarchyUsage {
14579    fn from_xml<R: BufRead>(
14580        reader: &mut Reader<R>,
14581        start_tag: &BytesStart,
14582        is_empty: bool,
14583    ) -> Result<Self, ParseError> {
14584        let mut f_hierarchy_usage: Option<i32> = None;
14585        #[cfg(feature = "extra-attrs")]
14586        let mut extra_attrs = std::collections::HashMap::new();
14587
14588        // Parse attributes
14589        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14590            let val = String::from_utf8_lossy(&attr.value);
14591            match attr.key.local_name().as_ref() {
14592                b"hierarchyUsage" => {
14593                    f_hierarchy_usage = val.parse().ok();
14594                }
14595                #[cfg(feature = "extra-attrs")]
14596                unknown => {
14597                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14598                    extra_attrs.insert(key, val.into_owned());
14599                }
14600                #[cfg(not(feature = "extra-attrs"))]
14601                _ => {}
14602            }
14603        }
14604
14605        if !is_empty {
14606            let mut buf = Vec::new();
14607            loop {
14608                match reader.read_event_into(&mut buf)? {
14609                    Event::End(_) => break,
14610                    Event::Eof => break,
14611                    _ => {}
14612                }
14613                buf.clear();
14614            }
14615        }
14616
14617        Ok(Self {
14618            hierarchy_usage: f_hierarchy_usage
14619                .ok_or_else(|| ParseError::MissingAttribute("hierarchyUsage".to_string()))?,
14620            #[cfg(feature = "extra-attrs")]
14621            extra_attrs,
14622        })
14623    }
14624}
14625
14626impl FromXml for CTMemberProperties {
14627    fn from_xml<R: BufRead>(
14628        reader: &mut Reader<R>,
14629        start_tag: &BytesStart,
14630        is_empty: bool,
14631    ) -> Result<Self, ParseError> {
14632        let mut f_count = None;
14633        let mut f_mp = Vec::new();
14634        #[cfg(feature = "extra-attrs")]
14635        let mut extra_attrs = std::collections::HashMap::new();
14636        #[cfg(feature = "extra-children")]
14637        let mut extra_children = Vec::new();
14638        #[cfg(feature = "extra-children")]
14639        let mut child_idx: usize = 0;
14640
14641        // Parse attributes
14642        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14643            let val = String::from_utf8_lossy(&attr.value);
14644            match attr.key.local_name().as_ref() {
14645                b"count" => {
14646                    f_count = val.parse().ok();
14647                }
14648                #[cfg(feature = "extra-attrs")]
14649                unknown => {
14650                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14651                    extra_attrs.insert(key, val.into_owned());
14652                }
14653                #[cfg(not(feature = "extra-attrs"))]
14654                _ => {}
14655            }
14656        }
14657
14658        // Parse child elements
14659        if !is_empty {
14660            let mut buf = Vec::new();
14661            loop {
14662                match reader.read_event_into(&mut buf)? {
14663                    Event::Start(e) => {
14664                        match e.local_name().as_ref() {
14665                            b"mp" => {
14666                                f_mp.push(CTMemberProperty::from_xml(reader, &e, false)?);
14667                                #[cfg(feature = "extra-children")]
14668                                {
14669                                    child_idx += 1;
14670                                }
14671                            }
14672                            #[cfg(feature = "extra-children")]
14673                            _ => {
14674                                // Capture unknown element for roundtrip
14675                                let elem = RawXmlElement::from_reader(reader, &e)?;
14676                                extra_children.push(PositionedNode::new(
14677                                    child_idx,
14678                                    RawXmlNode::Element(elem),
14679                                ));
14680                                child_idx += 1;
14681                            }
14682                            #[cfg(not(feature = "extra-children"))]
14683                            _ => {
14684                                // Skip unknown element
14685                                skip_element(reader)?;
14686                            }
14687                        }
14688                    }
14689                    Event::Empty(e) => {
14690                        match e.local_name().as_ref() {
14691                            b"mp" => {
14692                                f_mp.push(CTMemberProperty::from_xml(reader, &e, true)?);
14693                                #[cfg(feature = "extra-children")]
14694                                {
14695                                    child_idx += 1;
14696                                }
14697                            }
14698                            #[cfg(feature = "extra-children")]
14699                            _ => {
14700                                // Capture unknown empty element for roundtrip
14701                                let elem = RawXmlElement::from_empty(&e);
14702                                extra_children.push(PositionedNode::new(
14703                                    child_idx,
14704                                    RawXmlNode::Element(elem),
14705                                ));
14706                                child_idx += 1;
14707                            }
14708                            #[cfg(not(feature = "extra-children"))]
14709                            _ => {}
14710                        }
14711                    }
14712                    Event::End(_) => break,
14713                    Event::Eof => break,
14714                    _ => {}
14715                }
14716                buf.clear();
14717            }
14718        }
14719
14720        Ok(Self {
14721            count: f_count,
14722            mp: f_mp,
14723            #[cfg(feature = "extra-attrs")]
14724            extra_attrs,
14725            #[cfg(feature = "extra-children")]
14726            extra_children,
14727        })
14728    }
14729}
14730
14731impl FromXml for CTMemberProperty {
14732    fn from_xml<R: BufRead>(
14733        reader: &mut Reader<R>,
14734        start_tag: &BytesStart,
14735        is_empty: bool,
14736    ) -> Result<Self, ParseError> {
14737        let mut f_name = None;
14738        let mut f_show_cell = None;
14739        let mut f_show_tip = None;
14740        let mut f_show_as_caption = None;
14741        let mut f_name_len = None;
14742        let mut f_p_pos = None;
14743        let mut f_p_len = None;
14744        let mut f_level = None;
14745        let mut f_field: Option<u32> = None;
14746        #[cfg(feature = "extra-attrs")]
14747        let mut extra_attrs = std::collections::HashMap::new();
14748
14749        // Parse attributes
14750        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14751            let val = String::from_utf8_lossy(&attr.value);
14752            match attr.key.local_name().as_ref() {
14753                b"name" => {
14754                    f_name = Some(val.into_owned());
14755                }
14756                b"showCell" => {
14757                    f_show_cell = Some(val == "true" || val == "1");
14758                }
14759                b"showTip" => {
14760                    f_show_tip = Some(val == "true" || val == "1");
14761                }
14762                b"showAsCaption" => {
14763                    f_show_as_caption = Some(val == "true" || val == "1");
14764                }
14765                b"nameLen" => {
14766                    f_name_len = val.parse().ok();
14767                }
14768                b"pPos" => {
14769                    f_p_pos = val.parse().ok();
14770                }
14771                b"pLen" => {
14772                    f_p_len = val.parse().ok();
14773                }
14774                b"level" => {
14775                    f_level = val.parse().ok();
14776                }
14777                b"field" => {
14778                    f_field = val.parse().ok();
14779                }
14780                #[cfg(feature = "extra-attrs")]
14781                unknown => {
14782                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14783                    extra_attrs.insert(key, val.into_owned());
14784                }
14785                #[cfg(not(feature = "extra-attrs"))]
14786                _ => {}
14787            }
14788        }
14789
14790        if !is_empty {
14791            let mut buf = Vec::new();
14792            loop {
14793                match reader.read_event_into(&mut buf)? {
14794                    Event::End(_) => break,
14795                    Event::Eof => break,
14796                    _ => {}
14797                }
14798                buf.clear();
14799            }
14800        }
14801
14802        Ok(Self {
14803            name: f_name,
14804            show_cell: f_show_cell,
14805            show_tip: f_show_tip,
14806            show_as_caption: f_show_as_caption,
14807            name_len: f_name_len,
14808            p_pos: f_p_pos,
14809            p_len: f_p_len,
14810            level: f_level,
14811            field: f_field.ok_or_else(|| ParseError::MissingAttribute("field".to_string()))?,
14812            #[cfg(feature = "extra-attrs")]
14813            extra_attrs,
14814        })
14815    }
14816}
14817
14818impl FromXml for CTMembers {
14819    fn from_xml<R: BufRead>(
14820        reader: &mut Reader<R>,
14821        start_tag: &BytesStart,
14822        is_empty: bool,
14823    ) -> Result<Self, ParseError> {
14824        let mut f_count = None;
14825        let mut f_level = None;
14826        let mut f_member = Vec::new();
14827        #[cfg(feature = "extra-attrs")]
14828        let mut extra_attrs = std::collections::HashMap::new();
14829        #[cfg(feature = "extra-children")]
14830        let mut extra_children = Vec::new();
14831        #[cfg(feature = "extra-children")]
14832        let mut child_idx: usize = 0;
14833
14834        // Parse attributes
14835        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14836            let val = String::from_utf8_lossy(&attr.value);
14837            match attr.key.local_name().as_ref() {
14838                b"count" => {
14839                    f_count = val.parse().ok();
14840                }
14841                b"level" => {
14842                    f_level = val.parse().ok();
14843                }
14844                #[cfg(feature = "extra-attrs")]
14845                unknown => {
14846                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14847                    extra_attrs.insert(key, val.into_owned());
14848                }
14849                #[cfg(not(feature = "extra-attrs"))]
14850                _ => {}
14851            }
14852        }
14853
14854        // Parse child elements
14855        if !is_empty {
14856            let mut buf = Vec::new();
14857            loop {
14858                match reader.read_event_into(&mut buf)? {
14859                    Event::Start(e) => {
14860                        match e.local_name().as_ref() {
14861                            b"member" => {
14862                                f_member.push(CTMember::from_xml(reader, &e, false)?);
14863                                #[cfg(feature = "extra-children")]
14864                                {
14865                                    child_idx += 1;
14866                                }
14867                            }
14868                            #[cfg(feature = "extra-children")]
14869                            _ => {
14870                                // Capture unknown element for roundtrip
14871                                let elem = RawXmlElement::from_reader(reader, &e)?;
14872                                extra_children.push(PositionedNode::new(
14873                                    child_idx,
14874                                    RawXmlNode::Element(elem),
14875                                ));
14876                                child_idx += 1;
14877                            }
14878                            #[cfg(not(feature = "extra-children"))]
14879                            _ => {
14880                                // Skip unknown element
14881                                skip_element(reader)?;
14882                            }
14883                        }
14884                    }
14885                    Event::Empty(e) => {
14886                        match e.local_name().as_ref() {
14887                            b"member" => {
14888                                f_member.push(CTMember::from_xml(reader, &e, true)?);
14889                                #[cfg(feature = "extra-children")]
14890                                {
14891                                    child_idx += 1;
14892                                }
14893                            }
14894                            #[cfg(feature = "extra-children")]
14895                            _ => {
14896                                // Capture unknown empty element for roundtrip
14897                                let elem = RawXmlElement::from_empty(&e);
14898                                extra_children.push(PositionedNode::new(
14899                                    child_idx,
14900                                    RawXmlNode::Element(elem),
14901                                ));
14902                                child_idx += 1;
14903                            }
14904                            #[cfg(not(feature = "extra-children"))]
14905                            _ => {}
14906                        }
14907                    }
14908                    Event::End(_) => break,
14909                    Event::Eof => break,
14910                    _ => {}
14911                }
14912                buf.clear();
14913            }
14914        }
14915
14916        Ok(Self {
14917            count: f_count,
14918            level: f_level,
14919            member: f_member,
14920            #[cfg(feature = "extra-attrs")]
14921            extra_attrs,
14922            #[cfg(feature = "extra-children")]
14923            extra_children,
14924        })
14925    }
14926}
14927
14928impl FromXml for CTMember {
14929    fn from_xml<R: BufRead>(
14930        reader: &mut Reader<R>,
14931        start_tag: &BytesStart,
14932        is_empty: bool,
14933    ) -> Result<Self, ParseError> {
14934        let mut f_name: Option<XmlString> = None;
14935        #[cfg(feature = "extra-attrs")]
14936        let mut extra_attrs = std::collections::HashMap::new();
14937
14938        // Parse attributes
14939        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14940            let val = String::from_utf8_lossy(&attr.value);
14941            match attr.key.local_name().as_ref() {
14942                b"name" => {
14943                    f_name = Some(val.into_owned());
14944                }
14945                #[cfg(feature = "extra-attrs")]
14946                unknown => {
14947                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
14948                    extra_attrs.insert(key, val.into_owned());
14949                }
14950                #[cfg(not(feature = "extra-attrs"))]
14951                _ => {}
14952            }
14953        }
14954
14955        if !is_empty {
14956            let mut buf = Vec::new();
14957            loop {
14958                match reader.read_event_into(&mut buf)? {
14959                    Event::End(_) => break,
14960                    Event::Eof => break,
14961                    _ => {}
14962                }
14963                buf.clear();
14964            }
14965        }
14966
14967        Ok(Self {
14968            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
14969            #[cfg(feature = "extra-attrs")]
14970            extra_attrs,
14971        })
14972    }
14973}
14974
14975impl FromXml for CTDimensions {
14976    fn from_xml<R: BufRead>(
14977        reader: &mut Reader<R>,
14978        start_tag: &BytesStart,
14979        is_empty: bool,
14980    ) -> Result<Self, ParseError> {
14981        let mut f_count = None;
14982        let mut f_dimension = Vec::new();
14983        #[cfg(feature = "extra-attrs")]
14984        let mut extra_attrs = std::collections::HashMap::new();
14985        #[cfg(feature = "extra-children")]
14986        let mut extra_children = Vec::new();
14987        #[cfg(feature = "extra-children")]
14988        let mut child_idx: usize = 0;
14989
14990        // Parse attributes
14991        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
14992            let val = String::from_utf8_lossy(&attr.value);
14993            match attr.key.local_name().as_ref() {
14994                b"count" => {
14995                    f_count = val.parse().ok();
14996                }
14997                #[cfg(feature = "extra-attrs")]
14998                unknown => {
14999                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15000                    extra_attrs.insert(key, val.into_owned());
15001                }
15002                #[cfg(not(feature = "extra-attrs"))]
15003                _ => {}
15004            }
15005        }
15006
15007        // Parse child elements
15008        if !is_empty {
15009            let mut buf = Vec::new();
15010            loop {
15011                match reader.read_event_into(&mut buf)? {
15012                    Event::Start(e) => {
15013                        match e.local_name().as_ref() {
15014                            b"dimension" => {
15015                                f_dimension.push(CTPivotDimension::from_xml(reader, &e, false)?);
15016                                #[cfg(feature = "extra-children")]
15017                                {
15018                                    child_idx += 1;
15019                                }
15020                            }
15021                            #[cfg(feature = "extra-children")]
15022                            _ => {
15023                                // Capture unknown element for roundtrip
15024                                let elem = RawXmlElement::from_reader(reader, &e)?;
15025                                extra_children.push(PositionedNode::new(
15026                                    child_idx,
15027                                    RawXmlNode::Element(elem),
15028                                ));
15029                                child_idx += 1;
15030                            }
15031                            #[cfg(not(feature = "extra-children"))]
15032                            _ => {
15033                                // Skip unknown element
15034                                skip_element(reader)?;
15035                            }
15036                        }
15037                    }
15038                    Event::Empty(e) => {
15039                        match e.local_name().as_ref() {
15040                            b"dimension" => {
15041                                f_dimension.push(CTPivotDimension::from_xml(reader, &e, true)?);
15042                                #[cfg(feature = "extra-children")]
15043                                {
15044                                    child_idx += 1;
15045                                }
15046                            }
15047                            #[cfg(feature = "extra-children")]
15048                            _ => {
15049                                // Capture unknown empty element for roundtrip
15050                                let elem = RawXmlElement::from_empty(&e);
15051                                extra_children.push(PositionedNode::new(
15052                                    child_idx,
15053                                    RawXmlNode::Element(elem),
15054                                ));
15055                                child_idx += 1;
15056                            }
15057                            #[cfg(not(feature = "extra-children"))]
15058                            _ => {}
15059                        }
15060                    }
15061                    Event::End(_) => break,
15062                    Event::Eof => break,
15063                    _ => {}
15064                }
15065                buf.clear();
15066            }
15067        }
15068
15069        Ok(Self {
15070            count: f_count,
15071            dimension: f_dimension,
15072            #[cfg(feature = "extra-attrs")]
15073            extra_attrs,
15074            #[cfg(feature = "extra-children")]
15075            extra_children,
15076        })
15077    }
15078}
15079
15080impl FromXml for CTPivotDimension {
15081    fn from_xml<R: BufRead>(
15082        reader: &mut Reader<R>,
15083        start_tag: &BytesStart,
15084        is_empty: bool,
15085    ) -> Result<Self, ParseError> {
15086        let mut f_measure = None;
15087        let mut f_name: Option<XmlString> = None;
15088        let mut f_unique_name: Option<XmlString> = None;
15089        let mut f_caption: Option<XmlString> = None;
15090        #[cfg(feature = "extra-attrs")]
15091        let mut extra_attrs = std::collections::HashMap::new();
15092
15093        // Parse attributes
15094        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15095            let val = String::from_utf8_lossy(&attr.value);
15096            match attr.key.local_name().as_ref() {
15097                b"measure" => {
15098                    f_measure = Some(val == "true" || val == "1");
15099                }
15100                b"name" => {
15101                    f_name = Some(val.into_owned());
15102                }
15103                b"uniqueName" => {
15104                    f_unique_name = Some(val.into_owned());
15105                }
15106                b"caption" => {
15107                    f_caption = Some(val.into_owned());
15108                }
15109                #[cfg(feature = "extra-attrs")]
15110                unknown => {
15111                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15112                    extra_attrs.insert(key, val.into_owned());
15113                }
15114                #[cfg(not(feature = "extra-attrs"))]
15115                _ => {}
15116            }
15117        }
15118
15119        if !is_empty {
15120            let mut buf = Vec::new();
15121            loop {
15122                match reader.read_event_into(&mut buf)? {
15123                    Event::End(_) => break,
15124                    Event::Eof => break,
15125                    _ => {}
15126                }
15127                buf.clear();
15128            }
15129        }
15130
15131        Ok(Self {
15132            measure: f_measure,
15133            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
15134            unique_name: f_unique_name
15135                .ok_or_else(|| ParseError::MissingAttribute("uniqueName".to_string()))?,
15136            caption: f_caption
15137                .ok_or_else(|| ParseError::MissingAttribute("caption".to_string()))?,
15138            #[cfg(feature = "extra-attrs")]
15139            extra_attrs,
15140        })
15141    }
15142}
15143
15144impl FromXml for CTMeasureGroups {
15145    fn from_xml<R: BufRead>(
15146        reader: &mut Reader<R>,
15147        start_tag: &BytesStart,
15148        is_empty: bool,
15149    ) -> Result<Self, ParseError> {
15150        let mut f_count = None;
15151        let mut f_measure_group = Vec::new();
15152        #[cfg(feature = "extra-attrs")]
15153        let mut extra_attrs = std::collections::HashMap::new();
15154        #[cfg(feature = "extra-children")]
15155        let mut extra_children = Vec::new();
15156        #[cfg(feature = "extra-children")]
15157        let mut child_idx: usize = 0;
15158
15159        // Parse attributes
15160        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15161            let val = String::from_utf8_lossy(&attr.value);
15162            match attr.key.local_name().as_ref() {
15163                b"count" => {
15164                    f_count = val.parse().ok();
15165                }
15166                #[cfg(feature = "extra-attrs")]
15167                unknown => {
15168                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15169                    extra_attrs.insert(key, val.into_owned());
15170                }
15171                #[cfg(not(feature = "extra-attrs"))]
15172                _ => {}
15173            }
15174        }
15175
15176        // Parse child elements
15177        if !is_empty {
15178            let mut buf = Vec::new();
15179            loop {
15180                match reader.read_event_into(&mut buf)? {
15181                    Event::Start(e) => {
15182                        match e.local_name().as_ref() {
15183                            b"measureGroup" => {
15184                                f_measure_group.push(CTMeasureGroup::from_xml(reader, &e, false)?);
15185                                #[cfg(feature = "extra-children")]
15186                                {
15187                                    child_idx += 1;
15188                                }
15189                            }
15190                            #[cfg(feature = "extra-children")]
15191                            _ => {
15192                                // Capture unknown element for roundtrip
15193                                let elem = RawXmlElement::from_reader(reader, &e)?;
15194                                extra_children.push(PositionedNode::new(
15195                                    child_idx,
15196                                    RawXmlNode::Element(elem),
15197                                ));
15198                                child_idx += 1;
15199                            }
15200                            #[cfg(not(feature = "extra-children"))]
15201                            _ => {
15202                                // Skip unknown element
15203                                skip_element(reader)?;
15204                            }
15205                        }
15206                    }
15207                    Event::Empty(e) => {
15208                        match e.local_name().as_ref() {
15209                            b"measureGroup" => {
15210                                f_measure_group.push(CTMeasureGroup::from_xml(reader, &e, true)?);
15211                                #[cfg(feature = "extra-children")]
15212                                {
15213                                    child_idx += 1;
15214                                }
15215                            }
15216                            #[cfg(feature = "extra-children")]
15217                            _ => {
15218                                // Capture unknown empty element for roundtrip
15219                                let elem = RawXmlElement::from_empty(&e);
15220                                extra_children.push(PositionedNode::new(
15221                                    child_idx,
15222                                    RawXmlNode::Element(elem),
15223                                ));
15224                                child_idx += 1;
15225                            }
15226                            #[cfg(not(feature = "extra-children"))]
15227                            _ => {}
15228                        }
15229                    }
15230                    Event::End(_) => break,
15231                    Event::Eof => break,
15232                    _ => {}
15233                }
15234                buf.clear();
15235            }
15236        }
15237
15238        Ok(Self {
15239            count: f_count,
15240            measure_group: f_measure_group,
15241            #[cfg(feature = "extra-attrs")]
15242            extra_attrs,
15243            #[cfg(feature = "extra-children")]
15244            extra_children,
15245        })
15246    }
15247}
15248
15249impl FromXml for CTMeasureDimensionMaps {
15250    fn from_xml<R: BufRead>(
15251        reader: &mut Reader<R>,
15252        start_tag: &BytesStart,
15253        is_empty: bool,
15254    ) -> Result<Self, ParseError> {
15255        let mut f_count = None;
15256        let mut f_map = Vec::new();
15257        #[cfg(feature = "extra-attrs")]
15258        let mut extra_attrs = std::collections::HashMap::new();
15259        #[cfg(feature = "extra-children")]
15260        let mut extra_children = Vec::new();
15261        #[cfg(feature = "extra-children")]
15262        let mut child_idx: usize = 0;
15263
15264        // Parse attributes
15265        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15266            let val = String::from_utf8_lossy(&attr.value);
15267            match attr.key.local_name().as_ref() {
15268                b"count" => {
15269                    f_count = val.parse().ok();
15270                }
15271                #[cfg(feature = "extra-attrs")]
15272                unknown => {
15273                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15274                    extra_attrs.insert(key, val.into_owned());
15275                }
15276                #[cfg(not(feature = "extra-attrs"))]
15277                _ => {}
15278            }
15279        }
15280
15281        // Parse child elements
15282        if !is_empty {
15283            let mut buf = Vec::new();
15284            loop {
15285                match reader.read_event_into(&mut buf)? {
15286                    Event::Start(e) => {
15287                        match e.local_name().as_ref() {
15288                            b"map" => {
15289                                f_map.push(CTMeasureDimensionMap::from_xml(reader, &e, false)?);
15290                                #[cfg(feature = "extra-children")]
15291                                {
15292                                    child_idx += 1;
15293                                }
15294                            }
15295                            #[cfg(feature = "extra-children")]
15296                            _ => {
15297                                // Capture unknown element for roundtrip
15298                                let elem = RawXmlElement::from_reader(reader, &e)?;
15299                                extra_children.push(PositionedNode::new(
15300                                    child_idx,
15301                                    RawXmlNode::Element(elem),
15302                                ));
15303                                child_idx += 1;
15304                            }
15305                            #[cfg(not(feature = "extra-children"))]
15306                            _ => {
15307                                // Skip unknown element
15308                                skip_element(reader)?;
15309                            }
15310                        }
15311                    }
15312                    Event::Empty(e) => {
15313                        match e.local_name().as_ref() {
15314                            b"map" => {
15315                                f_map.push(CTMeasureDimensionMap::from_xml(reader, &e, true)?);
15316                                #[cfg(feature = "extra-children")]
15317                                {
15318                                    child_idx += 1;
15319                                }
15320                            }
15321                            #[cfg(feature = "extra-children")]
15322                            _ => {
15323                                // Capture unknown empty element for roundtrip
15324                                let elem = RawXmlElement::from_empty(&e);
15325                                extra_children.push(PositionedNode::new(
15326                                    child_idx,
15327                                    RawXmlNode::Element(elem),
15328                                ));
15329                                child_idx += 1;
15330                            }
15331                            #[cfg(not(feature = "extra-children"))]
15332                            _ => {}
15333                        }
15334                    }
15335                    Event::End(_) => break,
15336                    Event::Eof => break,
15337                    _ => {}
15338                }
15339                buf.clear();
15340            }
15341        }
15342
15343        Ok(Self {
15344            count: f_count,
15345            map: f_map,
15346            #[cfg(feature = "extra-attrs")]
15347            extra_attrs,
15348            #[cfg(feature = "extra-children")]
15349            extra_children,
15350        })
15351    }
15352}
15353
15354impl FromXml for CTMeasureGroup {
15355    fn from_xml<R: BufRead>(
15356        reader: &mut Reader<R>,
15357        start_tag: &BytesStart,
15358        is_empty: bool,
15359    ) -> Result<Self, ParseError> {
15360        let mut f_name: Option<XmlString> = None;
15361        let mut f_caption: Option<XmlString> = None;
15362        #[cfg(feature = "extra-attrs")]
15363        let mut extra_attrs = std::collections::HashMap::new();
15364
15365        // Parse attributes
15366        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15367            let val = String::from_utf8_lossy(&attr.value);
15368            match attr.key.local_name().as_ref() {
15369                b"name" => {
15370                    f_name = Some(val.into_owned());
15371                }
15372                b"caption" => {
15373                    f_caption = Some(val.into_owned());
15374                }
15375                #[cfg(feature = "extra-attrs")]
15376                unknown => {
15377                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15378                    extra_attrs.insert(key, val.into_owned());
15379                }
15380                #[cfg(not(feature = "extra-attrs"))]
15381                _ => {}
15382            }
15383        }
15384
15385        if !is_empty {
15386            let mut buf = Vec::new();
15387            loop {
15388                match reader.read_event_into(&mut buf)? {
15389                    Event::End(_) => break,
15390                    Event::Eof => break,
15391                    _ => {}
15392                }
15393                buf.clear();
15394            }
15395        }
15396
15397        Ok(Self {
15398            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
15399            caption: f_caption
15400                .ok_or_else(|| ParseError::MissingAttribute("caption".to_string()))?,
15401            #[cfg(feature = "extra-attrs")]
15402            extra_attrs,
15403        })
15404    }
15405}
15406
15407impl FromXml for CTMeasureDimensionMap {
15408    fn from_xml<R: BufRead>(
15409        reader: &mut Reader<R>,
15410        start_tag: &BytesStart,
15411        is_empty: bool,
15412    ) -> Result<Self, ParseError> {
15413        let mut f_measure_group = None;
15414        let mut f_dimension = None;
15415        #[cfg(feature = "extra-attrs")]
15416        let mut extra_attrs = std::collections::HashMap::new();
15417
15418        // Parse attributes
15419        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15420            let val = String::from_utf8_lossy(&attr.value);
15421            match attr.key.local_name().as_ref() {
15422                b"measureGroup" => {
15423                    f_measure_group = val.parse().ok();
15424                }
15425                b"dimension" => {
15426                    f_dimension = val.parse().ok();
15427                }
15428                #[cfg(feature = "extra-attrs")]
15429                unknown => {
15430                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15431                    extra_attrs.insert(key, val.into_owned());
15432                }
15433                #[cfg(not(feature = "extra-attrs"))]
15434                _ => {}
15435            }
15436        }
15437
15438        if !is_empty {
15439            let mut buf = Vec::new();
15440            loop {
15441                match reader.read_event_into(&mut buf)? {
15442                    Event::End(_) => break,
15443                    Event::Eof => break,
15444                    _ => {}
15445                }
15446                buf.clear();
15447            }
15448        }
15449
15450        Ok(Self {
15451            measure_group: f_measure_group,
15452            dimension: f_dimension,
15453            #[cfg(feature = "extra-attrs")]
15454            extra_attrs,
15455        })
15456    }
15457}
15458
15459impl FromXml for CTPivotTableStyle {
15460    fn from_xml<R: BufRead>(
15461        reader: &mut Reader<R>,
15462        start_tag: &BytesStart,
15463        is_empty: bool,
15464    ) -> Result<Self, ParseError> {
15465        let mut f_name = None;
15466        let mut f_show_row_headers = None;
15467        let mut f_show_col_headers = None;
15468        let mut f_show_row_stripes = None;
15469        let mut f_show_col_stripes = None;
15470        let mut f_show_last_column = None;
15471        #[cfg(feature = "extra-attrs")]
15472        let mut extra_attrs = std::collections::HashMap::new();
15473
15474        // Parse attributes
15475        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15476            let val = String::from_utf8_lossy(&attr.value);
15477            match attr.key.local_name().as_ref() {
15478                b"name" => {
15479                    f_name = Some(val.into_owned());
15480                }
15481                b"showRowHeaders" => {
15482                    f_show_row_headers = Some(val == "true" || val == "1");
15483                }
15484                b"showColHeaders" => {
15485                    f_show_col_headers = Some(val == "true" || val == "1");
15486                }
15487                b"showRowStripes" => {
15488                    f_show_row_stripes = Some(val == "true" || val == "1");
15489                }
15490                b"showColStripes" => {
15491                    f_show_col_stripes = Some(val == "true" || val == "1");
15492                }
15493                b"showLastColumn" => {
15494                    f_show_last_column = Some(val == "true" || val == "1");
15495                }
15496                #[cfg(feature = "extra-attrs")]
15497                unknown => {
15498                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15499                    extra_attrs.insert(key, val.into_owned());
15500                }
15501                #[cfg(not(feature = "extra-attrs"))]
15502                _ => {}
15503            }
15504        }
15505
15506        if !is_empty {
15507            let mut buf = Vec::new();
15508            loop {
15509                match reader.read_event_into(&mut buf)? {
15510                    Event::End(_) => break,
15511                    Event::Eof => break,
15512                    _ => {}
15513                }
15514                buf.clear();
15515            }
15516        }
15517
15518        Ok(Self {
15519            name: f_name,
15520            show_row_headers: f_show_row_headers,
15521            show_col_headers: f_show_col_headers,
15522            show_row_stripes: f_show_row_stripes,
15523            show_col_stripes: f_show_col_stripes,
15524            show_last_column: f_show_last_column,
15525            #[cfg(feature = "extra-attrs")]
15526            extra_attrs,
15527        })
15528    }
15529}
15530
15531impl FromXml for PivotFilters {
15532    fn from_xml<R: BufRead>(
15533        reader: &mut Reader<R>,
15534        start_tag: &BytesStart,
15535        is_empty: bool,
15536    ) -> Result<Self, ParseError> {
15537        let mut f_count = None;
15538        let mut f_filter = Vec::new();
15539        #[cfg(feature = "extra-attrs")]
15540        let mut extra_attrs = std::collections::HashMap::new();
15541        #[cfg(feature = "extra-children")]
15542        let mut extra_children = Vec::new();
15543        #[cfg(feature = "extra-children")]
15544        let mut child_idx: usize = 0;
15545
15546        // Parse attributes
15547        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15548            let val = String::from_utf8_lossy(&attr.value);
15549            match attr.key.local_name().as_ref() {
15550                b"count" => {
15551                    f_count = val.parse().ok();
15552                }
15553                #[cfg(feature = "extra-attrs")]
15554                unknown => {
15555                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15556                    extra_attrs.insert(key, val.into_owned());
15557                }
15558                #[cfg(not(feature = "extra-attrs"))]
15559                _ => {}
15560            }
15561        }
15562
15563        // Parse child elements
15564        if !is_empty {
15565            let mut buf = Vec::new();
15566            loop {
15567                match reader.read_event_into(&mut buf)? {
15568                    Event::Start(e) => {
15569                        match e.local_name().as_ref() {
15570                            b"filter" => {
15571                                f_filter.push(PivotFilter::from_xml(reader, &e, false)?);
15572                                #[cfg(feature = "extra-children")]
15573                                {
15574                                    child_idx += 1;
15575                                }
15576                            }
15577                            #[cfg(feature = "extra-children")]
15578                            _ => {
15579                                // Capture unknown element for roundtrip
15580                                let elem = RawXmlElement::from_reader(reader, &e)?;
15581                                extra_children.push(PositionedNode::new(
15582                                    child_idx,
15583                                    RawXmlNode::Element(elem),
15584                                ));
15585                                child_idx += 1;
15586                            }
15587                            #[cfg(not(feature = "extra-children"))]
15588                            _ => {
15589                                // Skip unknown element
15590                                skip_element(reader)?;
15591                            }
15592                        }
15593                    }
15594                    Event::Empty(e) => {
15595                        match e.local_name().as_ref() {
15596                            b"filter" => {
15597                                f_filter.push(PivotFilter::from_xml(reader, &e, true)?);
15598                                #[cfg(feature = "extra-children")]
15599                                {
15600                                    child_idx += 1;
15601                                }
15602                            }
15603                            #[cfg(feature = "extra-children")]
15604                            _ => {
15605                                // Capture unknown empty element for roundtrip
15606                                let elem = RawXmlElement::from_empty(&e);
15607                                extra_children.push(PositionedNode::new(
15608                                    child_idx,
15609                                    RawXmlNode::Element(elem),
15610                                ));
15611                                child_idx += 1;
15612                            }
15613                            #[cfg(not(feature = "extra-children"))]
15614                            _ => {}
15615                        }
15616                    }
15617                    Event::End(_) => break,
15618                    Event::Eof => break,
15619                    _ => {}
15620                }
15621                buf.clear();
15622            }
15623        }
15624
15625        Ok(Self {
15626            count: f_count,
15627            filter: f_filter,
15628            #[cfg(feature = "extra-attrs")]
15629            extra_attrs,
15630            #[cfg(feature = "extra-children")]
15631            extra_children,
15632        })
15633    }
15634}
15635
15636impl FromXml for PivotFilter {
15637    fn from_xml<R: BufRead>(
15638        reader: &mut Reader<R>,
15639        start_tag: &BytesStart,
15640        is_empty: bool,
15641    ) -> Result<Self, ParseError> {
15642        let mut f_fld: Option<u32> = None;
15643        let mut f_mp_fld = None;
15644        let mut f_type: Option<STPivotFilterType> = None;
15645        let mut f_eval_order = None;
15646        let mut f_id: Option<u32> = None;
15647        let mut f_i_measure_hier = None;
15648        let mut f_i_measure_fld = None;
15649        let mut f_name = None;
15650        let mut f_description = None;
15651        let mut f_string_value1 = None;
15652        let mut f_string_value2 = None;
15653        let mut f_auto_filter: Option<Box<AutoFilter>> = None;
15654        let mut f_extension_list = None;
15655        #[cfg(feature = "extra-attrs")]
15656        let mut extra_attrs = std::collections::HashMap::new();
15657        #[cfg(feature = "extra-children")]
15658        let mut extra_children = Vec::new();
15659        #[cfg(feature = "extra-children")]
15660        let mut child_idx: usize = 0;
15661
15662        // Parse attributes
15663        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15664            let val = String::from_utf8_lossy(&attr.value);
15665            match attr.key.local_name().as_ref() {
15666                b"fld" => {
15667                    f_fld = val.parse().ok();
15668                }
15669                b"mpFld" => {
15670                    f_mp_fld = val.parse().ok();
15671                }
15672                b"type" => {
15673                    f_type = val.parse().ok();
15674                }
15675                b"evalOrder" => {
15676                    f_eval_order = val.parse().ok();
15677                }
15678                b"id" => {
15679                    f_id = val.parse().ok();
15680                }
15681                b"iMeasureHier" => {
15682                    f_i_measure_hier = val.parse().ok();
15683                }
15684                b"iMeasureFld" => {
15685                    f_i_measure_fld = val.parse().ok();
15686                }
15687                b"name" => {
15688                    f_name = Some(val.into_owned());
15689                }
15690                b"description" => {
15691                    f_description = Some(val.into_owned());
15692                }
15693                b"stringValue1" => {
15694                    f_string_value1 = Some(val.into_owned());
15695                }
15696                b"stringValue2" => {
15697                    f_string_value2 = Some(val.into_owned());
15698                }
15699                #[cfg(feature = "extra-attrs")]
15700                unknown => {
15701                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15702                    extra_attrs.insert(key, val.into_owned());
15703                }
15704                #[cfg(not(feature = "extra-attrs"))]
15705                _ => {}
15706            }
15707        }
15708
15709        // Parse child elements
15710        if !is_empty {
15711            let mut buf = Vec::new();
15712            loop {
15713                match reader.read_event_into(&mut buf)? {
15714                    Event::Start(e) => {
15715                        match e.local_name().as_ref() {
15716                            b"autoFilter" => {
15717                                f_auto_filter =
15718                                    Some(Box::new(AutoFilter::from_xml(reader, &e, false)?));
15719                                #[cfg(feature = "extra-children")]
15720                                {
15721                                    child_idx += 1;
15722                                }
15723                            }
15724                            b"extLst" => {
15725                                f_extension_list =
15726                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
15727                                #[cfg(feature = "extra-children")]
15728                                {
15729                                    child_idx += 1;
15730                                }
15731                            }
15732                            #[cfg(feature = "extra-children")]
15733                            _ => {
15734                                // Capture unknown element for roundtrip
15735                                let elem = RawXmlElement::from_reader(reader, &e)?;
15736                                extra_children.push(PositionedNode::new(
15737                                    child_idx,
15738                                    RawXmlNode::Element(elem),
15739                                ));
15740                                child_idx += 1;
15741                            }
15742                            #[cfg(not(feature = "extra-children"))]
15743                            _ => {
15744                                // Skip unknown element
15745                                skip_element(reader)?;
15746                            }
15747                        }
15748                    }
15749                    Event::Empty(e) => {
15750                        match e.local_name().as_ref() {
15751                            b"autoFilter" => {
15752                                f_auto_filter =
15753                                    Some(Box::new(AutoFilter::from_xml(reader, &e, true)?));
15754                                #[cfg(feature = "extra-children")]
15755                                {
15756                                    child_idx += 1;
15757                                }
15758                            }
15759                            b"extLst" => {
15760                                f_extension_list =
15761                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
15762                                #[cfg(feature = "extra-children")]
15763                                {
15764                                    child_idx += 1;
15765                                }
15766                            }
15767                            #[cfg(feature = "extra-children")]
15768                            _ => {
15769                                // Capture unknown empty element for roundtrip
15770                                let elem = RawXmlElement::from_empty(&e);
15771                                extra_children.push(PositionedNode::new(
15772                                    child_idx,
15773                                    RawXmlNode::Element(elem),
15774                                ));
15775                                child_idx += 1;
15776                            }
15777                            #[cfg(not(feature = "extra-children"))]
15778                            _ => {}
15779                        }
15780                    }
15781                    Event::End(_) => break,
15782                    Event::Eof => break,
15783                    _ => {}
15784                }
15785                buf.clear();
15786            }
15787        }
15788
15789        Ok(Self {
15790            fld: f_fld.ok_or_else(|| ParseError::MissingAttribute("fld".to_string()))?,
15791            mp_fld: f_mp_fld,
15792            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
15793            eval_order: f_eval_order,
15794            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
15795            i_measure_hier: f_i_measure_hier,
15796            i_measure_fld: f_i_measure_fld,
15797            name: f_name,
15798            description: f_description,
15799            string_value1: f_string_value1,
15800            string_value2: f_string_value2,
15801            auto_filter: f_auto_filter
15802                .ok_or_else(|| ParseError::MissingAttribute("autoFilter".to_string()))?,
15803            extension_list: f_extension_list,
15804            #[cfg(feature = "extra-attrs")]
15805            extra_attrs,
15806            #[cfg(feature = "extra-children")]
15807            extra_children,
15808        })
15809    }
15810}
15811
15812impl FromXml for PivotArea {
15813    fn from_xml<R: BufRead>(
15814        reader: &mut Reader<R>,
15815        start_tag: &BytesStart,
15816        is_empty: bool,
15817    ) -> Result<Self, ParseError> {
15818        let mut f_field = None;
15819        let mut f_type = None;
15820        let mut f_data_only = None;
15821        let mut f_label_only = None;
15822        let mut f_grand_row = None;
15823        let mut f_grand_col = None;
15824        let mut f_cache_index = None;
15825        let mut f_outline = None;
15826        let mut f_offset = None;
15827        let mut f_collapsed_levels_are_subtotals = None;
15828        let mut f_axis = None;
15829        let mut f_field_position = None;
15830        let mut f_references = None;
15831        let mut f_extension_list = None;
15832        #[cfg(feature = "extra-attrs")]
15833        let mut extra_attrs = std::collections::HashMap::new();
15834        #[cfg(feature = "extra-children")]
15835        let mut extra_children = Vec::new();
15836        #[cfg(feature = "extra-children")]
15837        let mut child_idx: usize = 0;
15838
15839        // Parse attributes
15840        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
15841            let val = String::from_utf8_lossy(&attr.value);
15842            match attr.key.local_name().as_ref() {
15843                b"field" => {
15844                    f_field = val.parse().ok();
15845                }
15846                b"type" => {
15847                    f_type = val.parse().ok();
15848                }
15849                b"dataOnly" => {
15850                    f_data_only = Some(val == "true" || val == "1");
15851                }
15852                b"labelOnly" => {
15853                    f_label_only = Some(val == "true" || val == "1");
15854                }
15855                b"grandRow" => {
15856                    f_grand_row = Some(val == "true" || val == "1");
15857                }
15858                b"grandCol" => {
15859                    f_grand_col = Some(val == "true" || val == "1");
15860                }
15861                b"cacheIndex" => {
15862                    f_cache_index = Some(val == "true" || val == "1");
15863                }
15864                b"outline" => {
15865                    f_outline = Some(val == "true" || val == "1");
15866                }
15867                b"offset" => {
15868                    f_offset = Some(val.into_owned());
15869                }
15870                b"collapsedLevelsAreSubtotals" => {
15871                    f_collapsed_levels_are_subtotals = Some(val == "true" || val == "1");
15872                }
15873                b"axis" => {
15874                    f_axis = val.parse().ok();
15875                }
15876                b"fieldPosition" => {
15877                    f_field_position = val.parse().ok();
15878                }
15879                #[cfg(feature = "extra-attrs")]
15880                unknown => {
15881                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
15882                    extra_attrs.insert(key, val.into_owned());
15883                }
15884                #[cfg(not(feature = "extra-attrs"))]
15885                _ => {}
15886            }
15887        }
15888
15889        // Parse child elements
15890        if !is_empty {
15891            let mut buf = Vec::new();
15892            loop {
15893                match reader.read_event_into(&mut buf)? {
15894                    Event::Start(e) => {
15895                        match e.local_name().as_ref() {
15896                            b"references" => {
15897                                f_references = Some(Box::new(CTPivotAreaReferences::from_xml(
15898                                    reader, &e, false,
15899                                )?));
15900                                #[cfg(feature = "extra-children")]
15901                                {
15902                                    child_idx += 1;
15903                                }
15904                            }
15905                            b"extLst" => {
15906                                f_extension_list =
15907                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
15908                                #[cfg(feature = "extra-children")]
15909                                {
15910                                    child_idx += 1;
15911                                }
15912                            }
15913                            #[cfg(feature = "extra-children")]
15914                            _ => {
15915                                // Capture unknown element for roundtrip
15916                                let elem = RawXmlElement::from_reader(reader, &e)?;
15917                                extra_children.push(PositionedNode::new(
15918                                    child_idx,
15919                                    RawXmlNode::Element(elem),
15920                                ));
15921                                child_idx += 1;
15922                            }
15923                            #[cfg(not(feature = "extra-children"))]
15924                            _ => {
15925                                // Skip unknown element
15926                                skip_element(reader)?;
15927                            }
15928                        }
15929                    }
15930                    Event::Empty(e) => {
15931                        match e.local_name().as_ref() {
15932                            b"references" => {
15933                                f_references = Some(Box::new(CTPivotAreaReferences::from_xml(
15934                                    reader, &e, true,
15935                                )?));
15936                                #[cfg(feature = "extra-children")]
15937                                {
15938                                    child_idx += 1;
15939                                }
15940                            }
15941                            b"extLst" => {
15942                                f_extension_list =
15943                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
15944                                #[cfg(feature = "extra-children")]
15945                                {
15946                                    child_idx += 1;
15947                                }
15948                            }
15949                            #[cfg(feature = "extra-children")]
15950                            _ => {
15951                                // Capture unknown empty element for roundtrip
15952                                let elem = RawXmlElement::from_empty(&e);
15953                                extra_children.push(PositionedNode::new(
15954                                    child_idx,
15955                                    RawXmlNode::Element(elem),
15956                                ));
15957                                child_idx += 1;
15958                            }
15959                            #[cfg(not(feature = "extra-children"))]
15960                            _ => {}
15961                        }
15962                    }
15963                    Event::End(_) => break,
15964                    Event::Eof => break,
15965                    _ => {}
15966                }
15967                buf.clear();
15968            }
15969        }
15970
15971        Ok(Self {
15972            field: f_field,
15973            r#type: f_type,
15974            data_only: f_data_only,
15975            label_only: f_label_only,
15976            grand_row: f_grand_row,
15977            grand_col: f_grand_col,
15978            cache_index: f_cache_index,
15979            outline: f_outline,
15980            offset: f_offset,
15981            collapsed_levels_are_subtotals: f_collapsed_levels_are_subtotals,
15982            axis: f_axis,
15983            field_position: f_field_position,
15984            references: f_references,
15985            extension_list: f_extension_list,
15986            #[cfg(feature = "extra-attrs")]
15987            extra_attrs,
15988            #[cfg(feature = "extra-children")]
15989            extra_children,
15990        })
15991    }
15992}
15993
15994impl FromXml for CTPivotAreaReferences {
15995    fn from_xml<R: BufRead>(
15996        reader: &mut Reader<R>,
15997        start_tag: &BytesStart,
15998        is_empty: bool,
15999    ) -> Result<Self, ParseError> {
16000        let mut f_count = None;
16001        let mut f_reference = Vec::new();
16002        #[cfg(feature = "extra-attrs")]
16003        let mut extra_attrs = std::collections::HashMap::new();
16004        #[cfg(feature = "extra-children")]
16005        let mut extra_children = Vec::new();
16006        #[cfg(feature = "extra-children")]
16007        let mut child_idx: usize = 0;
16008
16009        // Parse attributes
16010        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16011            let val = String::from_utf8_lossy(&attr.value);
16012            match attr.key.local_name().as_ref() {
16013                b"count" => {
16014                    f_count = val.parse().ok();
16015                }
16016                #[cfg(feature = "extra-attrs")]
16017                unknown => {
16018                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16019                    extra_attrs.insert(key, val.into_owned());
16020                }
16021                #[cfg(not(feature = "extra-attrs"))]
16022                _ => {}
16023            }
16024        }
16025
16026        // Parse child elements
16027        if !is_empty {
16028            let mut buf = Vec::new();
16029            loop {
16030                match reader.read_event_into(&mut buf)? {
16031                    Event::Start(e) => {
16032                        match e.local_name().as_ref() {
16033                            b"reference" => {
16034                                f_reference
16035                                    .push(CTPivotAreaReference::from_xml(reader, &e, false)?);
16036                                #[cfg(feature = "extra-children")]
16037                                {
16038                                    child_idx += 1;
16039                                }
16040                            }
16041                            #[cfg(feature = "extra-children")]
16042                            _ => {
16043                                // Capture unknown element for roundtrip
16044                                let elem = RawXmlElement::from_reader(reader, &e)?;
16045                                extra_children.push(PositionedNode::new(
16046                                    child_idx,
16047                                    RawXmlNode::Element(elem),
16048                                ));
16049                                child_idx += 1;
16050                            }
16051                            #[cfg(not(feature = "extra-children"))]
16052                            _ => {
16053                                // Skip unknown element
16054                                skip_element(reader)?;
16055                            }
16056                        }
16057                    }
16058                    Event::Empty(e) => {
16059                        match e.local_name().as_ref() {
16060                            b"reference" => {
16061                                f_reference.push(CTPivotAreaReference::from_xml(reader, &e, true)?);
16062                                #[cfg(feature = "extra-children")]
16063                                {
16064                                    child_idx += 1;
16065                                }
16066                            }
16067                            #[cfg(feature = "extra-children")]
16068                            _ => {
16069                                // Capture unknown empty element for roundtrip
16070                                let elem = RawXmlElement::from_empty(&e);
16071                                extra_children.push(PositionedNode::new(
16072                                    child_idx,
16073                                    RawXmlNode::Element(elem),
16074                                ));
16075                                child_idx += 1;
16076                            }
16077                            #[cfg(not(feature = "extra-children"))]
16078                            _ => {}
16079                        }
16080                    }
16081                    Event::End(_) => break,
16082                    Event::Eof => break,
16083                    _ => {}
16084                }
16085                buf.clear();
16086            }
16087        }
16088
16089        Ok(Self {
16090            count: f_count,
16091            reference: f_reference,
16092            #[cfg(feature = "extra-attrs")]
16093            extra_attrs,
16094            #[cfg(feature = "extra-children")]
16095            extra_children,
16096        })
16097    }
16098}
16099
16100impl FromXml for CTPivotAreaReference {
16101    fn from_xml<R: BufRead>(
16102        reader: &mut Reader<R>,
16103        start_tag: &BytesStart,
16104        is_empty: bool,
16105    ) -> Result<Self, ParseError> {
16106        let mut f_field = None;
16107        let mut f_count = None;
16108        let mut f_selected = None;
16109        let mut f_by_position = None;
16110        let mut f_relative = None;
16111        let mut f_default_subtotal = None;
16112        let mut f_sum_subtotal = None;
16113        let mut f_count_a_subtotal = None;
16114        let mut f_avg_subtotal = None;
16115        let mut f_max_subtotal = None;
16116        let mut f_min_subtotal = None;
16117        let mut f_product_subtotal = None;
16118        let mut f_count_subtotal = None;
16119        let mut f_std_dev_subtotal = None;
16120        let mut f_std_dev_p_subtotal = None;
16121        let mut f_var_subtotal = None;
16122        let mut f_var_p_subtotal = None;
16123        let mut f_x = Vec::new();
16124        let mut f_extension_list = None;
16125        #[cfg(feature = "extra-attrs")]
16126        let mut extra_attrs = std::collections::HashMap::new();
16127        #[cfg(feature = "extra-children")]
16128        let mut extra_children = Vec::new();
16129        #[cfg(feature = "extra-children")]
16130        let mut child_idx: usize = 0;
16131
16132        // Parse attributes
16133        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16134            let val = String::from_utf8_lossy(&attr.value);
16135            match attr.key.local_name().as_ref() {
16136                b"field" => {
16137                    f_field = val.parse().ok();
16138                }
16139                b"count" => {
16140                    f_count = val.parse().ok();
16141                }
16142                b"selected" => {
16143                    f_selected = Some(val == "true" || val == "1");
16144                }
16145                b"byPosition" => {
16146                    f_by_position = Some(val == "true" || val == "1");
16147                }
16148                b"relative" => {
16149                    f_relative = Some(val == "true" || val == "1");
16150                }
16151                b"defaultSubtotal" => {
16152                    f_default_subtotal = Some(val == "true" || val == "1");
16153                }
16154                b"sumSubtotal" => {
16155                    f_sum_subtotal = Some(val == "true" || val == "1");
16156                }
16157                b"countASubtotal" => {
16158                    f_count_a_subtotal = Some(val == "true" || val == "1");
16159                }
16160                b"avgSubtotal" => {
16161                    f_avg_subtotal = Some(val == "true" || val == "1");
16162                }
16163                b"maxSubtotal" => {
16164                    f_max_subtotal = Some(val == "true" || val == "1");
16165                }
16166                b"minSubtotal" => {
16167                    f_min_subtotal = Some(val == "true" || val == "1");
16168                }
16169                b"productSubtotal" => {
16170                    f_product_subtotal = Some(val == "true" || val == "1");
16171                }
16172                b"countSubtotal" => {
16173                    f_count_subtotal = Some(val == "true" || val == "1");
16174                }
16175                b"stdDevSubtotal" => {
16176                    f_std_dev_subtotal = Some(val == "true" || val == "1");
16177                }
16178                b"stdDevPSubtotal" => {
16179                    f_std_dev_p_subtotal = Some(val == "true" || val == "1");
16180                }
16181                b"varSubtotal" => {
16182                    f_var_subtotal = Some(val == "true" || val == "1");
16183                }
16184                b"varPSubtotal" => {
16185                    f_var_p_subtotal = Some(val == "true" || val == "1");
16186                }
16187                #[cfg(feature = "extra-attrs")]
16188                unknown => {
16189                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16190                    extra_attrs.insert(key, val.into_owned());
16191                }
16192                #[cfg(not(feature = "extra-attrs"))]
16193                _ => {}
16194            }
16195        }
16196
16197        // Parse child elements
16198        if !is_empty {
16199            let mut buf = Vec::new();
16200            loop {
16201                match reader.read_event_into(&mut buf)? {
16202                    Event::Start(e) => {
16203                        match e.local_name().as_ref() {
16204                            b"x" => {
16205                                f_x.push(CTIndex::from_xml(reader, &e, false)?);
16206                                #[cfg(feature = "extra-children")]
16207                                {
16208                                    child_idx += 1;
16209                                }
16210                            }
16211                            b"extLst" => {
16212                                f_extension_list =
16213                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
16214                                #[cfg(feature = "extra-children")]
16215                                {
16216                                    child_idx += 1;
16217                                }
16218                            }
16219                            #[cfg(feature = "extra-children")]
16220                            _ => {
16221                                // Capture unknown element for roundtrip
16222                                let elem = RawXmlElement::from_reader(reader, &e)?;
16223                                extra_children.push(PositionedNode::new(
16224                                    child_idx,
16225                                    RawXmlNode::Element(elem),
16226                                ));
16227                                child_idx += 1;
16228                            }
16229                            #[cfg(not(feature = "extra-children"))]
16230                            _ => {
16231                                // Skip unknown element
16232                                skip_element(reader)?;
16233                            }
16234                        }
16235                    }
16236                    Event::Empty(e) => {
16237                        match e.local_name().as_ref() {
16238                            b"x" => {
16239                                f_x.push(CTIndex::from_xml(reader, &e, true)?);
16240                                #[cfg(feature = "extra-children")]
16241                                {
16242                                    child_idx += 1;
16243                                }
16244                            }
16245                            b"extLst" => {
16246                                f_extension_list =
16247                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
16248                                #[cfg(feature = "extra-children")]
16249                                {
16250                                    child_idx += 1;
16251                                }
16252                            }
16253                            #[cfg(feature = "extra-children")]
16254                            _ => {
16255                                // Capture unknown empty element for roundtrip
16256                                let elem = RawXmlElement::from_empty(&e);
16257                                extra_children.push(PositionedNode::new(
16258                                    child_idx,
16259                                    RawXmlNode::Element(elem),
16260                                ));
16261                                child_idx += 1;
16262                            }
16263                            #[cfg(not(feature = "extra-children"))]
16264                            _ => {}
16265                        }
16266                    }
16267                    Event::End(_) => break,
16268                    Event::Eof => break,
16269                    _ => {}
16270                }
16271                buf.clear();
16272            }
16273        }
16274
16275        Ok(Self {
16276            field: f_field,
16277            count: f_count,
16278            selected: f_selected,
16279            by_position: f_by_position,
16280            relative: f_relative,
16281            default_subtotal: f_default_subtotal,
16282            sum_subtotal: f_sum_subtotal,
16283            count_a_subtotal: f_count_a_subtotal,
16284            avg_subtotal: f_avg_subtotal,
16285            max_subtotal: f_max_subtotal,
16286            min_subtotal: f_min_subtotal,
16287            product_subtotal: f_product_subtotal,
16288            count_subtotal: f_count_subtotal,
16289            std_dev_subtotal: f_std_dev_subtotal,
16290            std_dev_p_subtotal: f_std_dev_p_subtotal,
16291            var_subtotal: f_var_subtotal,
16292            var_p_subtotal: f_var_p_subtotal,
16293            x: f_x,
16294            extension_list: f_extension_list,
16295            #[cfg(feature = "extra-attrs")]
16296            extra_attrs,
16297            #[cfg(feature = "extra-children")]
16298            extra_children,
16299        })
16300    }
16301}
16302
16303impl FromXml for CTIndex {
16304    fn from_xml<R: BufRead>(
16305        reader: &mut Reader<R>,
16306        start_tag: &BytesStart,
16307        is_empty: bool,
16308    ) -> Result<Self, ParseError> {
16309        let mut f_value: Option<u32> = None;
16310        #[cfg(feature = "extra-attrs")]
16311        let mut extra_attrs = std::collections::HashMap::new();
16312
16313        // Parse attributes
16314        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16315            let val = String::from_utf8_lossy(&attr.value);
16316            match attr.key.local_name().as_ref() {
16317                b"v" => {
16318                    f_value = val.parse().ok();
16319                }
16320                #[cfg(feature = "extra-attrs")]
16321                unknown => {
16322                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16323                    extra_attrs.insert(key, val.into_owned());
16324                }
16325                #[cfg(not(feature = "extra-attrs"))]
16326                _ => {}
16327            }
16328        }
16329
16330        if !is_empty {
16331            let mut buf = Vec::new();
16332            loop {
16333                match reader.read_event_into(&mut buf)? {
16334                    Event::End(_) => break,
16335                    Event::Eof => break,
16336                    _ => {}
16337                }
16338                buf.clear();
16339            }
16340        }
16341
16342        Ok(Self {
16343            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
16344            #[cfg(feature = "extra-attrs")]
16345            extra_attrs,
16346        })
16347    }
16348}
16349
16350impl FromXml for QueryTable {
16351    fn from_xml<R: BufRead>(
16352        reader: &mut Reader<R>,
16353        start_tag: &BytesStart,
16354        is_empty: bool,
16355    ) -> Result<Self, ParseError> {
16356        let mut f_name: Option<XmlString> = None;
16357        let mut f_headers = None;
16358        let mut f_row_numbers = None;
16359        let mut f_disable_refresh = None;
16360        let mut f_background_refresh = None;
16361        let mut f_first_background_refresh = None;
16362        let mut f_refresh_on_load = None;
16363        let mut f_grow_shrink_type = None;
16364        let mut f_fill_formulas = None;
16365        let mut f_remove_data_on_save = None;
16366        let mut f_disable_edit = None;
16367        let mut f_preserve_formatting = None;
16368        let mut f_adjust_column_width = None;
16369        let mut f_intermediate = None;
16370        let mut f_connection_id: Option<u32> = None;
16371        let mut f_auto_format_id = None;
16372        let mut f_apply_number_formats = None;
16373        let mut f_apply_border_formats = None;
16374        let mut f_apply_font_formats = None;
16375        let mut f_apply_pattern_formats = None;
16376        let mut f_apply_alignment_formats = None;
16377        let mut f_apply_width_height_formats = None;
16378        let mut f_query_table_refresh = None;
16379        let mut f_extension_list = None;
16380        #[cfg(feature = "extra-attrs")]
16381        let mut extra_attrs = std::collections::HashMap::new();
16382        #[cfg(feature = "extra-children")]
16383        let mut extra_children = Vec::new();
16384        #[cfg(feature = "extra-children")]
16385        let mut child_idx: usize = 0;
16386
16387        // Parse attributes
16388        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16389            let val = String::from_utf8_lossy(&attr.value);
16390            match attr.key.local_name().as_ref() {
16391                b"name" => {
16392                    f_name = Some(val.into_owned());
16393                }
16394                b"headers" => {
16395                    f_headers = Some(val == "true" || val == "1");
16396                }
16397                b"rowNumbers" => {
16398                    f_row_numbers = Some(val == "true" || val == "1");
16399                }
16400                b"disableRefresh" => {
16401                    f_disable_refresh = Some(val == "true" || val == "1");
16402                }
16403                b"backgroundRefresh" => {
16404                    f_background_refresh = Some(val == "true" || val == "1");
16405                }
16406                b"firstBackgroundRefresh" => {
16407                    f_first_background_refresh = Some(val == "true" || val == "1");
16408                }
16409                b"refreshOnLoad" => {
16410                    f_refresh_on_load = Some(val == "true" || val == "1");
16411                }
16412                b"growShrinkType" => {
16413                    f_grow_shrink_type = val.parse().ok();
16414                }
16415                b"fillFormulas" => {
16416                    f_fill_formulas = Some(val == "true" || val == "1");
16417                }
16418                b"removeDataOnSave" => {
16419                    f_remove_data_on_save = Some(val == "true" || val == "1");
16420                }
16421                b"disableEdit" => {
16422                    f_disable_edit = Some(val == "true" || val == "1");
16423                }
16424                b"preserveFormatting" => {
16425                    f_preserve_formatting = Some(val == "true" || val == "1");
16426                }
16427                b"adjustColumnWidth" => {
16428                    f_adjust_column_width = Some(val == "true" || val == "1");
16429                }
16430                b"intermediate" => {
16431                    f_intermediate = Some(val == "true" || val == "1");
16432                }
16433                b"connectionId" => {
16434                    f_connection_id = val.parse().ok();
16435                }
16436                b"autoFormatId" => {
16437                    f_auto_format_id = val.parse().ok();
16438                }
16439                b"applyNumberFormats" => {
16440                    f_apply_number_formats = Some(val == "true" || val == "1");
16441                }
16442                b"applyBorderFormats" => {
16443                    f_apply_border_formats = Some(val == "true" || val == "1");
16444                }
16445                b"applyFontFormats" => {
16446                    f_apply_font_formats = Some(val == "true" || val == "1");
16447                }
16448                b"applyPatternFormats" => {
16449                    f_apply_pattern_formats = Some(val == "true" || val == "1");
16450                }
16451                b"applyAlignmentFormats" => {
16452                    f_apply_alignment_formats = Some(val == "true" || val == "1");
16453                }
16454                b"applyWidthHeightFormats" => {
16455                    f_apply_width_height_formats = Some(val == "true" || val == "1");
16456                }
16457                #[cfg(feature = "extra-attrs")]
16458                unknown => {
16459                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16460                    extra_attrs.insert(key, val.into_owned());
16461                }
16462                #[cfg(not(feature = "extra-attrs"))]
16463                _ => {}
16464            }
16465        }
16466
16467        // Parse child elements
16468        if !is_empty {
16469            let mut buf = Vec::new();
16470            loop {
16471                match reader.read_event_into(&mut buf)? {
16472                    Event::Start(e) => {
16473                        match e.local_name().as_ref() {
16474                            b"queryTableRefresh" => {
16475                                f_query_table_refresh =
16476                                    Some(Box::new(QueryTableRefresh::from_xml(reader, &e, false)?));
16477                                #[cfg(feature = "extra-children")]
16478                                {
16479                                    child_idx += 1;
16480                                }
16481                            }
16482                            b"extLst" => {
16483                                f_extension_list =
16484                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
16485                                #[cfg(feature = "extra-children")]
16486                                {
16487                                    child_idx += 1;
16488                                }
16489                            }
16490                            #[cfg(feature = "extra-children")]
16491                            _ => {
16492                                // Capture unknown element for roundtrip
16493                                let elem = RawXmlElement::from_reader(reader, &e)?;
16494                                extra_children.push(PositionedNode::new(
16495                                    child_idx,
16496                                    RawXmlNode::Element(elem),
16497                                ));
16498                                child_idx += 1;
16499                            }
16500                            #[cfg(not(feature = "extra-children"))]
16501                            _ => {
16502                                // Skip unknown element
16503                                skip_element(reader)?;
16504                            }
16505                        }
16506                    }
16507                    Event::Empty(e) => {
16508                        match e.local_name().as_ref() {
16509                            b"queryTableRefresh" => {
16510                                f_query_table_refresh =
16511                                    Some(Box::new(QueryTableRefresh::from_xml(reader, &e, true)?));
16512                                #[cfg(feature = "extra-children")]
16513                                {
16514                                    child_idx += 1;
16515                                }
16516                            }
16517                            b"extLst" => {
16518                                f_extension_list =
16519                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
16520                                #[cfg(feature = "extra-children")]
16521                                {
16522                                    child_idx += 1;
16523                                }
16524                            }
16525                            #[cfg(feature = "extra-children")]
16526                            _ => {
16527                                // Capture unknown empty element for roundtrip
16528                                let elem = RawXmlElement::from_empty(&e);
16529                                extra_children.push(PositionedNode::new(
16530                                    child_idx,
16531                                    RawXmlNode::Element(elem),
16532                                ));
16533                                child_idx += 1;
16534                            }
16535                            #[cfg(not(feature = "extra-children"))]
16536                            _ => {}
16537                        }
16538                    }
16539                    Event::End(_) => break,
16540                    Event::Eof => break,
16541                    _ => {}
16542                }
16543                buf.clear();
16544            }
16545        }
16546
16547        Ok(Self {
16548            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
16549            headers: f_headers,
16550            row_numbers: f_row_numbers,
16551            disable_refresh: f_disable_refresh,
16552            background_refresh: f_background_refresh,
16553            first_background_refresh: f_first_background_refresh,
16554            refresh_on_load: f_refresh_on_load,
16555            grow_shrink_type: f_grow_shrink_type,
16556            fill_formulas: f_fill_formulas,
16557            remove_data_on_save: f_remove_data_on_save,
16558            disable_edit: f_disable_edit,
16559            preserve_formatting: f_preserve_formatting,
16560            adjust_column_width: f_adjust_column_width,
16561            intermediate: f_intermediate,
16562            connection_id: f_connection_id
16563                .ok_or_else(|| ParseError::MissingAttribute("connectionId".to_string()))?,
16564            auto_format_id: f_auto_format_id,
16565            apply_number_formats: f_apply_number_formats,
16566            apply_border_formats: f_apply_border_formats,
16567            apply_font_formats: f_apply_font_formats,
16568            apply_pattern_formats: f_apply_pattern_formats,
16569            apply_alignment_formats: f_apply_alignment_formats,
16570            apply_width_height_formats: f_apply_width_height_formats,
16571            query_table_refresh: f_query_table_refresh,
16572            extension_list: f_extension_list,
16573            #[cfg(feature = "extra-attrs")]
16574            extra_attrs,
16575            #[cfg(feature = "extra-children")]
16576            extra_children,
16577        })
16578    }
16579}
16580
16581impl FromXml for QueryTableRefresh {
16582    fn from_xml<R: BufRead>(
16583        reader: &mut Reader<R>,
16584        start_tag: &BytesStart,
16585        is_empty: bool,
16586    ) -> Result<Self, ParseError> {
16587        let mut f_preserve_sort_filter_layout = None;
16588        let mut f_field_id_wrapped = None;
16589        let mut f_headers_in_last_refresh = None;
16590        let mut f_minimum_version = None;
16591        let mut f_next_id = None;
16592        let mut f_unbound_columns_left = None;
16593        let mut f_unbound_columns_right = None;
16594        let mut f_query_table_fields: Option<Box<QueryTableFields>> = None;
16595        let mut f_query_table_deleted_fields = None;
16596        let mut f_sort_state = None;
16597        let mut f_extension_list = None;
16598        #[cfg(feature = "extra-attrs")]
16599        let mut extra_attrs = std::collections::HashMap::new();
16600        #[cfg(feature = "extra-children")]
16601        let mut extra_children = Vec::new();
16602        #[cfg(feature = "extra-children")]
16603        let mut child_idx: usize = 0;
16604
16605        // Parse attributes
16606        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16607            let val = String::from_utf8_lossy(&attr.value);
16608            match attr.key.local_name().as_ref() {
16609                b"preserveSortFilterLayout" => {
16610                    f_preserve_sort_filter_layout = Some(val == "true" || val == "1");
16611                }
16612                b"fieldIdWrapped" => {
16613                    f_field_id_wrapped = Some(val == "true" || val == "1");
16614                }
16615                b"headersInLastRefresh" => {
16616                    f_headers_in_last_refresh = Some(val == "true" || val == "1");
16617                }
16618                b"minimumVersion" => {
16619                    f_minimum_version = val.parse().ok();
16620                }
16621                b"nextId" => {
16622                    f_next_id = val.parse().ok();
16623                }
16624                b"unboundColumnsLeft" => {
16625                    f_unbound_columns_left = val.parse().ok();
16626                }
16627                b"unboundColumnsRight" => {
16628                    f_unbound_columns_right = val.parse().ok();
16629                }
16630                #[cfg(feature = "extra-attrs")]
16631                unknown => {
16632                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16633                    extra_attrs.insert(key, val.into_owned());
16634                }
16635                #[cfg(not(feature = "extra-attrs"))]
16636                _ => {}
16637            }
16638        }
16639
16640        // Parse child elements
16641        if !is_empty {
16642            let mut buf = Vec::new();
16643            loop {
16644                match reader.read_event_into(&mut buf)? {
16645                    Event::Start(e) => {
16646                        match e.local_name().as_ref() {
16647                            b"queryTableFields" => {
16648                                f_query_table_fields =
16649                                    Some(Box::new(QueryTableFields::from_xml(reader, &e, false)?));
16650                                #[cfg(feature = "extra-children")]
16651                                {
16652                                    child_idx += 1;
16653                                }
16654                            }
16655                            b"queryTableDeletedFields" => {
16656                                f_query_table_deleted_fields = Some(Box::new(
16657                                    QueryTableDeletedFields::from_xml(reader, &e, false)?,
16658                                ));
16659                                #[cfg(feature = "extra-children")]
16660                                {
16661                                    child_idx += 1;
16662                                }
16663                            }
16664                            b"sortState" => {
16665                                f_sort_state =
16666                                    Some(Box::new(SortState::from_xml(reader, &e, false)?));
16667                                #[cfg(feature = "extra-children")]
16668                                {
16669                                    child_idx += 1;
16670                                }
16671                            }
16672                            b"extLst" => {
16673                                f_extension_list =
16674                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
16675                                #[cfg(feature = "extra-children")]
16676                                {
16677                                    child_idx += 1;
16678                                }
16679                            }
16680                            #[cfg(feature = "extra-children")]
16681                            _ => {
16682                                // Capture unknown element for roundtrip
16683                                let elem = RawXmlElement::from_reader(reader, &e)?;
16684                                extra_children.push(PositionedNode::new(
16685                                    child_idx,
16686                                    RawXmlNode::Element(elem),
16687                                ));
16688                                child_idx += 1;
16689                            }
16690                            #[cfg(not(feature = "extra-children"))]
16691                            _ => {
16692                                // Skip unknown element
16693                                skip_element(reader)?;
16694                            }
16695                        }
16696                    }
16697                    Event::Empty(e) => {
16698                        match e.local_name().as_ref() {
16699                            b"queryTableFields" => {
16700                                f_query_table_fields =
16701                                    Some(Box::new(QueryTableFields::from_xml(reader, &e, true)?));
16702                                #[cfg(feature = "extra-children")]
16703                                {
16704                                    child_idx += 1;
16705                                }
16706                            }
16707                            b"queryTableDeletedFields" => {
16708                                f_query_table_deleted_fields = Some(Box::new(
16709                                    QueryTableDeletedFields::from_xml(reader, &e, true)?,
16710                                ));
16711                                #[cfg(feature = "extra-children")]
16712                                {
16713                                    child_idx += 1;
16714                                }
16715                            }
16716                            b"sortState" => {
16717                                f_sort_state =
16718                                    Some(Box::new(SortState::from_xml(reader, &e, true)?));
16719                                #[cfg(feature = "extra-children")]
16720                                {
16721                                    child_idx += 1;
16722                                }
16723                            }
16724                            b"extLst" => {
16725                                f_extension_list =
16726                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
16727                                #[cfg(feature = "extra-children")]
16728                                {
16729                                    child_idx += 1;
16730                                }
16731                            }
16732                            #[cfg(feature = "extra-children")]
16733                            _ => {
16734                                // Capture unknown empty element for roundtrip
16735                                let elem = RawXmlElement::from_empty(&e);
16736                                extra_children.push(PositionedNode::new(
16737                                    child_idx,
16738                                    RawXmlNode::Element(elem),
16739                                ));
16740                                child_idx += 1;
16741                            }
16742                            #[cfg(not(feature = "extra-children"))]
16743                            _ => {}
16744                        }
16745                    }
16746                    Event::End(_) => break,
16747                    Event::Eof => break,
16748                    _ => {}
16749                }
16750                buf.clear();
16751            }
16752        }
16753
16754        Ok(Self {
16755            preserve_sort_filter_layout: f_preserve_sort_filter_layout,
16756            field_id_wrapped: f_field_id_wrapped,
16757            headers_in_last_refresh: f_headers_in_last_refresh,
16758            minimum_version: f_minimum_version,
16759            next_id: f_next_id,
16760            unbound_columns_left: f_unbound_columns_left,
16761            unbound_columns_right: f_unbound_columns_right,
16762            query_table_fields: f_query_table_fields
16763                .ok_or_else(|| ParseError::MissingAttribute("queryTableFields".to_string()))?,
16764            query_table_deleted_fields: f_query_table_deleted_fields,
16765            sort_state: f_sort_state,
16766            extension_list: f_extension_list,
16767            #[cfg(feature = "extra-attrs")]
16768            extra_attrs,
16769            #[cfg(feature = "extra-children")]
16770            extra_children,
16771        })
16772    }
16773}
16774
16775impl FromXml for QueryTableDeletedFields {
16776    fn from_xml<R: BufRead>(
16777        reader: &mut Reader<R>,
16778        start_tag: &BytesStart,
16779        is_empty: bool,
16780    ) -> Result<Self, ParseError> {
16781        let mut f_count = None;
16782        let mut f_deleted_field = Vec::new();
16783        #[cfg(feature = "extra-attrs")]
16784        let mut extra_attrs = std::collections::HashMap::new();
16785        #[cfg(feature = "extra-children")]
16786        let mut extra_children = Vec::new();
16787        #[cfg(feature = "extra-children")]
16788        let mut child_idx: usize = 0;
16789
16790        // Parse attributes
16791        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16792            let val = String::from_utf8_lossy(&attr.value);
16793            match attr.key.local_name().as_ref() {
16794                b"count" => {
16795                    f_count = val.parse().ok();
16796                }
16797                #[cfg(feature = "extra-attrs")]
16798                unknown => {
16799                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16800                    extra_attrs.insert(key, val.into_owned());
16801                }
16802                #[cfg(not(feature = "extra-attrs"))]
16803                _ => {}
16804            }
16805        }
16806
16807        // Parse child elements
16808        if !is_empty {
16809            let mut buf = Vec::new();
16810            loop {
16811                match reader.read_event_into(&mut buf)? {
16812                    Event::Start(e) => {
16813                        match e.local_name().as_ref() {
16814                            b"deletedField" => {
16815                                f_deleted_field.push(CTDeletedField::from_xml(reader, &e, false)?);
16816                                #[cfg(feature = "extra-children")]
16817                                {
16818                                    child_idx += 1;
16819                                }
16820                            }
16821                            #[cfg(feature = "extra-children")]
16822                            _ => {
16823                                // Capture unknown element for roundtrip
16824                                let elem = RawXmlElement::from_reader(reader, &e)?;
16825                                extra_children.push(PositionedNode::new(
16826                                    child_idx,
16827                                    RawXmlNode::Element(elem),
16828                                ));
16829                                child_idx += 1;
16830                            }
16831                            #[cfg(not(feature = "extra-children"))]
16832                            _ => {
16833                                // Skip unknown element
16834                                skip_element(reader)?;
16835                            }
16836                        }
16837                    }
16838                    Event::Empty(e) => {
16839                        match e.local_name().as_ref() {
16840                            b"deletedField" => {
16841                                f_deleted_field.push(CTDeletedField::from_xml(reader, &e, true)?);
16842                                #[cfg(feature = "extra-children")]
16843                                {
16844                                    child_idx += 1;
16845                                }
16846                            }
16847                            #[cfg(feature = "extra-children")]
16848                            _ => {
16849                                // Capture unknown empty element for roundtrip
16850                                let elem = RawXmlElement::from_empty(&e);
16851                                extra_children.push(PositionedNode::new(
16852                                    child_idx,
16853                                    RawXmlNode::Element(elem),
16854                                ));
16855                                child_idx += 1;
16856                            }
16857                            #[cfg(not(feature = "extra-children"))]
16858                            _ => {}
16859                        }
16860                    }
16861                    Event::End(_) => break,
16862                    Event::Eof => break,
16863                    _ => {}
16864                }
16865                buf.clear();
16866            }
16867        }
16868
16869        Ok(Self {
16870            count: f_count,
16871            deleted_field: f_deleted_field,
16872            #[cfg(feature = "extra-attrs")]
16873            extra_attrs,
16874            #[cfg(feature = "extra-children")]
16875            extra_children,
16876        })
16877    }
16878}
16879
16880impl FromXml for CTDeletedField {
16881    fn from_xml<R: BufRead>(
16882        reader: &mut Reader<R>,
16883        start_tag: &BytesStart,
16884        is_empty: bool,
16885    ) -> Result<Self, ParseError> {
16886        let mut f_name: Option<XmlString> = None;
16887        #[cfg(feature = "extra-attrs")]
16888        let mut extra_attrs = std::collections::HashMap::new();
16889
16890        // Parse attributes
16891        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16892            let val = String::from_utf8_lossy(&attr.value);
16893            match attr.key.local_name().as_ref() {
16894                b"name" => {
16895                    f_name = Some(val.into_owned());
16896                }
16897                #[cfg(feature = "extra-attrs")]
16898                unknown => {
16899                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16900                    extra_attrs.insert(key, val.into_owned());
16901                }
16902                #[cfg(not(feature = "extra-attrs"))]
16903                _ => {}
16904            }
16905        }
16906
16907        if !is_empty {
16908            let mut buf = Vec::new();
16909            loop {
16910                match reader.read_event_into(&mut buf)? {
16911                    Event::End(_) => break,
16912                    Event::Eof => break,
16913                    _ => {}
16914                }
16915                buf.clear();
16916            }
16917        }
16918
16919        Ok(Self {
16920            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
16921            #[cfg(feature = "extra-attrs")]
16922            extra_attrs,
16923        })
16924    }
16925}
16926
16927impl FromXml for QueryTableFields {
16928    fn from_xml<R: BufRead>(
16929        reader: &mut Reader<R>,
16930        start_tag: &BytesStart,
16931        is_empty: bool,
16932    ) -> Result<Self, ParseError> {
16933        let mut f_count = None;
16934        let mut f_query_table_field = Vec::new();
16935        #[cfg(feature = "extra-attrs")]
16936        let mut extra_attrs = std::collections::HashMap::new();
16937        #[cfg(feature = "extra-children")]
16938        let mut extra_children = Vec::new();
16939        #[cfg(feature = "extra-children")]
16940        let mut child_idx: usize = 0;
16941
16942        // Parse attributes
16943        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
16944            let val = String::from_utf8_lossy(&attr.value);
16945            match attr.key.local_name().as_ref() {
16946                b"count" => {
16947                    f_count = val.parse().ok();
16948                }
16949                #[cfg(feature = "extra-attrs")]
16950                unknown => {
16951                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
16952                    extra_attrs.insert(key, val.into_owned());
16953                }
16954                #[cfg(not(feature = "extra-attrs"))]
16955                _ => {}
16956            }
16957        }
16958
16959        // Parse child elements
16960        if !is_empty {
16961            let mut buf = Vec::new();
16962            loop {
16963                match reader.read_event_into(&mut buf)? {
16964                    Event::Start(e) => {
16965                        match e.local_name().as_ref() {
16966                            b"queryTableField" => {
16967                                f_query_table_field
16968                                    .push(QueryTableField::from_xml(reader, &e, false)?);
16969                                #[cfg(feature = "extra-children")]
16970                                {
16971                                    child_idx += 1;
16972                                }
16973                            }
16974                            #[cfg(feature = "extra-children")]
16975                            _ => {
16976                                // Capture unknown element for roundtrip
16977                                let elem = RawXmlElement::from_reader(reader, &e)?;
16978                                extra_children.push(PositionedNode::new(
16979                                    child_idx,
16980                                    RawXmlNode::Element(elem),
16981                                ));
16982                                child_idx += 1;
16983                            }
16984                            #[cfg(not(feature = "extra-children"))]
16985                            _ => {
16986                                // Skip unknown element
16987                                skip_element(reader)?;
16988                            }
16989                        }
16990                    }
16991                    Event::Empty(e) => {
16992                        match e.local_name().as_ref() {
16993                            b"queryTableField" => {
16994                                f_query_table_field
16995                                    .push(QueryTableField::from_xml(reader, &e, true)?);
16996                                #[cfg(feature = "extra-children")]
16997                                {
16998                                    child_idx += 1;
16999                                }
17000                            }
17001                            #[cfg(feature = "extra-children")]
17002                            _ => {
17003                                // Capture unknown empty element for roundtrip
17004                                let elem = RawXmlElement::from_empty(&e);
17005                                extra_children.push(PositionedNode::new(
17006                                    child_idx,
17007                                    RawXmlNode::Element(elem),
17008                                ));
17009                                child_idx += 1;
17010                            }
17011                            #[cfg(not(feature = "extra-children"))]
17012                            _ => {}
17013                        }
17014                    }
17015                    Event::End(_) => break,
17016                    Event::Eof => break,
17017                    _ => {}
17018                }
17019                buf.clear();
17020            }
17021        }
17022
17023        Ok(Self {
17024            count: f_count,
17025            query_table_field: f_query_table_field,
17026            #[cfg(feature = "extra-attrs")]
17027            extra_attrs,
17028            #[cfg(feature = "extra-children")]
17029            extra_children,
17030        })
17031    }
17032}
17033
17034impl FromXml for QueryTableField {
17035    fn from_xml<R: BufRead>(
17036        reader: &mut Reader<R>,
17037        start_tag: &BytesStart,
17038        is_empty: bool,
17039    ) -> Result<Self, ParseError> {
17040        let mut f_id: Option<u32> = None;
17041        let mut f_name = None;
17042        let mut f_data_bound = None;
17043        let mut f_row_numbers = None;
17044        let mut f_fill_formulas = None;
17045        let mut f_clipped = None;
17046        let mut f_table_column_id = None;
17047        let mut f_extension_list = None;
17048        #[cfg(feature = "extra-attrs")]
17049        let mut extra_attrs = std::collections::HashMap::new();
17050        #[cfg(feature = "extra-children")]
17051        let mut extra_children = Vec::new();
17052        #[cfg(feature = "extra-children")]
17053        let mut child_idx: usize = 0;
17054
17055        // Parse attributes
17056        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
17057            let val = String::from_utf8_lossy(&attr.value);
17058            match attr.key.local_name().as_ref() {
17059                b"id" => {
17060                    f_id = val.parse().ok();
17061                }
17062                b"name" => {
17063                    f_name = Some(val.into_owned());
17064                }
17065                b"dataBound" => {
17066                    f_data_bound = Some(val == "true" || val == "1");
17067                }
17068                b"rowNumbers" => {
17069                    f_row_numbers = Some(val == "true" || val == "1");
17070                }
17071                b"fillFormulas" => {
17072                    f_fill_formulas = Some(val == "true" || val == "1");
17073                }
17074                b"clipped" => {
17075                    f_clipped = Some(val == "true" || val == "1");
17076                }
17077                b"tableColumnId" => {
17078                    f_table_column_id = val.parse().ok();
17079                }
17080                #[cfg(feature = "extra-attrs")]
17081                unknown => {
17082                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
17083                    extra_attrs.insert(key, val.into_owned());
17084                }
17085                #[cfg(not(feature = "extra-attrs"))]
17086                _ => {}
17087            }
17088        }
17089
17090        // Parse child elements
17091        if !is_empty {
17092            let mut buf = Vec::new();
17093            loop {
17094                match reader.read_event_into(&mut buf)? {
17095                    Event::Start(e) => {
17096                        match e.local_name().as_ref() {
17097                            b"extLst" => {
17098                                f_extension_list =
17099                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
17100                                #[cfg(feature = "extra-children")]
17101                                {
17102                                    child_idx += 1;
17103                                }
17104                            }
17105                            #[cfg(feature = "extra-children")]
17106                            _ => {
17107                                // Capture unknown element for roundtrip
17108                                let elem = RawXmlElement::from_reader(reader, &e)?;
17109                                extra_children.push(PositionedNode::new(
17110                                    child_idx,
17111                                    RawXmlNode::Element(elem),
17112                                ));
17113                                child_idx += 1;
17114                            }
17115                            #[cfg(not(feature = "extra-children"))]
17116                            _ => {
17117                                // Skip unknown element
17118                                skip_element(reader)?;
17119                            }
17120                        }
17121                    }
17122                    Event::Empty(e) => {
17123                        match e.local_name().as_ref() {
17124                            b"extLst" => {
17125                                f_extension_list =
17126                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
17127                                #[cfg(feature = "extra-children")]
17128                                {
17129                                    child_idx += 1;
17130                                }
17131                            }
17132                            #[cfg(feature = "extra-children")]
17133                            _ => {
17134                                // Capture unknown empty element for roundtrip
17135                                let elem = RawXmlElement::from_empty(&e);
17136                                extra_children.push(PositionedNode::new(
17137                                    child_idx,
17138                                    RawXmlNode::Element(elem),
17139                                ));
17140                                child_idx += 1;
17141                            }
17142                            #[cfg(not(feature = "extra-children"))]
17143                            _ => {}
17144                        }
17145                    }
17146                    Event::End(_) => break,
17147                    Event::Eof => break,
17148                    _ => {}
17149                }
17150                buf.clear();
17151            }
17152        }
17153
17154        Ok(Self {
17155            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
17156            name: f_name,
17157            data_bound: f_data_bound,
17158            row_numbers: f_row_numbers,
17159            fill_formulas: f_fill_formulas,
17160            clipped: f_clipped,
17161            table_column_id: f_table_column_id,
17162            extension_list: f_extension_list,
17163            #[cfg(feature = "extra-attrs")]
17164            extra_attrs,
17165            #[cfg(feature = "extra-children")]
17166            extra_children,
17167        })
17168    }
17169}
17170
17171impl FromXml for SharedStrings {
17172    fn from_xml<R: BufRead>(
17173        reader: &mut Reader<R>,
17174        start_tag: &BytesStart,
17175        is_empty: bool,
17176    ) -> Result<Self, ParseError> {
17177        let mut f_count = None;
17178        let mut f_unique_count = None;
17179        let mut f_si = Vec::new();
17180        let mut f_extension_list = None;
17181        #[cfg(feature = "extra-attrs")]
17182        let mut extra_attrs = std::collections::HashMap::new();
17183        #[cfg(feature = "extra-children")]
17184        let mut extra_children = Vec::new();
17185        #[cfg(feature = "extra-children")]
17186        let mut child_idx: usize = 0;
17187
17188        // Parse attributes
17189        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
17190            let val = String::from_utf8_lossy(&attr.value);
17191            match attr.key.local_name().as_ref() {
17192                b"count" => {
17193                    f_count = val.parse().ok();
17194                }
17195                b"uniqueCount" => {
17196                    f_unique_count = val.parse().ok();
17197                }
17198                #[cfg(feature = "extra-attrs")]
17199                unknown => {
17200                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
17201                    extra_attrs.insert(key, val.into_owned());
17202                }
17203                #[cfg(not(feature = "extra-attrs"))]
17204                _ => {}
17205            }
17206        }
17207
17208        // Parse child elements
17209        if !is_empty {
17210            let mut buf = Vec::new();
17211            loop {
17212                match reader.read_event_into(&mut buf)? {
17213                    Event::Start(e) => {
17214                        match e.local_name().as_ref() {
17215                            b"si" => {
17216                                f_si.push(RichString::from_xml(reader, &e, false)?);
17217                                #[cfg(feature = "extra-children")]
17218                                {
17219                                    child_idx += 1;
17220                                }
17221                            }
17222                            b"extLst" => {
17223                                f_extension_list =
17224                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
17225                                #[cfg(feature = "extra-children")]
17226                                {
17227                                    child_idx += 1;
17228                                }
17229                            }
17230                            #[cfg(feature = "extra-children")]
17231                            _ => {
17232                                // Capture unknown element for roundtrip
17233                                let elem = RawXmlElement::from_reader(reader, &e)?;
17234                                extra_children.push(PositionedNode::new(
17235                                    child_idx,
17236                                    RawXmlNode::Element(elem),
17237                                ));
17238                                child_idx += 1;
17239                            }
17240                            #[cfg(not(feature = "extra-children"))]
17241                            _ => {
17242                                // Skip unknown element
17243                                skip_element(reader)?;
17244                            }
17245                        }
17246                    }
17247                    Event::Empty(e) => {
17248                        match e.local_name().as_ref() {
17249                            b"si" => {
17250                                f_si.push(RichString::from_xml(reader, &e, true)?);
17251                                #[cfg(feature = "extra-children")]
17252                                {
17253                                    child_idx += 1;
17254                                }
17255                            }
17256                            b"extLst" => {
17257                                f_extension_list =
17258                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
17259                                #[cfg(feature = "extra-children")]
17260                                {
17261                                    child_idx += 1;
17262                                }
17263                            }
17264                            #[cfg(feature = "extra-children")]
17265                            _ => {
17266                                // Capture unknown empty element for roundtrip
17267                                let elem = RawXmlElement::from_empty(&e);
17268                                extra_children.push(PositionedNode::new(
17269                                    child_idx,
17270                                    RawXmlNode::Element(elem),
17271                                ));
17272                                child_idx += 1;
17273                            }
17274                            #[cfg(not(feature = "extra-children"))]
17275                            _ => {}
17276                        }
17277                    }
17278                    Event::End(_) => break,
17279                    Event::Eof => break,
17280                    _ => {}
17281                }
17282                buf.clear();
17283            }
17284        }
17285
17286        Ok(Self {
17287            count: f_count,
17288            unique_count: f_unique_count,
17289            si: f_si,
17290            extension_list: f_extension_list,
17291            #[cfg(feature = "extra-attrs")]
17292            extra_attrs,
17293            #[cfg(feature = "extra-children")]
17294            extra_children,
17295        })
17296    }
17297}
17298
17299impl FromXml for PhoneticRun {
17300    fn from_xml<R: BufRead>(
17301        reader: &mut Reader<R>,
17302        start_tag: &BytesStart,
17303        is_empty: bool,
17304    ) -> Result<Self, ParseError> {
17305        let mut f_sb: Option<u32> = None;
17306        let mut f_eb: Option<u32> = None;
17307        let mut f_cell_type: Option<XmlString> = None;
17308        #[cfg(feature = "extra-attrs")]
17309        let mut extra_attrs = std::collections::HashMap::new();
17310        #[cfg(feature = "extra-children")]
17311        let mut extra_children = Vec::new();
17312        #[cfg(feature = "extra-children")]
17313        let mut child_idx: usize = 0;
17314
17315        // Parse attributes
17316        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
17317            let val = String::from_utf8_lossy(&attr.value);
17318            match attr.key.local_name().as_ref() {
17319                b"sb" => {
17320                    f_sb = val.parse().ok();
17321                }
17322                b"eb" => {
17323                    f_eb = val.parse().ok();
17324                }
17325                #[cfg(feature = "extra-attrs")]
17326                unknown => {
17327                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
17328                    extra_attrs.insert(key, val.into_owned());
17329                }
17330                #[cfg(not(feature = "extra-attrs"))]
17331                _ => {}
17332            }
17333        }
17334
17335        // Parse child elements
17336        if !is_empty {
17337            let mut buf = Vec::new();
17338            loop {
17339                match reader.read_event_into(&mut buf)? {
17340                    Event::Start(e) => {
17341                        match e.local_name().as_ref() {
17342                            b"t" => {
17343                                f_cell_type = Some(read_text_content(reader)?);
17344                                #[cfg(feature = "extra-children")]
17345                                {
17346                                    child_idx += 1;
17347                                }
17348                            }
17349                            #[cfg(feature = "extra-children")]
17350                            _ => {
17351                                // Capture unknown element for roundtrip
17352                                let elem = RawXmlElement::from_reader(reader, &e)?;
17353                                extra_children.push(PositionedNode::new(
17354                                    child_idx,
17355                                    RawXmlNode::Element(elem),
17356                                ));
17357                                child_idx += 1;
17358                            }
17359                            #[cfg(not(feature = "extra-children"))]
17360                            _ => {
17361                                // Skip unknown element
17362                                skip_element(reader)?;
17363                            }
17364                        }
17365                    }
17366                    Event::Empty(e) => {
17367                        match e.local_name().as_ref() {
17368                            b"t" => {
17369                                f_cell_type = Some(String::new());
17370                                #[cfg(feature = "extra-children")]
17371                                {
17372                                    child_idx += 1;
17373                                }
17374                            }
17375                            #[cfg(feature = "extra-children")]
17376                            _ => {
17377                                // Capture unknown empty element for roundtrip
17378                                let elem = RawXmlElement::from_empty(&e);
17379                                extra_children.push(PositionedNode::new(
17380                                    child_idx,
17381                                    RawXmlNode::Element(elem),
17382                                ));
17383                                child_idx += 1;
17384                            }
17385                            #[cfg(not(feature = "extra-children"))]
17386                            _ => {}
17387                        }
17388                    }
17389                    Event::End(_) => break,
17390                    Event::Eof => break,
17391                    _ => {}
17392                }
17393                buf.clear();
17394            }
17395        }
17396
17397        Ok(Self {
17398            sb: f_sb.ok_or_else(|| ParseError::MissingAttribute("sb".to_string()))?,
17399            eb: f_eb.ok_or_else(|| ParseError::MissingAttribute("eb".to_string()))?,
17400            cell_type: f_cell_type.ok_or_else(|| ParseError::MissingAttribute("t".to_string()))?,
17401            #[cfg(feature = "extra-attrs")]
17402            extra_attrs,
17403            #[cfg(feature = "extra-children")]
17404            extra_children,
17405        })
17406    }
17407}
17408
17409impl FromXml for RichTextElement {
17410    fn from_xml<R: BufRead>(
17411        reader: &mut Reader<R>,
17412        start_tag: &BytesStart,
17413        is_empty: bool,
17414    ) -> Result<Self, ParseError> {
17415        let mut f_r_pr = None;
17416        let mut f_cell_type: Option<XmlString> = None;
17417        #[cfg(feature = "extra-children")]
17418        let mut extra_children = Vec::new();
17419        #[cfg(feature = "extra-children")]
17420        let mut child_idx: usize = 0;
17421
17422        // Parse child elements
17423        if !is_empty {
17424            let mut buf = Vec::new();
17425            loop {
17426                match reader.read_event_into(&mut buf)? {
17427                    Event::Start(e) => {
17428                        match e.local_name().as_ref() {
17429                            b"rPr" => {
17430                                f_r_pr = Some(Box::new(RichTextRunProperties::from_xml(
17431                                    reader, &e, false,
17432                                )?));
17433                                #[cfg(feature = "extra-children")]
17434                                {
17435                                    child_idx += 1;
17436                                }
17437                            }
17438                            b"t" => {
17439                                f_cell_type = Some(read_text_content(reader)?);
17440                                #[cfg(feature = "extra-children")]
17441                                {
17442                                    child_idx += 1;
17443                                }
17444                            }
17445                            #[cfg(feature = "extra-children")]
17446                            _ => {
17447                                // Capture unknown element for roundtrip
17448                                let elem = RawXmlElement::from_reader(reader, &e)?;
17449                                extra_children.push(PositionedNode::new(
17450                                    child_idx,
17451                                    RawXmlNode::Element(elem),
17452                                ));
17453                                child_idx += 1;
17454                            }
17455                            #[cfg(not(feature = "extra-children"))]
17456                            _ => {
17457                                // Skip unknown element
17458                                skip_element(reader)?;
17459                            }
17460                        }
17461                    }
17462                    Event::Empty(e) => {
17463                        match e.local_name().as_ref() {
17464                            b"rPr" => {
17465                                f_r_pr = Some(Box::new(RichTextRunProperties::from_xml(
17466                                    reader, &e, true,
17467                                )?));
17468                                #[cfg(feature = "extra-children")]
17469                                {
17470                                    child_idx += 1;
17471                                }
17472                            }
17473                            b"t" => {
17474                                f_cell_type = Some(String::new());
17475                                #[cfg(feature = "extra-children")]
17476                                {
17477                                    child_idx += 1;
17478                                }
17479                            }
17480                            #[cfg(feature = "extra-children")]
17481                            _ => {
17482                                // Capture unknown empty element for roundtrip
17483                                let elem = RawXmlElement::from_empty(&e);
17484                                extra_children.push(PositionedNode::new(
17485                                    child_idx,
17486                                    RawXmlNode::Element(elem),
17487                                ));
17488                                child_idx += 1;
17489                            }
17490                            #[cfg(not(feature = "extra-children"))]
17491                            _ => {}
17492                        }
17493                    }
17494                    Event::End(_) => break,
17495                    Event::Eof => break,
17496                    _ => {}
17497                }
17498                buf.clear();
17499            }
17500        }
17501
17502        Ok(Self {
17503            r_pr: f_r_pr,
17504            cell_type: f_cell_type.ok_or_else(|| ParseError::MissingAttribute("t".to_string()))?,
17505            #[cfg(feature = "extra-children")]
17506            extra_children,
17507        })
17508    }
17509}
17510
17511impl FromXml for RichTextRunProperties {
17512    fn from_xml<R: BufRead>(
17513        reader: &mut Reader<R>,
17514        start_tag: &BytesStart,
17515        is_empty: bool,
17516    ) -> Result<Self, ParseError> {
17517        let mut f_r_font = None;
17518        let mut f_charset = None;
17519        let mut f_family = None;
17520        let mut f_b = None;
17521        let mut f_i = None;
17522        let mut f_strike = None;
17523        let mut f_outline = None;
17524        let mut f_shadow = None;
17525        let mut f_condense = None;
17526        let mut f_extend = None;
17527        let mut f_color = None;
17528        let mut f_sz = None;
17529        let mut f_u = None;
17530        let mut f_vert_align = None;
17531        let mut f_scheme = None;
17532        #[cfg(feature = "extra-children")]
17533        let mut extra_children = Vec::new();
17534        #[cfg(feature = "extra-children")]
17535        let mut child_idx: usize = 0;
17536
17537        // Parse child elements
17538        if !is_empty {
17539            let mut buf = Vec::new();
17540            loop {
17541                match reader.read_event_into(&mut buf)? {
17542                    Event::Start(e) => {
17543                        match e.local_name().as_ref() {
17544                            b"rFont" => {
17545                                f_r_font = Some(Box::new(FontName::from_xml(reader, &e, false)?));
17546                                #[cfg(feature = "extra-children")]
17547                                {
17548                                    child_idx += 1;
17549                                }
17550                            }
17551                            b"charset" => {
17552                                f_charset =
17553                                    Some(Box::new(IntProperty::from_xml(reader, &e, false)?));
17554                                #[cfg(feature = "extra-children")]
17555                                {
17556                                    child_idx += 1;
17557                                }
17558                            }
17559                            b"family" => {
17560                                f_family =
17561                                    Some(Box::new(IntProperty::from_xml(reader, &e, false)?));
17562                                #[cfg(feature = "extra-children")]
17563                                {
17564                                    child_idx += 1;
17565                                }
17566                            }
17567                            b"b" => {
17568                                f_b = Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17569                                #[cfg(feature = "extra-children")]
17570                                {
17571                                    child_idx += 1;
17572                                }
17573                            }
17574                            b"i" => {
17575                                f_i = Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17576                                #[cfg(feature = "extra-children")]
17577                                {
17578                                    child_idx += 1;
17579                                }
17580                            }
17581                            b"strike" => {
17582                                f_strike =
17583                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17584                                #[cfg(feature = "extra-children")]
17585                                {
17586                                    child_idx += 1;
17587                                }
17588                            }
17589                            b"outline" => {
17590                                f_outline =
17591                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17592                                #[cfg(feature = "extra-children")]
17593                                {
17594                                    child_idx += 1;
17595                                }
17596                            }
17597                            b"shadow" => {
17598                                f_shadow =
17599                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17600                                #[cfg(feature = "extra-children")]
17601                                {
17602                                    child_idx += 1;
17603                                }
17604                            }
17605                            b"condense" => {
17606                                f_condense =
17607                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17608                                #[cfg(feature = "extra-children")]
17609                                {
17610                                    child_idx += 1;
17611                                }
17612                            }
17613                            b"extend" => {
17614                                f_extend =
17615                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
17616                                #[cfg(feature = "extra-children")]
17617                                {
17618                                    child_idx += 1;
17619                                }
17620                            }
17621                            b"color" => {
17622                                f_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
17623                                #[cfg(feature = "extra-children")]
17624                                {
17625                                    child_idx += 1;
17626                                }
17627                            }
17628                            b"sz" => {
17629                                f_sz = Some(Box::new(FontSize::from_xml(reader, &e, false)?));
17630                                #[cfg(feature = "extra-children")]
17631                                {
17632                                    child_idx += 1;
17633                                }
17634                            }
17635                            b"u" => {
17636                                f_u =
17637                                    Some(Box::new(UnderlineProperty::from_xml(reader, &e, false)?));
17638                                #[cfg(feature = "extra-children")]
17639                                {
17640                                    child_idx += 1;
17641                                }
17642                            }
17643                            b"vertAlign" => {
17644                                f_vert_align = Some(Box::new(VerticalAlignFontProperty::from_xml(
17645                                    reader, &e, false,
17646                                )?));
17647                                #[cfg(feature = "extra-children")]
17648                                {
17649                                    child_idx += 1;
17650                                }
17651                            }
17652                            b"scheme" => {
17653                                f_scheme = Some(Box::new(FontSchemeProperty::from_xml(
17654                                    reader, &e, false,
17655                                )?));
17656                                #[cfg(feature = "extra-children")]
17657                                {
17658                                    child_idx += 1;
17659                                }
17660                            }
17661                            #[cfg(feature = "extra-children")]
17662                            _ => {
17663                                // Capture unknown element for roundtrip
17664                                let elem = RawXmlElement::from_reader(reader, &e)?;
17665                                extra_children.push(PositionedNode::new(
17666                                    child_idx,
17667                                    RawXmlNode::Element(elem),
17668                                ));
17669                                child_idx += 1;
17670                            }
17671                            #[cfg(not(feature = "extra-children"))]
17672                            _ => {
17673                                // Skip unknown element
17674                                skip_element(reader)?;
17675                            }
17676                        }
17677                    }
17678                    Event::Empty(e) => {
17679                        match e.local_name().as_ref() {
17680                            b"rFont" => {
17681                                f_r_font = Some(Box::new(FontName::from_xml(reader, &e, true)?));
17682                                #[cfg(feature = "extra-children")]
17683                                {
17684                                    child_idx += 1;
17685                                }
17686                            }
17687                            b"charset" => {
17688                                f_charset =
17689                                    Some(Box::new(IntProperty::from_xml(reader, &e, true)?));
17690                                #[cfg(feature = "extra-children")]
17691                                {
17692                                    child_idx += 1;
17693                                }
17694                            }
17695                            b"family" => {
17696                                f_family = Some(Box::new(IntProperty::from_xml(reader, &e, true)?));
17697                                #[cfg(feature = "extra-children")]
17698                                {
17699                                    child_idx += 1;
17700                                }
17701                            }
17702                            b"b" => {
17703                                f_b = Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17704                                #[cfg(feature = "extra-children")]
17705                                {
17706                                    child_idx += 1;
17707                                }
17708                            }
17709                            b"i" => {
17710                                f_i = Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17711                                #[cfg(feature = "extra-children")]
17712                                {
17713                                    child_idx += 1;
17714                                }
17715                            }
17716                            b"strike" => {
17717                                f_strike =
17718                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17719                                #[cfg(feature = "extra-children")]
17720                                {
17721                                    child_idx += 1;
17722                                }
17723                            }
17724                            b"outline" => {
17725                                f_outline =
17726                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17727                                #[cfg(feature = "extra-children")]
17728                                {
17729                                    child_idx += 1;
17730                                }
17731                            }
17732                            b"shadow" => {
17733                                f_shadow =
17734                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17735                                #[cfg(feature = "extra-children")]
17736                                {
17737                                    child_idx += 1;
17738                                }
17739                            }
17740                            b"condense" => {
17741                                f_condense =
17742                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17743                                #[cfg(feature = "extra-children")]
17744                                {
17745                                    child_idx += 1;
17746                                }
17747                            }
17748                            b"extend" => {
17749                                f_extend =
17750                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
17751                                #[cfg(feature = "extra-children")]
17752                                {
17753                                    child_idx += 1;
17754                                }
17755                            }
17756                            b"color" => {
17757                                f_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
17758                                #[cfg(feature = "extra-children")]
17759                                {
17760                                    child_idx += 1;
17761                                }
17762                            }
17763                            b"sz" => {
17764                                f_sz = Some(Box::new(FontSize::from_xml(reader, &e, true)?));
17765                                #[cfg(feature = "extra-children")]
17766                                {
17767                                    child_idx += 1;
17768                                }
17769                            }
17770                            b"u" => {
17771                                f_u =
17772                                    Some(Box::new(UnderlineProperty::from_xml(reader, &e, true)?));
17773                                #[cfg(feature = "extra-children")]
17774                                {
17775                                    child_idx += 1;
17776                                }
17777                            }
17778                            b"vertAlign" => {
17779                                f_vert_align = Some(Box::new(VerticalAlignFontProperty::from_xml(
17780                                    reader, &e, true,
17781                                )?));
17782                                #[cfg(feature = "extra-children")]
17783                                {
17784                                    child_idx += 1;
17785                                }
17786                            }
17787                            b"scheme" => {
17788                                f_scheme =
17789                                    Some(Box::new(FontSchemeProperty::from_xml(reader, &e, true)?));
17790                                #[cfg(feature = "extra-children")]
17791                                {
17792                                    child_idx += 1;
17793                                }
17794                            }
17795                            #[cfg(feature = "extra-children")]
17796                            _ => {
17797                                // Capture unknown empty element for roundtrip
17798                                let elem = RawXmlElement::from_empty(&e);
17799                                extra_children.push(PositionedNode::new(
17800                                    child_idx,
17801                                    RawXmlNode::Element(elem),
17802                                ));
17803                                child_idx += 1;
17804                            }
17805                            #[cfg(not(feature = "extra-children"))]
17806                            _ => {}
17807                        }
17808                    }
17809                    Event::End(_) => break,
17810                    Event::Eof => break,
17811                    _ => {}
17812                }
17813                buf.clear();
17814            }
17815        }
17816
17817        Ok(Self {
17818            r_font: f_r_font,
17819            charset: f_charset,
17820            family: f_family,
17821            b: f_b,
17822            i: f_i,
17823            strike: f_strike,
17824            outline: f_outline,
17825            shadow: f_shadow,
17826            condense: f_condense,
17827            extend: f_extend,
17828            color: f_color,
17829            sz: f_sz,
17830            u: f_u,
17831            vert_align: f_vert_align,
17832            scheme: f_scheme,
17833            #[cfg(feature = "extra-children")]
17834            extra_children,
17835        })
17836    }
17837}
17838
17839impl FromXml for RichString {
17840    fn from_xml<R: BufRead>(
17841        reader: &mut Reader<R>,
17842        start_tag: &BytesStart,
17843        is_empty: bool,
17844    ) -> Result<Self, ParseError> {
17845        let mut f_cell_type = None;
17846        let mut f_reference = Vec::new();
17847        let mut f_r_ph = Vec::new();
17848        let mut f_phonetic_pr = None;
17849        #[cfg(feature = "extra-children")]
17850        let mut extra_children = Vec::new();
17851        #[cfg(feature = "extra-children")]
17852        let mut child_idx: usize = 0;
17853
17854        // Parse child elements
17855        if !is_empty {
17856            let mut buf = Vec::new();
17857            loop {
17858                match reader.read_event_into(&mut buf)? {
17859                    Event::Start(e) => {
17860                        match e.local_name().as_ref() {
17861                            b"t" => {
17862                                f_cell_type = Some(read_text_content(reader)?);
17863                                #[cfg(feature = "extra-children")]
17864                                {
17865                                    child_idx += 1;
17866                                }
17867                            }
17868                            b"r" => {
17869                                f_reference.push(RichTextElement::from_xml(reader, &e, false)?);
17870                                #[cfg(feature = "extra-children")]
17871                                {
17872                                    child_idx += 1;
17873                                }
17874                            }
17875                            b"rPh" => {
17876                                f_r_ph.push(PhoneticRun::from_xml(reader, &e, false)?);
17877                                #[cfg(feature = "extra-children")]
17878                                {
17879                                    child_idx += 1;
17880                                }
17881                            }
17882                            b"phoneticPr" => {
17883                                f_phonetic_pr = Some(Box::new(PhoneticProperties::from_xml(
17884                                    reader, &e, false,
17885                                )?));
17886                                #[cfg(feature = "extra-children")]
17887                                {
17888                                    child_idx += 1;
17889                                }
17890                            }
17891                            #[cfg(feature = "extra-children")]
17892                            _ => {
17893                                // Capture unknown element for roundtrip
17894                                let elem = RawXmlElement::from_reader(reader, &e)?;
17895                                extra_children.push(PositionedNode::new(
17896                                    child_idx,
17897                                    RawXmlNode::Element(elem),
17898                                ));
17899                                child_idx += 1;
17900                            }
17901                            #[cfg(not(feature = "extra-children"))]
17902                            _ => {
17903                                // Skip unknown element
17904                                skip_element(reader)?;
17905                            }
17906                        }
17907                    }
17908                    Event::Empty(e) => {
17909                        match e.local_name().as_ref() {
17910                            b"t" => {
17911                                f_cell_type = Some(String::new());
17912                                #[cfg(feature = "extra-children")]
17913                                {
17914                                    child_idx += 1;
17915                                }
17916                            }
17917                            b"r" => {
17918                                f_reference.push(RichTextElement::from_xml(reader, &e, true)?);
17919                                #[cfg(feature = "extra-children")]
17920                                {
17921                                    child_idx += 1;
17922                                }
17923                            }
17924                            b"rPh" => {
17925                                f_r_ph.push(PhoneticRun::from_xml(reader, &e, true)?);
17926                                #[cfg(feature = "extra-children")]
17927                                {
17928                                    child_idx += 1;
17929                                }
17930                            }
17931                            b"phoneticPr" => {
17932                                f_phonetic_pr =
17933                                    Some(Box::new(PhoneticProperties::from_xml(reader, &e, true)?));
17934                                #[cfg(feature = "extra-children")]
17935                                {
17936                                    child_idx += 1;
17937                                }
17938                            }
17939                            #[cfg(feature = "extra-children")]
17940                            _ => {
17941                                // Capture unknown empty element for roundtrip
17942                                let elem = RawXmlElement::from_empty(&e);
17943                                extra_children.push(PositionedNode::new(
17944                                    child_idx,
17945                                    RawXmlNode::Element(elem),
17946                                ));
17947                                child_idx += 1;
17948                            }
17949                            #[cfg(not(feature = "extra-children"))]
17950                            _ => {}
17951                        }
17952                    }
17953                    Event::End(_) => break,
17954                    Event::Eof => break,
17955                    _ => {}
17956                }
17957                buf.clear();
17958            }
17959        }
17960
17961        Ok(Self {
17962            cell_type: f_cell_type,
17963            reference: f_reference,
17964            r_ph: f_r_ph,
17965            phonetic_pr: f_phonetic_pr,
17966            #[cfg(feature = "extra-children")]
17967            extra_children,
17968        })
17969    }
17970}
17971
17972impl FromXml for PhoneticProperties {
17973    fn from_xml<R: BufRead>(
17974        reader: &mut Reader<R>,
17975        start_tag: &BytesStart,
17976        is_empty: bool,
17977    ) -> Result<Self, ParseError> {
17978        let mut f_font_id: Option<STFontId> = None;
17979        let mut f_type = None;
17980        let mut f_alignment = None;
17981        #[cfg(feature = "extra-attrs")]
17982        let mut extra_attrs = std::collections::HashMap::new();
17983
17984        // Parse attributes
17985        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
17986            let val = String::from_utf8_lossy(&attr.value);
17987            match attr.key.local_name().as_ref() {
17988                b"fontId" => {
17989                    f_font_id = val.parse().ok();
17990                }
17991                b"type" => {
17992                    f_type = val.parse().ok();
17993                }
17994                b"alignment" => {
17995                    f_alignment = val.parse().ok();
17996                }
17997                #[cfg(feature = "extra-attrs")]
17998                unknown => {
17999                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18000                    extra_attrs.insert(key, val.into_owned());
18001                }
18002                #[cfg(not(feature = "extra-attrs"))]
18003                _ => {}
18004            }
18005        }
18006
18007        if !is_empty {
18008            let mut buf = Vec::new();
18009            loop {
18010                match reader.read_event_into(&mut buf)? {
18011                    Event::End(_) => break,
18012                    Event::Eof => break,
18013                    _ => {}
18014                }
18015                buf.clear();
18016            }
18017        }
18018
18019        Ok(Self {
18020            font_id: f_font_id.ok_or_else(|| ParseError::MissingAttribute("fontId".to_string()))?,
18021            r#type: f_type,
18022            alignment: f_alignment,
18023            #[cfg(feature = "extra-attrs")]
18024            extra_attrs,
18025        })
18026    }
18027}
18028
18029impl FromXml for RevisionHeaders {
18030    fn from_xml<R: BufRead>(
18031        reader: &mut Reader<R>,
18032        start_tag: &BytesStart,
18033        is_empty: bool,
18034    ) -> Result<Self, ParseError> {
18035        let mut f_guid: Option<Guid> = None;
18036        let mut f_last_guid = None;
18037        let mut f_shared = None;
18038        let mut f_disk_revisions = None;
18039        let mut f_history = None;
18040        let mut f_track_revisions = None;
18041        let mut f_exclusive = None;
18042        let mut f_revision_id = None;
18043        let mut f_version = None;
18044        let mut f_keep_change_history = None;
18045        let mut f_protected = None;
18046        let mut f_preserve_history = None;
18047        let mut f_header = Vec::new();
18048        #[cfg(feature = "extra-attrs")]
18049        let mut extra_attrs = std::collections::HashMap::new();
18050        #[cfg(feature = "extra-children")]
18051        let mut extra_children = Vec::new();
18052        #[cfg(feature = "extra-children")]
18053        let mut child_idx: usize = 0;
18054
18055        // Parse attributes
18056        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18057            let val = String::from_utf8_lossy(&attr.value);
18058            match attr.key.local_name().as_ref() {
18059                b"guid" => {
18060                    f_guid = Some(val.into_owned());
18061                }
18062                b"lastGuid" => {
18063                    f_last_guid = Some(val.into_owned());
18064                }
18065                b"shared" => {
18066                    f_shared = Some(val == "true" || val == "1");
18067                }
18068                b"diskRevisions" => {
18069                    f_disk_revisions = Some(val == "true" || val == "1");
18070                }
18071                b"history" => {
18072                    f_history = Some(val == "true" || val == "1");
18073                }
18074                b"trackRevisions" => {
18075                    f_track_revisions = Some(val == "true" || val == "1");
18076                }
18077                b"exclusive" => {
18078                    f_exclusive = Some(val == "true" || val == "1");
18079                }
18080                b"revisionId" => {
18081                    f_revision_id = val.parse().ok();
18082                }
18083                b"version" => {
18084                    f_version = val.parse().ok();
18085                }
18086                b"keepChangeHistory" => {
18087                    f_keep_change_history = Some(val == "true" || val == "1");
18088                }
18089                b"protected" => {
18090                    f_protected = Some(val == "true" || val == "1");
18091                }
18092                b"preserveHistory" => {
18093                    f_preserve_history = val.parse().ok();
18094                }
18095                #[cfg(feature = "extra-attrs")]
18096                unknown => {
18097                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18098                    extra_attrs.insert(key, val.into_owned());
18099                }
18100                #[cfg(not(feature = "extra-attrs"))]
18101                _ => {}
18102            }
18103        }
18104
18105        // Parse child elements
18106        if !is_empty {
18107            let mut buf = Vec::new();
18108            loop {
18109                match reader.read_event_into(&mut buf)? {
18110                    Event::Start(e) => {
18111                        match e.local_name().as_ref() {
18112                            b"header" => {
18113                                f_header.push(RevisionHeader::from_xml(reader, &e, false)?);
18114                                #[cfg(feature = "extra-children")]
18115                                {
18116                                    child_idx += 1;
18117                                }
18118                            }
18119                            #[cfg(feature = "extra-children")]
18120                            _ => {
18121                                // Capture unknown element for roundtrip
18122                                let elem = RawXmlElement::from_reader(reader, &e)?;
18123                                extra_children.push(PositionedNode::new(
18124                                    child_idx,
18125                                    RawXmlNode::Element(elem),
18126                                ));
18127                                child_idx += 1;
18128                            }
18129                            #[cfg(not(feature = "extra-children"))]
18130                            _ => {
18131                                // Skip unknown element
18132                                skip_element(reader)?;
18133                            }
18134                        }
18135                    }
18136                    Event::Empty(e) => {
18137                        match e.local_name().as_ref() {
18138                            b"header" => {
18139                                f_header.push(RevisionHeader::from_xml(reader, &e, true)?);
18140                                #[cfg(feature = "extra-children")]
18141                                {
18142                                    child_idx += 1;
18143                                }
18144                            }
18145                            #[cfg(feature = "extra-children")]
18146                            _ => {
18147                                // Capture unknown empty element for roundtrip
18148                                let elem = RawXmlElement::from_empty(&e);
18149                                extra_children.push(PositionedNode::new(
18150                                    child_idx,
18151                                    RawXmlNode::Element(elem),
18152                                ));
18153                                child_idx += 1;
18154                            }
18155                            #[cfg(not(feature = "extra-children"))]
18156                            _ => {}
18157                        }
18158                    }
18159                    Event::End(_) => break,
18160                    Event::Eof => break,
18161                    _ => {}
18162                }
18163                buf.clear();
18164            }
18165        }
18166
18167        Ok(Self {
18168            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
18169            last_guid: f_last_guid,
18170            shared: f_shared,
18171            disk_revisions: f_disk_revisions,
18172            history: f_history,
18173            track_revisions: f_track_revisions,
18174            exclusive: f_exclusive,
18175            revision_id: f_revision_id,
18176            version: f_version,
18177            keep_change_history: f_keep_change_history,
18178            protected: f_protected,
18179            preserve_history: f_preserve_history,
18180            header: f_header,
18181            #[cfg(feature = "extra-attrs")]
18182            extra_attrs,
18183            #[cfg(feature = "extra-children")]
18184            extra_children,
18185        })
18186    }
18187}
18188
18189impl FromXml for Revisions {
18190    fn from_xml<R: BufRead>(
18191        reader: &mut Reader<R>,
18192        start_tag: &BytesStart,
18193        is_empty: bool,
18194    ) -> Result<Self, ParseError> {
18195        #[cfg(feature = "extra-children")]
18196        let mut extra_children = Vec::new();
18197        #[cfg(feature = "extra-children")]
18198        let mut child_idx: usize = 0;
18199        if !is_empty {
18200            let mut buf = Vec::new();
18201            loop {
18202                match reader.read_event_into(&mut buf)? {
18203                    #[cfg(feature = "extra-children")]
18204                    Event::Start(e) => {
18205                        let elem = RawXmlElement::from_reader(reader, &e)?;
18206                        extra_children
18207                            .push(PositionedNode::new(child_idx, RawXmlNode::Element(elem)));
18208                        child_idx += 1;
18209                    }
18210                    #[cfg(not(feature = "extra-children"))]
18211                    Event::Start(_) => {
18212                        skip_element(reader)?;
18213                    }
18214                    #[cfg(feature = "extra-children")]
18215                    Event::Empty(e) => {
18216                        let elem = RawXmlElement::from_empty(&e);
18217                        extra_children
18218                            .push(PositionedNode::new(child_idx, RawXmlNode::Element(elem)));
18219                        child_idx += 1;
18220                    }
18221                    #[cfg(not(feature = "extra-children"))]
18222                    Event::Empty(_) => {}
18223                    Event::End(_) => break,
18224                    Event::Eof => break,
18225                    _ => {}
18226                }
18227                buf.clear();
18228            }
18229        }
18230        Ok(Self {
18231            #[cfg(feature = "extra-children")]
18232            extra_children,
18233        })
18234    }
18235}
18236
18237impl FromXml for SmlAGRevData {
18238    fn from_xml<R: BufRead>(
18239        reader: &mut Reader<R>,
18240        start_tag: &BytesStart,
18241        is_empty: bool,
18242    ) -> Result<Self, ParseError> {
18243        let mut f_r_id: Option<u32> = None;
18244        let mut f_ua = None;
18245        let mut f_ra = None;
18246        #[cfg(feature = "extra-attrs")]
18247        let mut extra_attrs = std::collections::HashMap::new();
18248
18249        // Parse attributes
18250        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18251            let val = String::from_utf8_lossy(&attr.value);
18252            match attr.key.local_name().as_ref() {
18253                b"rId" => {
18254                    f_r_id = val.parse().ok();
18255                }
18256                b"ua" => {
18257                    f_ua = Some(val == "true" || val == "1");
18258                }
18259                b"ra" => {
18260                    f_ra = Some(val == "true" || val == "1");
18261                }
18262                #[cfg(feature = "extra-attrs")]
18263                unknown => {
18264                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18265                    extra_attrs.insert(key, val.into_owned());
18266                }
18267                #[cfg(not(feature = "extra-attrs"))]
18268                _ => {}
18269            }
18270        }
18271
18272        if !is_empty {
18273            let mut buf = Vec::new();
18274            loop {
18275                match reader.read_event_into(&mut buf)? {
18276                    Event::End(_) => break,
18277                    Event::Eof => break,
18278                    _ => {}
18279                }
18280                buf.clear();
18281            }
18282        }
18283
18284        Ok(Self {
18285            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
18286            ua: f_ua,
18287            ra: f_ra,
18288            #[cfg(feature = "extra-attrs")]
18289            extra_attrs,
18290        })
18291    }
18292}
18293
18294impl FromXml for RevisionHeader {
18295    fn from_xml<R: BufRead>(
18296        reader: &mut Reader<R>,
18297        start_tag: &BytesStart,
18298        is_empty: bool,
18299    ) -> Result<Self, ParseError> {
18300        let mut f_guid: Option<Guid> = None;
18301        let mut f_date_time: Option<String> = None;
18302        let mut f_max_sheet_id: Option<u32> = None;
18303        let mut f_user_name: Option<XmlString> = None;
18304        let mut f_id: Option<STRelationshipId> = None;
18305        let mut f_min_r_id = None;
18306        let mut f_max_r_id = None;
18307        let mut f_sheet_id_map: Option<Box<CTSheetIdMap>> = None;
18308        let mut f_reviewed_list = None;
18309        let mut f_extension_list = None;
18310        #[cfg(feature = "extra-attrs")]
18311        let mut extra_attrs = std::collections::HashMap::new();
18312        #[cfg(feature = "extra-children")]
18313        let mut extra_children = Vec::new();
18314        #[cfg(feature = "extra-children")]
18315        let mut child_idx: usize = 0;
18316
18317        // Parse attributes
18318        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18319            let val = String::from_utf8_lossy(&attr.value);
18320            match attr.key.local_name().as_ref() {
18321                b"guid" => {
18322                    f_guid = Some(val.into_owned());
18323                }
18324                b"dateTime" => {
18325                    f_date_time = Some(val.into_owned());
18326                }
18327                b"maxSheetId" => {
18328                    f_max_sheet_id = val.parse().ok();
18329                }
18330                b"userName" => {
18331                    f_user_name = Some(val.into_owned());
18332                }
18333                b"id" => {
18334                    f_id = Some(val.into_owned());
18335                }
18336                b"minRId" => {
18337                    f_min_r_id = val.parse().ok();
18338                }
18339                b"maxRId" => {
18340                    f_max_r_id = val.parse().ok();
18341                }
18342                #[cfg(feature = "extra-attrs")]
18343                unknown => {
18344                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18345                    extra_attrs.insert(key, val.into_owned());
18346                }
18347                #[cfg(not(feature = "extra-attrs"))]
18348                _ => {}
18349            }
18350        }
18351
18352        // Parse child elements
18353        if !is_empty {
18354            let mut buf = Vec::new();
18355            loop {
18356                match reader.read_event_into(&mut buf)? {
18357                    Event::Start(e) => {
18358                        match e.local_name().as_ref() {
18359                            b"sheetIdMap" => {
18360                                f_sheet_id_map =
18361                                    Some(Box::new(CTSheetIdMap::from_xml(reader, &e, false)?));
18362                                #[cfg(feature = "extra-children")]
18363                                {
18364                                    child_idx += 1;
18365                                }
18366                            }
18367                            b"reviewedList" => {
18368                                f_reviewed_list =
18369                                    Some(Box::new(ReviewedRevisions::from_xml(reader, &e, false)?));
18370                                #[cfg(feature = "extra-children")]
18371                                {
18372                                    child_idx += 1;
18373                                }
18374                            }
18375                            b"extLst" => {
18376                                f_extension_list =
18377                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
18378                                #[cfg(feature = "extra-children")]
18379                                {
18380                                    child_idx += 1;
18381                                }
18382                            }
18383                            #[cfg(feature = "extra-children")]
18384                            _ => {
18385                                // Capture unknown element for roundtrip
18386                                let elem = RawXmlElement::from_reader(reader, &e)?;
18387                                extra_children.push(PositionedNode::new(
18388                                    child_idx,
18389                                    RawXmlNode::Element(elem),
18390                                ));
18391                                child_idx += 1;
18392                            }
18393                            #[cfg(not(feature = "extra-children"))]
18394                            _ => {
18395                                // Skip unknown element
18396                                skip_element(reader)?;
18397                            }
18398                        }
18399                    }
18400                    Event::Empty(e) => {
18401                        match e.local_name().as_ref() {
18402                            b"sheetIdMap" => {
18403                                f_sheet_id_map =
18404                                    Some(Box::new(CTSheetIdMap::from_xml(reader, &e, true)?));
18405                                #[cfg(feature = "extra-children")]
18406                                {
18407                                    child_idx += 1;
18408                                }
18409                            }
18410                            b"reviewedList" => {
18411                                f_reviewed_list =
18412                                    Some(Box::new(ReviewedRevisions::from_xml(reader, &e, true)?));
18413                                #[cfg(feature = "extra-children")]
18414                                {
18415                                    child_idx += 1;
18416                                }
18417                            }
18418                            b"extLst" => {
18419                                f_extension_list =
18420                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
18421                                #[cfg(feature = "extra-children")]
18422                                {
18423                                    child_idx += 1;
18424                                }
18425                            }
18426                            #[cfg(feature = "extra-children")]
18427                            _ => {
18428                                // Capture unknown empty element for roundtrip
18429                                let elem = RawXmlElement::from_empty(&e);
18430                                extra_children.push(PositionedNode::new(
18431                                    child_idx,
18432                                    RawXmlNode::Element(elem),
18433                                ));
18434                                child_idx += 1;
18435                            }
18436                            #[cfg(not(feature = "extra-children"))]
18437                            _ => {}
18438                        }
18439                    }
18440                    Event::End(_) => break,
18441                    Event::Eof => break,
18442                    _ => {}
18443                }
18444                buf.clear();
18445            }
18446        }
18447
18448        Ok(Self {
18449            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
18450            date_time: f_date_time
18451                .ok_or_else(|| ParseError::MissingAttribute("dateTime".to_string()))?,
18452            max_sheet_id: f_max_sheet_id
18453                .ok_or_else(|| ParseError::MissingAttribute("maxSheetId".to_string()))?,
18454            user_name: f_user_name
18455                .ok_or_else(|| ParseError::MissingAttribute("userName".to_string()))?,
18456            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
18457            min_r_id: f_min_r_id,
18458            max_r_id: f_max_r_id,
18459            sheet_id_map: f_sheet_id_map
18460                .ok_or_else(|| ParseError::MissingAttribute("sheetIdMap".to_string()))?,
18461            reviewed_list: f_reviewed_list,
18462            extension_list: f_extension_list,
18463            #[cfg(feature = "extra-attrs")]
18464            extra_attrs,
18465            #[cfg(feature = "extra-children")]
18466            extra_children,
18467        })
18468    }
18469}
18470
18471impl FromXml for CTSheetIdMap {
18472    fn from_xml<R: BufRead>(
18473        reader: &mut Reader<R>,
18474        start_tag: &BytesStart,
18475        is_empty: bool,
18476    ) -> Result<Self, ParseError> {
18477        let mut f_count = None;
18478        let mut f_sheet_id = Vec::new();
18479        #[cfg(feature = "extra-attrs")]
18480        let mut extra_attrs = std::collections::HashMap::new();
18481        #[cfg(feature = "extra-children")]
18482        let mut extra_children = Vec::new();
18483        #[cfg(feature = "extra-children")]
18484        let mut child_idx: usize = 0;
18485
18486        // Parse attributes
18487        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18488            let val = String::from_utf8_lossy(&attr.value);
18489            match attr.key.local_name().as_ref() {
18490                b"count" => {
18491                    f_count = val.parse().ok();
18492                }
18493                #[cfg(feature = "extra-attrs")]
18494                unknown => {
18495                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18496                    extra_attrs.insert(key, val.into_owned());
18497                }
18498                #[cfg(not(feature = "extra-attrs"))]
18499                _ => {}
18500            }
18501        }
18502
18503        // Parse child elements
18504        if !is_empty {
18505            let mut buf = Vec::new();
18506            loop {
18507                match reader.read_event_into(&mut buf)? {
18508                    Event::Start(e) => {
18509                        match e.local_name().as_ref() {
18510                            b"sheetId" => {
18511                                f_sheet_id.push(CTSheetId::from_xml(reader, &e, false)?);
18512                                #[cfg(feature = "extra-children")]
18513                                {
18514                                    child_idx += 1;
18515                                }
18516                            }
18517                            #[cfg(feature = "extra-children")]
18518                            _ => {
18519                                // Capture unknown element for roundtrip
18520                                let elem = RawXmlElement::from_reader(reader, &e)?;
18521                                extra_children.push(PositionedNode::new(
18522                                    child_idx,
18523                                    RawXmlNode::Element(elem),
18524                                ));
18525                                child_idx += 1;
18526                            }
18527                            #[cfg(not(feature = "extra-children"))]
18528                            _ => {
18529                                // Skip unknown element
18530                                skip_element(reader)?;
18531                            }
18532                        }
18533                    }
18534                    Event::Empty(e) => {
18535                        match e.local_name().as_ref() {
18536                            b"sheetId" => {
18537                                f_sheet_id.push(CTSheetId::from_xml(reader, &e, true)?);
18538                                #[cfg(feature = "extra-children")]
18539                                {
18540                                    child_idx += 1;
18541                                }
18542                            }
18543                            #[cfg(feature = "extra-children")]
18544                            _ => {
18545                                // Capture unknown empty element for roundtrip
18546                                let elem = RawXmlElement::from_empty(&e);
18547                                extra_children.push(PositionedNode::new(
18548                                    child_idx,
18549                                    RawXmlNode::Element(elem),
18550                                ));
18551                                child_idx += 1;
18552                            }
18553                            #[cfg(not(feature = "extra-children"))]
18554                            _ => {}
18555                        }
18556                    }
18557                    Event::End(_) => break,
18558                    Event::Eof => break,
18559                    _ => {}
18560                }
18561                buf.clear();
18562            }
18563        }
18564
18565        Ok(Self {
18566            count: f_count,
18567            sheet_id: f_sheet_id,
18568            #[cfg(feature = "extra-attrs")]
18569            extra_attrs,
18570            #[cfg(feature = "extra-children")]
18571            extra_children,
18572        })
18573    }
18574}
18575
18576impl FromXml for CTSheetId {
18577    fn from_xml<R: BufRead>(
18578        reader: &mut Reader<R>,
18579        start_tag: &BytesStart,
18580        is_empty: bool,
18581    ) -> Result<Self, ParseError> {
18582        let mut f_value: Option<u32> = None;
18583        #[cfg(feature = "extra-attrs")]
18584        let mut extra_attrs = std::collections::HashMap::new();
18585
18586        // Parse attributes
18587        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18588            let val = String::from_utf8_lossy(&attr.value);
18589            match attr.key.local_name().as_ref() {
18590                b"val" => {
18591                    f_value = val.parse().ok();
18592                }
18593                #[cfg(feature = "extra-attrs")]
18594                unknown => {
18595                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18596                    extra_attrs.insert(key, val.into_owned());
18597                }
18598                #[cfg(not(feature = "extra-attrs"))]
18599                _ => {}
18600            }
18601        }
18602
18603        if !is_empty {
18604            let mut buf = Vec::new();
18605            loop {
18606                match reader.read_event_into(&mut buf)? {
18607                    Event::End(_) => break,
18608                    Event::Eof => break,
18609                    _ => {}
18610                }
18611                buf.clear();
18612            }
18613        }
18614
18615        Ok(Self {
18616            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
18617            #[cfg(feature = "extra-attrs")]
18618            extra_attrs,
18619        })
18620    }
18621}
18622
18623impl FromXml for ReviewedRevisions {
18624    fn from_xml<R: BufRead>(
18625        reader: &mut Reader<R>,
18626        start_tag: &BytesStart,
18627        is_empty: bool,
18628    ) -> Result<Self, ParseError> {
18629        let mut f_count = None;
18630        let mut f_reviewed = Vec::new();
18631        #[cfg(feature = "extra-attrs")]
18632        let mut extra_attrs = std::collections::HashMap::new();
18633        #[cfg(feature = "extra-children")]
18634        let mut extra_children = Vec::new();
18635        #[cfg(feature = "extra-children")]
18636        let mut child_idx: usize = 0;
18637
18638        // Parse attributes
18639        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18640            let val = String::from_utf8_lossy(&attr.value);
18641            match attr.key.local_name().as_ref() {
18642                b"count" => {
18643                    f_count = val.parse().ok();
18644                }
18645                #[cfg(feature = "extra-attrs")]
18646                unknown => {
18647                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18648                    extra_attrs.insert(key, val.into_owned());
18649                }
18650                #[cfg(not(feature = "extra-attrs"))]
18651                _ => {}
18652            }
18653        }
18654
18655        // Parse child elements
18656        if !is_empty {
18657            let mut buf = Vec::new();
18658            loop {
18659                match reader.read_event_into(&mut buf)? {
18660                    Event::Start(e) => {
18661                        match e.local_name().as_ref() {
18662                            b"reviewed" => {
18663                                f_reviewed.push(Reviewed::from_xml(reader, &e, false)?);
18664                                #[cfg(feature = "extra-children")]
18665                                {
18666                                    child_idx += 1;
18667                                }
18668                            }
18669                            #[cfg(feature = "extra-children")]
18670                            _ => {
18671                                // Capture unknown element for roundtrip
18672                                let elem = RawXmlElement::from_reader(reader, &e)?;
18673                                extra_children.push(PositionedNode::new(
18674                                    child_idx,
18675                                    RawXmlNode::Element(elem),
18676                                ));
18677                                child_idx += 1;
18678                            }
18679                            #[cfg(not(feature = "extra-children"))]
18680                            _ => {
18681                                // Skip unknown element
18682                                skip_element(reader)?;
18683                            }
18684                        }
18685                    }
18686                    Event::Empty(e) => {
18687                        match e.local_name().as_ref() {
18688                            b"reviewed" => {
18689                                f_reviewed.push(Reviewed::from_xml(reader, &e, true)?);
18690                                #[cfg(feature = "extra-children")]
18691                                {
18692                                    child_idx += 1;
18693                                }
18694                            }
18695                            #[cfg(feature = "extra-children")]
18696                            _ => {
18697                                // Capture unknown empty element for roundtrip
18698                                let elem = RawXmlElement::from_empty(&e);
18699                                extra_children.push(PositionedNode::new(
18700                                    child_idx,
18701                                    RawXmlNode::Element(elem),
18702                                ));
18703                                child_idx += 1;
18704                            }
18705                            #[cfg(not(feature = "extra-children"))]
18706                            _ => {}
18707                        }
18708                    }
18709                    Event::End(_) => break,
18710                    Event::Eof => break,
18711                    _ => {}
18712                }
18713                buf.clear();
18714            }
18715        }
18716
18717        Ok(Self {
18718            count: f_count,
18719            reviewed: f_reviewed,
18720            #[cfg(feature = "extra-attrs")]
18721            extra_attrs,
18722            #[cfg(feature = "extra-children")]
18723            extra_children,
18724        })
18725    }
18726}
18727
18728impl FromXml for Reviewed {
18729    fn from_xml<R: BufRead>(
18730        reader: &mut Reader<R>,
18731        start_tag: &BytesStart,
18732        is_empty: bool,
18733    ) -> Result<Self, ParseError> {
18734        let mut f_r_id: Option<u32> = None;
18735        #[cfg(feature = "extra-attrs")]
18736        let mut extra_attrs = std::collections::HashMap::new();
18737
18738        // Parse attributes
18739        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18740            let val = String::from_utf8_lossy(&attr.value);
18741            match attr.key.local_name().as_ref() {
18742                b"rId" => {
18743                    f_r_id = val.parse().ok();
18744                }
18745                #[cfg(feature = "extra-attrs")]
18746                unknown => {
18747                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18748                    extra_attrs.insert(key, val.into_owned());
18749                }
18750                #[cfg(not(feature = "extra-attrs"))]
18751                _ => {}
18752            }
18753        }
18754
18755        if !is_empty {
18756            let mut buf = Vec::new();
18757            loop {
18758                match reader.read_event_into(&mut buf)? {
18759                    Event::End(_) => break,
18760                    Event::Eof => break,
18761                    _ => {}
18762                }
18763                buf.clear();
18764            }
18765        }
18766
18767        Ok(Self {
18768            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
18769            #[cfg(feature = "extra-attrs")]
18770            extra_attrs,
18771        })
18772    }
18773}
18774
18775impl FromXml for UndoInfo {
18776    fn from_xml<R: BufRead>(
18777        reader: &mut Reader<R>,
18778        start_tag: &BytesStart,
18779        is_empty: bool,
18780    ) -> Result<Self, ParseError> {
18781        let mut f_index: Option<u32> = None;
18782        let mut f_exp: Option<STFormulaExpression> = None;
18783        let mut f_ref3_d = None;
18784        let mut f_array = None;
18785        let mut f_value = None;
18786        let mut f_nf = None;
18787        let mut f_cs = None;
18788        let mut f_dr: Option<STRefA> = None;
18789        let mut f_dn = None;
18790        let mut f_reference = None;
18791        let mut f_s_id = None;
18792        #[cfg(feature = "extra-attrs")]
18793        let mut extra_attrs = std::collections::HashMap::new();
18794
18795        // Parse attributes
18796        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18797            let val = String::from_utf8_lossy(&attr.value);
18798            match attr.key.local_name().as_ref() {
18799                b"index" => {
18800                    f_index = val.parse().ok();
18801                }
18802                b"exp" => {
18803                    f_exp = val.parse().ok();
18804                }
18805                b"ref3D" => {
18806                    f_ref3_d = Some(val == "true" || val == "1");
18807                }
18808                b"array" => {
18809                    f_array = Some(val == "true" || val == "1");
18810                }
18811                b"v" => {
18812                    f_value = Some(val == "true" || val == "1");
18813                }
18814                b"nf" => {
18815                    f_nf = Some(val == "true" || val == "1");
18816                }
18817                b"cs" => {
18818                    f_cs = Some(val == "true" || val == "1");
18819                }
18820                b"dr" => {
18821                    f_dr = Some(val.into_owned());
18822                }
18823                b"dn" => {
18824                    f_dn = Some(val.into_owned());
18825                }
18826                b"r" => {
18827                    f_reference = Some(val.into_owned());
18828                }
18829                b"sId" => {
18830                    f_s_id = val.parse().ok();
18831                }
18832                #[cfg(feature = "extra-attrs")]
18833                unknown => {
18834                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18835                    extra_attrs.insert(key, val.into_owned());
18836                }
18837                #[cfg(not(feature = "extra-attrs"))]
18838                _ => {}
18839            }
18840        }
18841
18842        if !is_empty {
18843            let mut buf = Vec::new();
18844            loop {
18845                match reader.read_event_into(&mut buf)? {
18846                    Event::End(_) => break,
18847                    Event::Eof => break,
18848                    _ => {}
18849                }
18850                buf.clear();
18851            }
18852        }
18853
18854        Ok(Self {
18855            index: f_index.ok_or_else(|| ParseError::MissingAttribute("index".to_string()))?,
18856            exp: f_exp.ok_or_else(|| ParseError::MissingAttribute("exp".to_string()))?,
18857            ref3_d: f_ref3_d,
18858            array: f_array,
18859            value: f_value,
18860            nf: f_nf,
18861            cs: f_cs,
18862            dr: f_dr.ok_or_else(|| ParseError::MissingAttribute("dr".to_string()))?,
18863            dn: f_dn,
18864            reference: f_reference,
18865            s_id: f_s_id,
18866            #[cfg(feature = "extra-attrs")]
18867            extra_attrs,
18868        })
18869    }
18870}
18871
18872impl FromXml for RevisionRowColumn {
18873    fn from_xml<R: BufRead>(
18874        reader: &mut Reader<R>,
18875        start_tag: &BytesStart,
18876        is_empty: bool,
18877    ) -> Result<Self, ParseError> {
18878        let mut f_r_id: Option<u32> = None;
18879        let mut f_ua = None;
18880        let mut f_ra = None;
18881        let mut f_s_id: Option<u32> = None;
18882        let mut f_eol = None;
18883        let mut f_reference: Option<Reference> = None;
18884        let mut f_action: Option<STRwColActionType> = None;
18885        let mut f_edge = None;
18886        #[cfg(feature = "extra-attrs")]
18887        let mut extra_attrs = std::collections::HashMap::new();
18888
18889        // Parse attributes
18890        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18891            let val = String::from_utf8_lossy(&attr.value);
18892            match attr.key.local_name().as_ref() {
18893                b"rId" => {
18894                    f_r_id = val.parse().ok();
18895                }
18896                b"ua" => {
18897                    f_ua = Some(val == "true" || val == "1");
18898                }
18899                b"ra" => {
18900                    f_ra = Some(val == "true" || val == "1");
18901                }
18902                b"sId" => {
18903                    f_s_id = val.parse().ok();
18904                }
18905                b"eol" => {
18906                    f_eol = Some(val == "true" || val == "1");
18907                }
18908                b"ref" => {
18909                    f_reference = Some(val.into_owned());
18910                }
18911                b"action" => {
18912                    f_action = val.parse().ok();
18913                }
18914                b"edge" => {
18915                    f_edge = Some(val == "true" || val == "1");
18916                }
18917                #[cfg(feature = "extra-attrs")]
18918                unknown => {
18919                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18920                    extra_attrs.insert(key, val.into_owned());
18921                }
18922                #[cfg(not(feature = "extra-attrs"))]
18923                _ => {}
18924            }
18925        }
18926
18927        if !is_empty {
18928            let mut buf = Vec::new();
18929            loop {
18930                match reader.read_event_into(&mut buf)? {
18931                    Event::End(_) => break,
18932                    Event::Eof => break,
18933                    _ => {}
18934                }
18935                buf.clear();
18936            }
18937        }
18938
18939        Ok(Self {
18940            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
18941            ua: f_ua,
18942            ra: f_ra,
18943            s_id: f_s_id.ok_or_else(|| ParseError::MissingAttribute("sId".to_string()))?,
18944            eol: f_eol,
18945            reference: f_reference
18946                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
18947            action: f_action.ok_or_else(|| ParseError::MissingAttribute("action".to_string()))?,
18948            edge: f_edge,
18949            #[cfg(feature = "extra-attrs")]
18950            extra_attrs,
18951        })
18952    }
18953}
18954
18955impl FromXml for RevisionMove {
18956    fn from_xml<R: BufRead>(
18957        reader: &mut Reader<R>,
18958        start_tag: &BytesStart,
18959        is_empty: bool,
18960    ) -> Result<Self, ParseError> {
18961        let mut f_r_id: Option<u32> = None;
18962        let mut f_ua = None;
18963        let mut f_ra = None;
18964        let mut f_sheet_id: Option<u32> = None;
18965        let mut f_source: Option<Reference> = None;
18966        let mut f_destination: Option<Reference> = None;
18967        let mut f_source_sheet_id = None;
18968        #[cfg(feature = "extra-attrs")]
18969        let mut extra_attrs = std::collections::HashMap::new();
18970
18971        // Parse attributes
18972        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
18973            let val = String::from_utf8_lossy(&attr.value);
18974            match attr.key.local_name().as_ref() {
18975                b"rId" => {
18976                    f_r_id = val.parse().ok();
18977                }
18978                b"ua" => {
18979                    f_ua = Some(val == "true" || val == "1");
18980                }
18981                b"ra" => {
18982                    f_ra = Some(val == "true" || val == "1");
18983                }
18984                b"sheetId" => {
18985                    f_sheet_id = val.parse().ok();
18986                }
18987                b"source" => {
18988                    f_source = Some(val.into_owned());
18989                }
18990                b"destination" => {
18991                    f_destination = Some(val.into_owned());
18992                }
18993                b"sourceSheetId" => {
18994                    f_source_sheet_id = val.parse().ok();
18995                }
18996                #[cfg(feature = "extra-attrs")]
18997                unknown => {
18998                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
18999                    extra_attrs.insert(key, val.into_owned());
19000                }
19001                #[cfg(not(feature = "extra-attrs"))]
19002                _ => {}
19003            }
19004        }
19005
19006        if !is_empty {
19007            let mut buf = Vec::new();
19008            loop {
19009                match reader.read_event_into(&mut buf)? {
19010                    Event::End(_) => break,
19011                    Event::Eof => break,
19012                    _ => {}
19013                }
19014                buf.clear();
19015            }
19016        }
19017
19018        Ok(Self {
19019            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
19020            ua: f_ua,
19021            ra: f_ra,
19022            sheet_id: f_sheet_id
19023                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19024            source: f_source.ok_or_else(|| ParseError::MissingAttribute("source".to_string()))?,
19025            destination: f_destination
19026                .ok_or_else(|| ParseError::MissingAttribute("destination".to_string()))?,
19027            source_sheet_id: f_source_sheet_id,
19028            #[cfg(feature = "extra-attrs")]
19029            extra_attrs,
19030        })
19031    }
19032}
19033
19034impl FromXml for RevisionCustomView {
19035    fn from_xml<R: BufRead>(
19036        reader: &mut Reader<R>,
19037        start_tag: &BytesStart,
19038        is_empty: bool,
19039    ) -> Result<Self, ParseError> {
19040        let mut f_guid: Option<Guid> = None;
19041        let mut f_action: Option<STRevisionAction> = None;
19042        #[cfg(feature = "extra-attrs")]
19043        let mut extra_attrs = std::collections::HashMap::new();
19044
19045        // Parse attributes
19046        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19047            let val = String::from_utf8_lossy(&attr.value);
19048            match attr.key.local_name().as_ref() {
19049                b"guid" => {
19050                    f_guid = Some(val.into_owned());
19051                }
19052                b"action" => {
19053                    f_action = val.parse().ok();
19054                }
19055                #[cfg(feature = "extra-attrs")]
19056                unknown => {
19057                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19058                    extra_attrs.insert(key, val.into_owned());
19059                }
19060                #[cfg(not(feature = "extra-attrs"))]
19061                _ => {}
19062            }
19063        }
19064
19065        if !is_empty {
19066            let mut buf = Vec::new();
19067            loop {
19068                match reader.read_event_into(&mut buf)? {
19069                    Event::End(_) => break,
19070                    Event::Eof => break,
19071                    _ => {}
19072                }
19073                buf.clear();
19074            }
19075        }
19076
19077        Ok(Self {
19078            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
19079            action: f_action.ok_or_else(|| ParseError::MissingAttribute("action".to_string()))?,
19080            #[cfg(feature = "extra-attrs")]
19081            extra_attrs,
19082        })
19083    }
19084}
19085
19086impl FromXml for RevisionSheetRename {
19087    fn from_xml<R: BufRead>(
19088        reader: &mut Reader<R>,
19089        start_tag: &BytesStart,
19090        is_empty: bool,
19091    ) -> Result<Self, ParseError> {
19092        let mut f_r_id: Option<u32> = None;
19093        let mut f_ua = None;
19094        let mut f_ra = None;
19095        let mut f_sheet_id: Option<u32> = None;
19096        let mut f_old_name: Option<XmlString> = None;
19097        let mut f_new_name: Option<XmlString> = None;
19098        let mut f_extension_list = None;
19099        #[cfg(feature = "extra-attrs")]
19100        let mut extra_attrs = std::collections::HashMap::new();
19101        #[cfg(feature = "extra-children")]
19102        let mut extra_children = Vec::new();
19103        #[cfg(feature = "extra-children")]
19104        let mut child_idx: usize = 0;
19105
19106        // Parse attributes
19107        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19108            let val = String::from_utf8_lossy(&attr.value);
19109            match attr.key.local_name().as_ref() {
19110                b"rId" => {
19111                    f_r_id = val.parse().ok();
19112                }
19113                b"ua" => {
19114                    f_ua = Some(val == "true" || val == "1");
19115                }
19116                b"ra" => {
19117                    f_ra = Some(val == "true" || val == "1");
19118                }
19119                b"sheetId" => {
19120                    f_sheet_id = val.parse().ok();
19121                }
19122                b"oldName" => {
19123                    f_old_name = Some(val.into_owned());
19124                }
19125                b"newName" => {
19126                    f_new_name = Some(val.into_owned());
19127                }
19128                #[cfg(feature = "extra-attrs")]
19129                unknown => {
19130                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19131                    extra_attrs.insert(key, val.into_owned());
19132                }
19133                #[cfg(not(feature = "extra-attrs"))]
19134                _ => {}
19135            }
19136        }
19137
19138        // Parse child elements
19139        if !is_empty {
19140            let mut buf = Vec::new();
19141            loop {
19142                match reader.read_event_into(&mut buf)? {
19143                    Event::Start(e) => {
19144                        match e.local_name().as_ref() {
19145                            b"extLst" => {
19146                                f_extension_list =
19147                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
19148                                #[cfg(feature = "extra-children")]
19149                                {
19150                                    child_idx += 1;
19151                                }
19152                            }
19153                            #[cfg(feature = "extra-children")]
19154                            _ => {
19155                                // Capture unknown element for roundtrip
19156                                let elem = RawXmlElement::from_reader(reader, &e)?;
19157                                extra_children.push(PositionedNode::new(
19158                                    child_idx,
19159                                    RawXmlNode::Element(elem),
19160                                ));
19161                                child_idx += 1;
19162                            }
19163                            #[cfg(not(feature = "extra-children"))]
19164                            _ => {
19165                                // Skip unknown element
19166                                skip_element(reader)?;
19167                            }
19168                        }
19169                    }
19170                    Event::Empty(e) => {
19171                        match e.local_name().as_ref() {
19172                            b"extLst" => {
19173                                f_extension_list =
19174                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
19175                                #[cfg(feature = "extra-children")]
19176                                {
19177                                    child_idx += 1;
19178                                }
19179                            }
19180                            #[cfg(feature = "extra-children")]
19181                            _ => {
19182                                // Capture unknown empty element for roundtrip
19183                                let elem = RawXmlElement::from_empty(&e);
19184                                extra_children.push(PositionedNode::new(
19185                                    child_idx,
19186                                    RawXmlNode::Element(elem),
19187                                ));
19188                                child_idx += 1;
19189                            }
19190                            #[cfg(not(feature = "extra-children"))]
19191                            _ => {}
19192                        }
19193                    }
19194                    Event::End(_) => break,
19195                    Event::Eof => break,
19196                    _ => {}
19197                }
19198                buf.clear();
19199            }
19200        }
19201
19202        Ok(Self {
19203            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
19204            ua: f_ua,
19205            ra: f_ra,
19206            sheet_id: f_sheet_id
19207                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19208            old_name: f_old_name
19209                .ok_or_else(|| ParseError::MissingAttribute("oldName".to_string()))?,
19210            new_name: f_new_name
19211                .ok_or_else(|| ParseError::MissingAttribute("newName".to_string()))?,
19212            extension_list: f_extension_list,
19213            #[cfg(feature = "extra-attrs")]
19214            extra_attrs,
19215            #[cfg(feature = "extra-children")]
19216            extra_children,
19217        })
19218    }
19219}
19220
19221impl FromXml for RevisionInsertSheet {
19222    fn from_xml<R: BufRead>(
19223        reader: &mut Reader<R>,
19224        start_tag: &BytesStart,
19225        is_empty: bool,
19226    ) -> Result<Self, ParseError> {
19227        let mut f_r_id: Option<u32> = None;
19228        let mut f_ua = None;
19229        let mut f_ra = None;
19230        let mut f_sheet_id: Option<u32> = None;
19231        let mut f_name: Option<XmlString> = None;
19232        let mut f_sheet_position: Option<u32> = None;
19233        #[cfg(feature = "extra-attrs")]
19234        let mut extra_attrs = std::collections::HashMap::new();
19235
19236        // Parse attributes
19237        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19238            let val = String::from_utf8_lossy(&attr.value);
19239            match attr.key.local_name().as_ref() {
19240                b"rId" => {
19241                    f_r_id = val.parse().ok();
19242                }
19243                b"ua" => {
19244                    f_ua = Some(val == "true" || val == "1");
19245                }
19246                b"ra" => {
19247                    f_ra = Some(val == "true" || val == "1");
19248                }
19249                b"sheetId" => {
19250                    f_sheet_id = val.parse().ok();
19251                }
19252                b"name" => {
19253                    f_name = Some(val.into_owned());
19254                }
19255                b"sheetPosition" => {
19256                    f_sheet_position = val.parse().ok();
19257                }
19258                #[cfg(feature = "extra-attrs")]
19259                unknown => {
19260                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19261                    extra_attrs.insert(key, val.into_owned());
19262                }
19263                #[cfg(not(feature = "extra-attrs"))]
19264                _ => {}
19265            }
19266        }
19267
19268        if !is_empty {
19269            let mut buf = Vec::new();
19270            loop {
19271                match reader.read_event_into(&mut buf)? {
19272                    Event::End(_) => break,
19273                    Event::Eof => break,
19274                    _ => {}
19275                }
19276                buf.clear();
19277            }
19278        }
19279
19280        Ok(Self {
19281            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
19282            ua: f_ua,
19283            ra: f_ra,
19284            sheet_id: f_sheet_id
19285                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19286            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
19287            sheet_position: f_sheet_position
19288                .ok_or_else(|| ParseError::MissingAttribute("sheetPosition".to_string()))?,
19289            #[cfg(feature = "extra-attrs")]
19290            extra_attrs,
19291        })
19292    }
19293}
19294
19295impl FromXml for RevisionCellChange {
19296    fn from_xml<R: BufRead>(
19297        reader: &mut Reader<R>,
19298        start_tag: &BytesStart,
19299        is_empty: bool,
19300    ) -> Result<Self, ParseError> {
19301        let mut f_r_id: Option<u32> = None;
19302        let mut f_ua = None;
19303        let mut f_ra = None;
19304        let mut f_s_id: Option<u32> = None;
19305        let mut f_odxf = None;
19306        let mut f_xf_dxf = None;
19307        let mut f_style_index = None;
19308        let mut f_dxf = None;
19309        let mut f_number_format_id = None;
19310        let mut f_quote_prefix = None;
19311        let mut f_old_quote_prefix = None;
19312        let mut f_placeholder = None;
19313        let mut f_old_ph = None;
19314        let mut f_end_of_list_formula_update = None;
19315        let mut f_oc = None;
19316        let mut f_nc: Option<Box<Cell>> = None;
19317        let mut f_ndxf = None;
19318        let mut f_extension_list = None;
19319        #[cfg(feature = "extra-attrs")]
19320        let mut extra_attrs = std::collections::HashMap::new();
19321        #[cfg(feature = "extra-children")]
19322        let mut extra_children = Vec::new();
19323        #[cfg(feature = "extra-children")]
19324        let mut child_idx: usize = 0;
19325
19326        // Parse attributes
19327        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19328            let val = String::from_utf8_lossy(&attr.value);
19329            match attr.key.local_name().as_ref() {
19330                b"rId" => {
19331                    f_r_id = val.parse().ok();
19332                }
19333                b"ua" => {
19334                    f_ua = Some(val == "true" || val == "1");
19335                }
19336                b"ra" => {
19337                    f_ra = Some(val == "true" || val == "1");
19338                }
19339                b"sId" => {
19340                    f_s_id = val.parse().ok();
19341                }
19342                b"odxf" => {
19343                    f_odxf = Some(val == "true" || val == "1");
19344                }
19345                b"xfDxf" => {
19346                    f_xf_dxf = Some(val == "true" || val == "1");
19347                }
19348                b"s" => {
19349                    f_style_index = Some(val == "true" || val == "1");
19350                }
19351                b"dxf" => {
19352                    f_dxf = Some(val == "true" || val == "1");
19353                }
19354                b"numFmtId" => {
19355                    f_number_format_id = val.parse().ok();
19356                }
19357                b"quotePrefix" => {
19358                    f_quote_prefix = Some(val == "true" || val == "1");
19359                }
19360                b"oldQuotePrefix" => {
19361                    f_old_quote_prefix = Some(val == "true" || val == "1");
19362                }
19363                b"ph" => {
19364                    f_placeholder = Some(val == "true" || val == "1");
19365                }
19366                b"oldPh" => {
19367                    f_old_ph = Some(val == "true" || val == "1");
19368                }
19369                b"endOfListFormulaUpdate" => {
19370                    f_end_of_list_formula_update = Some(val == "true" || val == "1");
19371                }
19372                #[cfg(feature = "extra-attrs")]
19373                unknown => {
19374                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19375                    extra_attrs.insert(key, val.into_owned());
19376                }
19377                #[cfg(not(feature = "extra-attrs"))]
19378                _ => {}
19379            }
19380        }
19381
19382        // Parse child elements
19383        if !is_empty {
19384            let mut buf = Vec::new();
19385            loop {
19386                match reader.read_event_into(&mut buf)? {
19387                    Event::Start(e) => {
19388                        match e.local_name().as_ref() {
19389                            b"oc" => {
19390                                f_oc = Some(Box::new(Cell::from_xml(reader, &e, false)?));
19391                                #[cfg(feature = "extra-children")]
19392                                {
19393                                    child_idx += 1;
19394                                }
19395                            }
19396                            b"nc" => {
19397                                f_nc = Some(Box::new(Cell::from_xml(reader, &e, false)?));
19398                                #[cfg(feature = "extra-children")]
19399                                {
19400                                    child_idx += 1;
19401                                }
19402                            }
19403                            b"ndxf" => {
19404                                f_ndxf = Some(Box::new(DifferentialFormat::from_xml(
19405                                    reader, &e, false,
19406                                )?));
19407                                #[cfg(feature = "extra-children")]
19408                                {
19409                                    child_idx += 1;
19410                                }
19411                            }
19412                            b"extLst" => {
19413                                f_extension_list =
19414                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
19415                                #[cfg(feature = "extra-children")]
19416                                {
19417                                    child_idx += 1;
19418                                }
19419                            }
19420                            #[cfg(feature = "extra-children")]
19421                            _ => {
19422                                // Capture unknown element for roundtrip
19423                                let elem = RawXmlElement::from_reader(reader, &e)?;
19424                                extra_children.push(PositionedNode::new(
19425                                    child_idx,
19426                                    RawXmlNode::Element(elem),
19427                                ));
19428                                child_idx += 1;
19429                            }
19430                            #[cfg(not(feature = "extra-children"))]
19431                            _ => {
19432                                // Skip unknown element
19433                                skip_element(reader)?;
19434                            }
19435                        }
19436                    }
19437                    Event::Empty(e) => {
19438                        match e.local_name().as_ref() {
19439                            b"oc" => {
19440                                f_oc = Some(Box::new(Cell::from_xml(reader, &e, true)?));
19441                                #[cfg(feature = "extra-children")]
19442                                {
19443                                    child_idx += 1;
19444                                }
19445                            }
19446                            b"nc" => {
19447                                f_nc = Some(Box::new(Cell::from_xml(reader, &e, true)?));
19448                                #[cfg(feature = "extra-children")]
19449                                {
19450                                    child_idx += 1;
19451                                }
19452                            }
19453                            b"ndxf" => {
19454                                f_ndxf =
19455                                    Some(Box::new(DifferentialFormat::from_xml(reader, &e, true)?));
19456                                #[cfg(feature = "extra-children")]
19457                                {
19458                                    child_idx += 1;
19459                                }
19460                            }
19461                            b"extLst" => {
19462                                f_extension_list =
19463                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
19464                                #[cfg(feature = "extra-children")]
19465                                {
19466                                    child_idx += 1;
19467                                }
19468                            }
19469                            #[cfg(feature = "extra-children")]
19470                            _ => {
19471                                // Capture unknown empty element for roundtrip
19472                                let elem = RawXmlElement::from_empty(&e);
19473                                extra_children.push(PositionedNode::new(
19474                                    child_idx,
19475                                    RawXmlNode::Element(elem),
19476                                ));
19477                                child_idx += 1;
19478                            }
19479                            #[cfg(not(feature = "extra-children"))]
19480                            _ => {}
19481                        }
19482                    }
19483                    Event::End(_) => break,
19484                    Event::Eof => break,
19485                    _ => {}
19486                }
19487                buf.clear();
19488            }
19489        }
19490
19491        Ok(Self {
19492            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
19493            ua: f_ua,
19494            ra: f_ra,
19495            s_id: f_s_id.ok_or_else(|| ParseError::MissingAttribute("sId".to_string()))?,
19496            odxf: f_odxf,
19497            xf_dxf: f_xf_dxf,
19498            style_index: f_style_index,
19499            dxf: f_dxf,
19500            number_format_id: f_number_format_id,
19501            quote_prefix: f_quote_prefix,
19502            old_quote_prefix: f_old_quote_prefix,
19503            placeholder: f_placeholder,
19504            old_ph: f_old_ph,
19505            end_of_list_formula_update: f_end_of_list_formula_update,
19506            oc: f_oc,
19507            nc: f_nc.ok_or_else(|| ParseError::MissingAttribute("nc".to_string()))?,
19508            ndxf: f_ndxf,
19509            extension_list: f_extension_list,
19510            #[cfg(feature = "extra-attrs")]
19511            extra_attrs,
19512            #[cfg(feature = "extra-children")]
19513            extra_children,
19514        })
19515    }
19516}
19517
19518impl FromXml for RevisionFormatting {
19519    fn from_xml<R: BufRead>(
19520        reader: &mut Reader<R>,
19521        start_tag: &BytesStart,
19522        is_empty: bool,
19523    ) -> Result<Self, ParseError> {
19524        let mut f_sheet_id: Option<u32> = None;
19525        let mut f_xf_dxf = None;
19526        let mut f_style_index = None;
19527        let mut f_square_reference: Option<SquareRef> = None;
19528        let mut f_start = None;
19529        let mut f_length = None;
19530        let mut f_dxf = None;
19531        let mut f_extension_list = None;
19532        #[cfg(feature = "extra-attrs")]
19533        let mut extra_attrs = std::collections::HashMap::new();
19534        #[cfg(feature = "extra-children")]
19535        let mut extra_children = Vec::new();
19536        #[cfg(feature = "extra-children")]
19537        let mut child_idx: usize = 0;
19538
19539        // Parse attributes
19540        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19541            let val = String::from_utf8_lossy(&attr.value);
19542            match attr.key.local_name().as_ref() {
19543                b"sheetId" => {
19544                    f_sheet_id = val.parse().ok();
19545                }
19546                b"xfDxf" => {
19547                    f_xf_dxf = Some(val == "true" || val == "1");
19548                }
19549                b"s" => {
19550                    f_style_index = Some(val == "true" || val == "1");
19551                }
19552                b"sqref" => {
19553                    f_square_reference = Some(val.into_owned());
19554                }
19555                b"start" => {
19556                    f_start = val.parse().ok();
19557                }
19558                b"length" => {
19559                    f_length = val.parse().ok();
19560                }
19561                #[cfg(feature = "extra-attrs")]
19562                unknown => {
19563                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19564                    extra_attrs.insert(key, val.into_owned());
19565                }
19566                #[cfg(not(feature = "extra-attrs"))]
19567                _ => {}
19568            }
19569        }
19570
19571        // Parse child elements
19572        if !is_empty {
19573            let mut buf = Vec::new();
19574            loop {
19575                match reader.read_event_into(&mut buf)? {
19576                    Event::Start(e) => {
19577                        match e.local_name().as_ref() {
19578                            b"dxf" => {
19579                                f_dxf = Some(Box::new(DifferentialFormat::from_xml(
19580                                    reader, &e, false,
19581                                )?));
19582                                #[cfg(feature = "extra-children")]
19583                                {
19584                                    child_idx += 1;
19585                                }
19586                            }
19587                            b"extLst" => {
19588                                f_extension_list =
19589                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
19590                                #[cfg(feature = "extra-children")]
19591                                {
19592                                    child_idx += 1;
19593                                }
19594                            }
19595                            #[cfg(feature = "extra-children")]
19596                            _ => {
19597                                // Capture unknown element for roundtrip
19598                                let elem = RawXmlElement::from_reader(reader, &e)?;
19599                                extra_children.push(PositionedNode::new(
19600                                    child_idx,
19601                                    RawXmlNode::Element(elem),
19602                                ));
19603                                child_idx += 1;
19604                            }
19605                            #[cfg(not(feature = "extra-children"))]
19606                            _ => {
19607                                // Skip unknown element
19608                                skip_element(reader)?;
19609                            }
19610                        }
19611                    }
19612                    Event::Empty(e) => {
19613                        match e.local_name().as_ref() {
19614                            b"dxf" => {
19615                                f_dxf =
19616                                    Some(Box::new(DifferentialFormat::from_xml(reader, &e, true)?));
19617                                #[cfg(feature = "extra-children")]
19618                                {
19619                                    child_idx += 1;
19620                                }
19621                            }
19622                            b"extLst" => {
19623                                f_extension_list =
19624                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
19625                                #[cfg(feature = "extra-children")]
19626                                {
19627                                    child_idx += 1;
19628                                }
19629                            }
19630                            #[cfg(feature = "extra-children")]
19631                            _ => {
19632                                // Capture unknown empty element for roundtrip
19633                                let elem = RawXmlElement::from_empty(&e);
19634                                extra_children.push(PositionedNode::new(
19635                                    child_idx,
19636                                    RawXmlNode::Element(elem),
19637                                ));
19638                                child_idx += 1;
19639                            }
19640                            #[cfg(not(feature = "extra-children"))]
19641                            _ => {}
19642                        }
19643                    }
19644                    Event::End(_) => break,
19645                    Event::Eof => break,
19646                    _ => {}
19647                }
19648                buf.clear();
19649            }
19650        }
19651
19652        Ok(Self {
19653            sheet_id: f_sheet_id
19654                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19655            xf_dxf: f_xf_dxf,
19656            style_index: f_style_index,
19657            square_reference: f_square_reference
19658                .ok_or_else(|| ParseError::MissingAttribute("sqref".to_string()))?,
19659            start: f_start,
19660            length: f_length,
19661            dxf: f_dxf,
19662            extension_list: f_extension_list,
19663            #[cfg(feature = "extra-attrs")]
19664            extra_attrs,
19665            #[cfg(feature = "extra-children")]
19666            extra_children,
19667        })
19668    }
19669}
19670
19671impl FromXml for RevisionAutoFormatting {
19672    fn from_xml<R: BufRead>(
19673        reader: &mut Reader<R>,
19674        start_tag: &BytesStart,
19675        is_empty: bool,
19676    ) -> Result<Self, ParseError> {
19677        let mut f_sheet_id: Option<u32> = None;
19678        let mut f_auto_format_id = None;
19679        let mut f_apply_number_formats = None;
19680        let mut f_apply_border_formats = None;
19681        let mut f_apply_font_formats = None;
19682        let mut f_apply_pattern_formats = None;
19683        let mut f_apply_alignment_formats = None;
19684        let mut f_apply_width_height_formats = None;
19685        let mut f_reference: Option<Reference> = None;
19686        #[cfg(feature = "extra-attrs")]
19687        let mut extra_attrs = std::collections::HashMap::new();
19688
19689        // Parse attributes
19690        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19691            let val = String::from_utf8_lossy(&attr.value);
19692            match attr.key.local_name().as_ref() {
19693                b"sheetId" => {
19694                    f_sheet_id = val.parse().ok();
19695                }
19696                b"autoFormatId" => {
19697                    f_auto_format_id = val.parse().ok();
19698                }
19699                b"applyNumberFormats" => {
19700                    f_apply_number_formats = Some(val == "true" || val == "1");
19701                }
19702                b"applyBorderFormats" => {
19703                    f_apply_border_formats = Some(val == "true" || val == "1");
19704                }
19705                b"applyFontFormats" => {
19706                    f_apply_font_formats = Some(val == "true" || val == "1");
19707                }
19708                b"applyPatternFormats" => {
19709                    f_apply_pattern_formats = Some(val == "true" || val == "1");
19710                }
19711                b"applyAlignmentFormats" => {
19712                    f_apply_alignment_formats = Some(val == "true" || val == "1");
19713                }
19714                b"applyWidthHeightFormats" => {
19715                    f_apply_width_height_formats = Some(val == "true" || val == "1");
19716                }
19717                b"ref" => {
19718                    f_reference = Some(val.into_owned());
19719                }
19720                #[cfg(feature = "extra-attrs")]
19721                unknown => {
19722                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19723                    extra_attrs.insert(key, val.into_owned());
19724                }
19725                #[cfg(not(feature = "extra-attrs"))]
19726                _ => {}
19727            }
19728        }
19729
19730        if !is_empty {
19731            let mut buf = Vec::new();
19732            loop {
19733                match reader.read_event_into(&mut buf)? {
19734                    Event::End(_) => break,
19735                    Event::Eof => break,
19736                    _ => {}
19737                }
19738                buf.clear();
19739            }
19740        }
19741
19742        Ok(Self {
19743            sheet_id: f_sheet_id
19744                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19745            auto_format_id: f_auto_format_id,
19746            apply_number_formats: f_apply_number_formats,
19747            apply_border_formats: f_apply_border_formats,
19748            apply_font_formats: f_apply_font_formats,
19749            apply_pattern_formats: f_apply_pattern_formats,
19750            apply_alignment_formats: f_apply_alignment_formats,
19751            apply_width_height_formats: f_apply_width_height_formats,
19752            reference: f_reference
19753                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
19754            #[cfg(feature = "extra-attrs")]
19755            extra_attrs,
19756        })
19757    }
19758}
19759
19760impl FromXml for RevisionComment {
19761    fn from_xml<R: BufRead>(
19762        reader: &mut Reader<R>,
19763        start_tag: &BytesStart,
19764        is_empty: bool,
19765    ) -> Result<Self, ParseError> {
19766        let mut f_sheet_id: Option<u32> = None;
19767        let mut f_cell: Option<CellRef> = None;
19768        let mut f_guid: Option<Guid> = None;
19769        let mut f_action = None;
19770        let mut f_always_show = None;
19771        let mut f_old = None;
19772        let mut f_hidden_row = None;
19773        let mut f_hidden_column = None;
19774        let mut f_author: Option<XmlString> = None;
19775        let mut f_old_length = None;
19776        let mut f_new_length = None;
19777        #[cfg(feature = "extra-attrs")]
19778        let mut extra_attrs = std::collections::HashMap::new();
19779
19780        // Parse attributes
19781        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19782            let val = String::from_utf8_lossy(&attr.value);
19783            match attr.key.local_name().as_ref() {
19784                b"sheetId" => {
19785                    f_sheet_id = val.parse().ok();
19786                }
19787                b"cell" => {
19788                    f_cell = Some(val.into_owned());
19789                }
19790                b"guid" => {
19791                    f_guid = Some(val.into_owned());
19792                }
19793                b"action" => {
19794                    f_action = val.parse().ok();
19795                }
19796                b"alwaysShow" => {
19797                    f_always_show = Some(val == "true" || val == "1");
19798                }
19799                b"old" => {
19800                    f_old = Some(val == "true" || val == "1");
19801                }
19802                b"hiddenRow" => {
19803                    f_hidden_row = Some(val == "true" || val == "1");
19804                }
19805                b"hiddenColumn" => {
19806                    f_hidden_column = Some(val == "true" || val == "1");
19807                }
19808                b"author" => {
19809                    f_author = Some(val.into_owned());
19810                }
19811                b"oldLength" => {
19812                    f_old_length = val.parse().ok();
19813                }
19814                b"newLength" => {
19815                    f_new_length = val.parse().ok();
19816                }
19817                #[cfg(feature = "extra-attrs")]
19818                unknown => {
19819                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19820                    extra_attrs.insert(key, val.into_owned());
19821                }
19822                #[cfg(not(feature = "extra-attrs"))]
19823                _ => {}
19824            }
19825        }
19826
19827        if !is_empty {
19828            let mut buf = Vec::new();
19829            loop {
19830                match reader.read_event_into(&mut buf)? {
19831                    Event::End(_) => break,
19832                    Event::Eof => break,
19833                    _ => {}
19834                }
19835                buf.clear();
19836            }
19837        }
19838
19839        Ok(Self {
19840            sheet_id: f_sheet_id
19841                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
19842            cell: f_cell.ok_or_else(|| ParseError::MissingAttribute("cell".to_string()))?,
19843            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
19844            action: f_action,
19845            always_show: f_always_show,
19846            old: f_old,
19847            hidden_row: f_hidden_row,
19848            hidden_column: f_hidden_column,
19849            author: f_author.ok_or_else(|| ParseError::MissingAttribute("author".to_string()))?,
19850            old_length: f_old_length,
19851            new_length: f_new_length,
19852            #[cfg(feature = "extra-attrs")]
19853            extra_attrs,
19854        })
19855    }
19856}
19857
19858impl FromXml for RevisionDefinedName {
19859    fn from_xml<R: BufRead>(
19860        reader: &mut Reader<R>,
19861        start_tag: &BytesStart,
19862        is_empty: bool,
19863    ) -> Result<Self, ParseError> {
19864        let mut f_r_id: Option<u32> = None;
19865        let mut f_ua = None;
19866        let mut f_ra = None;
19867        let mut f_local_sheet_id = None;
19868        let mut f_custom_view = None;
19869        let mut f_name: Option<XmlString> = None;
19870        let mut f_function = None;
19871        let mut f_old_function = None;
19872        let mut f_function_group_id = None;
19873        let mut f_old_function_group_id = None;
19874        let mut f_shortcut_key = None;
19875        let mut f_old_shortcut_key = None;
19876        let mut f_hidden = None;
19877        let mut f_old_hidden = None;
19878        let mut f_custom_menu = None;
19879        let mut f_old_custom_menu = None;
19880        let mut f_description = None;
19881        let mut f_old_description = None;
19882        let mut f_help = None;
19883        let mut f_old_help = None;
19884        let mut f_status_bar = None;
19885        let mut f_old_status_bar = None;
19886        let mut f_comment = None;
19887        let mut f_old_comment = None;
19888        let mut f_formula = None;
19889        let mut f_old_formula = None;
19890        let mut f_extension_list = None;
19891        #[cfg(feature = "extra-attrs")]
19892        let mut extra_attrs = std::collections::HashMap::new();
19893        #[cfg(feature = "extra-children")]
19894        let mut extra_children = Vec::new();
19895        #[cfg(feature = "extra-children")]
19896        let mut child_idx: usize = 0;
19897
19898        // Parse attributes
19899        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
19900            let val = String::from_utf8_lossy(&attr.value);
19901            match attr.key.local_name().as_ref() {
19902                b"rId" => {
19903                    f_r_id = val.parse().ok();
19904                }
19905                b"ua" => {
19906                    f_ua = Some(val == "true" || val == "1");
19907                }
19908                b"ra" => {
19909                    f_ra = Some(val == "true" || val == "1");
19910                }
19911                b"localSheetId" => {
19912                    f_local_sheet_id = val.parse().ok();
19913                }
19914                b"customView" => {
19915                    f_custom_view = Some(val == "true" || val == "1");
19916                }
19917                b"name" => {
19918                    f_name = Some(val.into_owned());
19919                }
19920                b"function" => {
19921                    f_function = Some(val == "true" || val == "1");
19922                }
19923                b"oldFunction" => {
19924                    f_old_function = Some(val == "true" || val == "1");
19925                }
19926                b"functionGroupId" => {
19927                    f_function_group_id = val.parse().ok();
19928                }
19929                b"oldFunctionGroupId" => {
19930                    f_old_function_group_id = val.parse().ok();
19931                }
19932                b"shortcutKey" => {
19933                    f_shortcut_key = val.parse().ok();
19934                }
19935                b"oldShortcutKey" => {
19936                    f_old_shortcut_key = val.parse().ok();
19937                }
19938                b"hidden" => {
19939                    f_hidden = Some(val == "true" || val == "1");
19940                }
19941                b"oldHidden" => {
19942                    f_old_hidden = Some(val == "true" || val == "1");
19943                }
19944                b"customMenu" => {
19945                    f_custom_menu = Some(val.into_owned());
19946                }
19947                b"oldCustomMenu" => {
19948                    f_old_custom_menu = Some(val.into_owned());
19949                }
19950                b"description" => {
19951                    f_description = Some(val.into_owned());
19952                }
19953                b"oldDescription" => {
19954                    f_old_description = Some(val.into_owned());
19955                }
19956                b"help" => {
19957                    f_help = Some(val.into_owned());
19958                }
19959                b"oldHelp" => {
19960                    f_old_help = Some(val.into_owned());
19961                }
19962                b"statusBar" => {
19963                    f_status_bar = Some(val.into_owned());
19964                }
19965                b"oldStatusBar" => {
19966                    f_old_status_bar = Some(val.into_owned());
19967                }
19968                b"comment" => {
19969                    f_comment = Some(val.into_owned());
19970                }
19971                b"oldComment" => {
19972                    f_old_comment = Some(val.into_owned());
19973                }
19974                #[cfg(feature = "extra-attrs")]
19975                unknown => {
19976                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
19977                    extra_attrs.insert(key, val.into_owned());
19978                }
19979                #[cfg(not(feature = "extra-attrs"))]
19980                _ => {}
19981            }
19982        }
19983
19984        // Parse child elements
19985        if !is_empty {
19986            let mut buf = Vec::new();
19987            loop {
19988                match reader.read_event_into(&mut buf)? {
19989                    Event::Start(e) => {
19990                        match e.local_name().as_ref() {
19991                            b"formula" => {
19992                                f_formula = Some(read_text_content(reader)?);
19993                                #[cfg(feature = "extra-children")]
19994                                {
19995                                    child_idx += 1;
19996                                }
19997                            }
19998                            b"oldFormula" => {
19999                                f_old_formula = Some(read_text_content(reader)?);
20000                                #[cfg(feature = "extra-children")]
20001                                {
20002                                    child_idx += 1;
20003                                }
20004                            }
20005                            b"extLst" => {
20006                                f_extension_list =
20007                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
20008                                #[cfg(feature = "extra-children")]
20009                                {
20010                                    child_idx += 1;
20011                                }
20012                            }
20013                            #[cfg(feature = "extra-children")]
20014                            _ => {
20015                                // Capture unknown element for roundtrip
20016                                let elem = RawXmlElement::from_reader(reader, &e)?;
20017                                extra_children.push(PositionedNode::new(
20018                                    child_idx,
20019                                    RawXmlNode::Element(elem),
20020                                ));
20021                                child_idx += 1;
20022                            }
20023                            #[cfg(not(feature = "extra-children"))]
20024                            _ => {
20025                                // Skip unknown element
20026                                skip_element(reader)?;
20027                            }
20028                        }
20029                    }
20030                    Event::Empty(e) => {
20031                        match e.local_name().as_ref() {
20032                            b"formula" => {
20033                                f_formula = Some(String::new());
20034                                #[cfg(feature = "extra-children")]
20035                                {
20036                                    child_idx += 1;
20037                                }
20038                            }
20039                            b"oldFormula" => {
20040                                f_old_formula = Some(String::new());
20041                                #[cfg(feature = "extra-children")]
20042                                {
20043                                    child_idx += 1;
20044                                }
20045                            }
20046                            b"extLst" => {
20047                                f_extension_list =
20048                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
20049                                #[cfg(feature = "extra-children")]
20050                                {
20051                                    child_idx += 1;
20052                                }
20053                            }
20054                            #[cfg(feature = "extra-children")]
20055                            _ => {
20056                                // Capture unknown empty element for roundtrip
20057                                let elem = RawXmlElement::from_empty(&e);
20058                                extra_children.push(PositionedNode::new(
20059                                    child_idx,
20060                                    RawXmlNode::Element(elem),
20061                                ));
20062                                child_idx += 1;
20063                            }
20064                            #[cfg(not(feature = "extra-children"))]
20065                            _ => {}
20066                        }
20067                    }
20068                    Event::End(_) => break,
20069                    Event::Eof => break,
20070                    _ => {}
20071                }
20072                buf.clear();
20073            }
20074        }
20075
20076        Ok(Self {
20077            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
20078            ua: f_ua,
20079            ra: f_ra,
20080            local_sheet_id: f_local_sheet_id,
20081            custom_view: f_custom_view,
20082            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
20083            function: f_function,
20084            old_function: f_old_function,
20085            function_group_id: f_function_group_id,
20086            old_function_group_id: f_old_function_group_id,
20087            shortcut_key: f_shortcut_key,
20088            old_shortcut_key: f_old_shortcut_key,
20089            hidden: f_hidden,
20090            old_hidden: f_old_hidden,
20091            custom_menu: f_custom_menu,
20092            old_custom_menu: f_old_custom_menu,
20093            description: f_description,
20094            old_description: f_old_description,
20095            help: f_help,
20096            old_help: f_old_help,
20097            status_bar: f_status_bar,
20098            old_status_bar: f_old_status_bar,
20099            comment: f_comment,
20100            old_comment: f_old_comment,
20101            formula: f_formula,
20102            old_formula: f_old_formula,
20103            extension_list: f_extension_list,
20104            #[cfg(feature = "extra-attrs")]
20105            extra_attrs,
20106            #[cfg(feature = "extra-children")]
20107            extra_children,
20108        })
20109    }
20110}
20111
20112impl FromXml for RevisionConflict {
20113    fn from_xml<R: BufRead>(
20114        reader: &mut Reader<R>,
20115        start_tag: &BytesStart,
20116        is_empty: bool,
20117    ) -> Result<Self, ParseError> {
20118        let mut f_r_id: Option<u32> = None;
20119        let mut f_ua = None;
20120        let mut f_ra = None;
20121        let mut f_sheet_id = None;
20122        #[cfg(feature = "extra-attrs")]
20123        let mut extra_attrs = std::collections::HashMap::new();
20124
20125        // Parse attributes
20126        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
20127            let val = String::from_utf8_lossy(&attr.value);
20128            match attr.key.local_name().as_ref() {
20129                b"rId" => {
20130                    f_r_id = val.parse().ok();
20131                }
20132                b"ua" => {
20133                    f_ua = Some(val == "true" || val == "1");
20134                }
20135                b"ra" => {
20136                    f_ra = Some(val == "true" || val == "1");
20137                }
20138                b"sheetId" => {
20139                    f_sheet_id = val.parse().ok();
20140                }
20141                #[cfg(feature = "extra-attrs")]
20142                unknown => {
20143                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
20144                    extra_attrs.insert(key, val.into_owned());
20145                }
20146                #[cfg(not(feature = "extra-attrs"))]
20147                _ => {}
20148            }
20149        }
20150
20151        if !is_empty {
20152            let mut buf = Vec::new();
20153            loop {
20154                match reader.read_event_into(&mut buf)? {
20155                    Event::End(_) => break,
20156                    Event::Eof => break,
20157                    _ => {}
20158                }
20159                buf.clear();
20160            }
20161        }
20162
20163        Ok(Self {
20164            r_id: f_r_id.ok_or_else(|| ParseError::MissingAttribute("rId".to_string()))?,
20165            ua: f_ua,
20166            ra: f_ra,
20167            sheet_id: f_sheet_id,
20168            #[cfg(feature = "extra-attrs")]
20169            extra_attrs,
20170        })
20171    }
20172}
20173
20174impl FromXml for RevisionQueryTableField {
20175    fn from_xml<R: BufRead>(
20176        reader: &mut Reader<R>,
20177        start_tag: &BytesStart,
20178        is_empty: bool,
20179    ) -> Result<Self, ParseError> {
20180        let mut f_sheet_id: Option<u32> = None;
20181        let mut f_reference: Option<Reference> = None;
20182        let mut f_field_id: Option<u32> = None;
20183        #[cfg(feature = "extra-attrs")]
20184        let mut extra_attrs = std::collections::HashMap::new();
20185
20186        // Parse attributes
20187        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
20188            let val = String::from_utf8_lossy(&attr.value);
20189            match attr.key.local_name().as_ref() {
20190                b"sheetId" => {
20191                    f_sheet_id = val.parse().ok();
20192                }
20193                b"ref" => {
20194                    f_reference = Some(val.into_owned());
20195                }
20196                b"fieldId" => {
20197                    f_field_id = val.parse().ok();
20198                }
20199                #[cfg(feature = "extra-attrs")]
20200                unknown => {
20201                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
20202                    extra_attrs.insert(key, val.into_owned());
20203                }
20204                #[cfg(not(feature = "extra-attrs"))]
20205                _ => {}
20206            }
20207        }
20208
20209        if !is_empty {
20210            let mut buf = Vec::new();
20211            loop {
20212                match reader.read_event_into(&mut buf)? {
20213                    Event::End(_) => break,
20214                    Event::Eof => break,
20215                    _ => {}
20216                }
20217                buf.clear();
20218            }
20219        }
20220
20221        Ok(Self {
20222            sheet_id: f_sheet_id
20223                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
20224            reference: f_reference
20225                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
20226            field_id: f_field_id
20227                .ok_or_else(|| ParseError::MissingAttribute("fieldId".to_string()))?,
20228            #[cfg(feature = "extra-attrs")]
20229            extra_attrs,
20230        })
20231    }
20232}
20233
20234impl FromXml for Users {
20235    fn from_xml<R: BufRead>(
20236        reader: &mut Reader<R>,
20237        start_tag: &BytesStart,
20238        is_empty: bool,
20239    ) -> Result<Self, ParseError> {
20240        let mut f_count = None;
20241        let mut f_user_info = Vec::new();
20242        #[cfg(feature = "extra-attrs")]
20243        let mut extra_attrs = std::collections::HashMap::new();
20244        #[cfg(feature = "extra-children")]
20245        let mut extra_children = Vec::new();
20246        #[cfg(feature = "extra-children")]
20247        let mut child_idx: usize = 0;
20248
20249        // Parse attributes
20250        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
20251            let val = String::from_utf8_lossy(&attr.value);
20252            match attr.key.local_name().as_ref() {
20253                b"count" => {
20254                    f_count = val.parse().ok();
20255                }
20256                #[cfg(feature = "extra-attrs")]
20257                unknown => {
20258                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
20259                    extra_attrs.insert(key, val.into_owned());
20260                }
20261                #[cfg(not(feature = "extra-attrs"))]
20262                _ => {}
20263            }
20264        }
20265
20266        // Parse child elements
20267        if !is_empty {
20268            let mut buf = Vec::new();
20269            loop {
20270                match reader.read_event_into(&mut buf)? {
20271                    Event::Start(e) => {
20272                        match e.local_name().as_ref() {
20273                            b"userInfo" => {
20274                                f_user_info.push(SharedUser::from_xml(reader, &e, false)?);
20275                                #[cfg(feature = "extra-children")]
20276                                {
20277                                    child_idx += 1;
20278                                }
20279                            }
20280                            #[cfg(feature = "extra-children")]
20281                            _ => {
20282                                // Capture unknown element for roundtrip
20283                                let elem = RawXmlElement::from_reader(reader, &e)?;
20284                                extra_children.push(PositionedNode::new(
20285                                    child_idx,
20286                                    RawXmlNode::Element(elem),
20287                                ));
20288                                child_idx += 1;
20289                            }
20290                            #[cfg(not(feature = "extra-children"))]
20291                            _ => {
20292                                // Skip unknown element
20293                                skip_element(reader)?;
20294                            }
20295                        }
20296                    }
20297                    Event::Empty(e) => {
20298                        match e.local_name().as_ref() {
20299                            b"userInfo" => {
20300                                f_user_info.push(SharedUser::from_xml(reader, &e, true)?);
20301                                #[cfg(feature = "extra-children")]
20302                                {
20303                                    child_idx += 1;
20304                                }
20305                            }
20306                            #[cfg(feature = "extra-children")]
20307                            _ => {
20308                                // Capture unknown empty element for roundtrip
20309                                let elem = RawXmlElement::from_empty(&e);
20310                                extra_children.push(PositionedNode::new(
20311                                    child_idx,
20312                                    RawXmlNode::Element(elem),
20313                                ));
20314                                child_idx += 1;
20315                            }
20316                            #[cfg(not(feature = "extra-children"))]
20317                            _ => {}
20318                        }
20319                    }
20320                    Event::End(_) => break,
20321                    Event::Eof => break,
20322                    _ => {}
20323                }
20324                buf.clear();
20325            }
20326        }
20327
20328        Ok(Self {
20329            count: f_count,
20330            user_info: f_user_info,
20331            #[cfg(feature = "extra-attrs")]
20332            extra_attrs,
20333            #[cfg(feature = "extra-children")]
20334            extra_children,
20335        })
20336    }
20337}
20338
20339impl FromXml for SharedUser {
20340    fn from_xml<R: BufRead>(
20341        reader: &mut Reader<R>,
20342        start_tag: &BytesStart,
20343        is_empty: bool,
20344    ) -> Result<Self, ParseError> {
20345        let mut f_guid: Option<Guid> = None;
20346        let mut f_name: Option<XmlString> = None;
20347        let mut f_id: Option<i32> = None;
20348        let mut f_date_time: Option<String> = None;
20349        let mut f_extension_list = None;
20350        #[cfg(feature = "extra-attrs")]
20351        let mut extra_attrs = std::collections::HashMap::new();
20352        #[cfg(feature = "extra-children")]
20353        let mut extra_children = Vec::new();
20354        #[cfg(feature = "extra-children")]
20355        let mut child_idx: usize = 0;
20356
20357        // Parse attributes
20358        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
20359            let val = String::from_utf8_lossy(&attr.value);
20360            match attr.key.local_name().as_ref() {
20361                b"guid" => {
20362                    f_guid = Some(val.into_owned());
20363                }
20364                b"name" => {
20365                    f_name = Some(val.into_owned());
20366                }
20367                b"id" => {
20368                    f_id = val.parse().ok();
20369                }
20370                b"dateTime" => {
20371                    f_date_time = Some(val.into_owned());
20372                }
20373                #[cfg(feature = "extra-attrs")]
20374                unknown => {
20375                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
20376                    extra_attrs.insert(key, val.into_owned());
20377                }
20378                #[cfg(not(feature = "extra-attrs"))]
20379                _ => {}
20380            }
20381        }
20382
20383        // Parse child elements
20384        if !is_empty {
20385            let mut buf = Vec::new();
20386            loop {
20387                match reader.read_event_into(&mut buf)? {
20388                    Event::Start(e) => {
20389                        match e.local_name().as_ref() {
20390                            b"extLst" => {
20391                                f_extension_list =
20392                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
20393                                #[cfg(feature = "extra-children")]
20394                                {
20395                                    child_idx += 1;
20396                                }
20397                            }
20398                            #[cfg(feature = "extra-children")]
20399                            _ => {
20400                                // Capture unknown element for roundtrip
20401                                let elem = RawXmlElement::from_reader(reader, &e)?;
20402                                extra_children.push(PositionedNode::new(
20403                                    child_idx,
20404                                    RawXmlNode::Element(elem),
20405                                ));
20406                                child_idx += 1;
20407                            }
20408                            #[cfg(not(feature = "extra-children"))]
20409                            _ => {
20410                                // Skip unknown element
20411                                skip_element(reader)?;
20412                            }
20413                        }
20414                    }
20415                    Event::Empty(e) => {
20416                        match e.local_name().as_ref() {
20417                            b"extLst" => {
20418                                f_extension_list =
20419                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
20420                                #[cfg(feature = "extra-children")]
20421                                {
20422                                    child_idx += 1;
20423                                }
20424                            }
20425                            #[cfg(feature = "extra-children")]
20426                            _ => {
20427                                // Capture unknown empty element for roundtrip
20428                                let elem = RawXmlElement::from_empty(&e);
20429                                extra_children.push(PositionedNode::new(
20430                                    child_idx,
20431                                    RawXmlNode::Element(elem),
20432                                ));
20433                                child_idx += 1;
20434                            }
20435                            #[cfg(not(feature = "extra-children"))]
20436                            _ => {}
20437                        }
20438                    }
20439                    Event::End(_) => break,
20440                    Event::Eof => break,
20441                    _ => {}
20442                }
20443                buf.clear();
20444            }
20445        }
20446
20447        Ok(Self {
20448            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
20449            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
20450            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
20451            date_time: f_date_time
20452                .ok_or_else(|| ParseError::MissingAttribute("dateTime".to_string()))?,
20453            extension_list: f_extension_list,
20454            #[cfg(feature = "extra-attrs")]
20455            extra_attrs,
20456            #[cfg(feature = "extra-children")]
20457            extra_children,
20458        })
20459    }
20460}
20461
20462impl FromXml for CTMacrosheet {
20463    fn from_xml<R: BufRead>(
20464        reader: &mut Reader<R>,
20465        start_tag: &BytesStart,
20466        is_empty: bool,
20467    ) -> Result<Self, ParseError> {
20468        let mut f_sheet_properties = None;
20469        let mut f_dimension = None;
20470        let mut f_sheet_views = None;
20471        let mut f_sheet_format = None;
20472        let mut f_cols = Vec::new();
20473        let mut f_sheet_data: Option<Box<SheetData>> = None;
20474        let mut f_sheet_protection = None;
20475        let mut f_auto_filter = None;
20476        let mut f_sort_state = None;
20477        let mut f_data_consolidate = None;
20478        let mut f_custom_sheet_views = None;
20479        let mut f_phonetic_pr = None;
20480        let mut f_conditional_formatting = Vec::new();
20481        let mut f_print_options = None;
20482        let mut f_page_margins = None;
20483        let mut f_page_setup = None;
20484        let mut f_header_footer = None;
20485        let mut f_row_breaks = None;
20486        let mut f_col_breaks = None;
20487        let mut f_custom_properties = None;
20488        let mut f_drawing = None;
20489        let mut f_legacy_drawing = None;
20490        let mut f_legacy_drawing_h_f = None;
20491        let mut f_drawing_h_f = None;
20492        let mut f_picture = None;
20493        let mut f_ole_objects = None;
20494        let mut f_extension_list = None;
20495        #[cfg(feature = "extra-children")]
20496        let mut extra_children = Vec::new();
20497        #[cfg(feature = "extra-children")]
20498        let mut child_idx: usize = 0;
20499
20500        // Parse child elements
20501        if !is_empty {
20502            let mut buf = Vec::new();
20503            loop {
20504                match reader.read_event_into(&mut buf)? {
20505                    Event::Start(e) => {
20506                        match e.local_name().as_ref() {
20507                            b"sheetPr" => {
20508                                f_sheet_properties =
20509                                    Some(Box::new(SheetProperties::from_xml(reader, &e, false)?));
20510                                #[cfg(feature = "extra-children")]
20511                                {
20512                                    child_idx += 1;
20513                                }
20514                            }
20515                            b"dimension" => {
20516                                f_dimension =
20517                                    Some(Box::new(SheetDimension::from_xml(reader, &e, false)?));
20518                                #[cfg(feature = "extra-children")]
20519                                {
20520                                    child_idx += 1;
20521                                }
20522                            }
20523                            b"sheetViews" => {
20524                                f_sheet_views =
20525                                    Some(Box::new(SheetViews::from_xml(reader, &e, false)?));
20526                                #[cfg(feature = "extra-children")]
20527                                {
20528                                    child_idx += 1;
20529                                }
20530                            }
20531                            b"sheetFormatPr" => {
20532                                f_sheet_format =
20533                                    Some(Box::new(SheetFormat::from_xml(reader, &e, false)?));
20534                                #[cfg(feature = "extra-children")]
20535                                {
20536                                    child_idx += 1;
20537                                }
20538                            }
20539                            b"cols" => {
20540                                f_cols.push(Columns::from_xml(reader, &e, false)?);
20541                                #[cfg(feature = "extra-children")]
20542                                {
20543                                    child_idx += 1;
20544                                }
20545                            }
20546                            b"sheetData" => {
20547                                f_sheet_data =
20548                                    Some(Box::new(SheetData::from_xml(reader, &e, false)?));
20549                                #[cfg(feature = "extra-children")]
20550                                {
20551                                    child_idx += 1;
20552                                }
20553                            }
20554                            b"sheetProtection" => {
20555                                f_sheet_protection =
20556                                    Some(Box::new(SheetProtection::from_xml(reader, &e, false)?));
20557                                #[cfg(feature = "extra-children")]
20558                                {
20559                                    child_idx += 1;
20560                                }
20561                            }
20562                            b"autoFilter" => {
20563                                f_auto_filter =
20564                                    Some(Box::new(AutoFilter::from_xml(reader, &e, false)?));
20565                                #[cfg(feature = "extra-children")]
20566                                {
20567                                    child_idx += 1;
20568                                }
20569                            }
20570                            b"sortState" => {
20571                                f_sort_state =
20572                                    Some(Box::new(SortState::from_xml(reader, &e, false)?));
20573                                #[cfg(feature = "extra-children")]
20574                                {
20575                                    child_idx += 1;
20576                                }
20577                            }
20578                            b"dataConsolidate" => {
20579                                f_data_consolidate =
20580                                    Some(Box::new(CTDataConsolidate::from_xml(reader, &e, false)?));
20581                                #[cfg(feature = "extra-children")]
20582                                {
20583                                    child_idx += 1;
20584                                }
20585                            }
20586                            b"customSheetViews" => {
20587                                f_custom_sheet_views =
20588                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, false)?));
20589                                #[cfg(feature = "extra-children")]
20590                                {
20591                                    child_idx += 1;
20592                                }
20593                            }
20594                            b"phoneticPr" => {
20595                                f_phonetic_pr = Some(Box::new(PhoneticProperties::from_xml(
20596                                    reader, &e, false,
20597                                )?));
20598                                #[cfg(feature = "extra-children")]
20599                                {
20600                                    child_idx += 1;
20601                                }
20602                            }
20603                            b"conditionalFormatting" => {
20604                                f_conditional_formatting
20605                                    .push(ConditionalFormatting::from_xml(reader, &e, false)?);
20606                                #[cfg(feature = "extra-children")]
20607                                {
20608                                    child_idx += 1;
20609                                }
20610                            }
20611                            b"printOptions" => {
20612                                f_print_options =
20613                                    Some(Box::new(PrintOptions::from_xml(reader, &e, false)?));
20614                                #[cfg(feature = "extra-children")]
20615                                {
20616                                    child_idx += 1;
20617                                }
20618                            }
20619                            b"pageMargins" => {
20620                                f_page_margins =
20621                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
20622                                #[cfg(feature = "extra-children")]
20623                                {
20624                                    child_idx += 1;
20625                                }
20626                            }
20627                            b"pageSetup" => {
20628                                f_page_setup =
20629                                    Some(Box::new(PageSetup::from_xml(reader, &e, false)?));
20630                                #[cfg(feature = "extra-children")]
20631                                {
20632                                    child_idx += 1;
20633                                }
20634                            }
20635                            b"headerFooter" => {
20636                                f_header_footer =
20637                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
20638                                #[cfg(feature = "extra-children")]
20639                                {
20640                                    child_idx += 1;
20641                                }
20642                            }
20643                            b"rowBreaks" => {
20644                                f_row_breaks =
20645                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
20646                                #[cfg(feature = "extra-children")]
20647                                {
20648                                    child_idx += 1;
20649                                }
20650                            }
20651                            b"colBreaks" => {
20652                                f_col_breaks =
20653                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
20654                                #[cfg(feature = "extra-children")]
20655                                {
20656                                    child_idx += 1;
20657                                }
20658                            }
20659                            b"customProperties" => {
20660                                f_custom_properties = Some(Box::new(CTCustomProperties::from_xml(
20661                                    reader, &e, false,
20662                                )?));
20663                                #[cfg(feature = "extra-children")]
20664                                {
20665                                    child_idx += 1;
20666                                }
20667                            }
20668                            b"drawing" => {
20669                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, false)?));
20670                                #[cfg(feature = "extra-children")]
20671                                {
20672                                    child_idx += 1;
20673                                }
20674                            }
20675                            b"legacyDrawing" => {
20676                                f_legacy_drawing =
20677                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
20678                                #[cfg(feature = "extra-children")]
20679                                {
20680                                    child_idx += 1;
20681                                }
20682                            }
20683                            b"legacyDrawingHF" => {
20684                                f_legacy_drawing_h_f =
20685                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
20686                                #[cfg(feature = "extra-children")]
20687                                {
20688                                    child_idx += 1;
20689                                }
20690                            }
20691                            b"drawingHF" => {
20692                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
20693                                    reader, &e, false,
20694                                )?));
20695                                #[cfg(feature = "extra-children")]
20696                                {
20697                                    child_idx += 1;
20698                                }
20699                            }
20700                            b"picture" => {
20701                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
20702                                    reader, &e, false,
20703                                )?));
20704                                #[cfg(feature = "extra-children")]
20705                                {
20706                                    child_idx += 1;
20707                                }
20708                            }
20709                            b"oleObjects" => {
20710                                f_ole_objects =
20711                                    Some(Box::new(OleObjects::from_xml(reader, &e, false)?));
20712                                #[cfg(feature = "extra-children")]
20713                                {
20714                                    child_idx += 1;
20715                                }
20716                            }
20717                            b"extLst" => {
20718                                f_extension_list =
20719                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
20720                                #[cfg(feature = "extra-children")]
20721                                {
20722                                    child_idx += 1;
20723                                }
20724                            }
20725                            #[cfg(feature = "extra-children")]
20726                            _ => {
20727                                // Capture unknown element for roundtrip
20728                                let elem = RawXmlElement::from_reader(reader, &e)?;
20729                                extra_children.push(PositionedNode::new(
20730                                    child_idx,
20731                                    RawXmlNode::Element(elem),
20732                                ));
20733                                child_idx += 1;
20734                            }
20735                            #[cfg(not(feature = "extra-children"))]
20736                            _ => {
20737                                // Skip unknown element
20738                                skip_element(reader)?;
20739                            }
20740                        }
20741                    }
20742                    Event::Empty(e) => {
20743                        match e.local_name().as_ref() {
20744                            b"sheetPr" => {
20745                                f_sheet_properties =
20746                                    Some(Box::new(SheetProperties::from_xml(reader, &e, true)?));
20747                                #[cfg(feature = "extra-children")]
20748                                {
20749                                    child_idx += 1;
20750                                }
20751                            }
20752                            b"dimension" => {
20753                                f_dimension =
20754                                    Some(Box::new(SheetDimension::from_xml(reader, &e, true)?));
20755                                #[cfg(feature = "extra-children")]
20756                                {
20757                                    child_idx += 1;
20758                                }
20759                            }
20760                            b"sheetViews" => {
20761                                f_sheet_views =
20762                                    Some(Box::new(SheetViews::from_xml(reader, &e, true)?));
20763                                #[cfg(feature = "extra-children")]
20764                                {
20765                                    child_idx += 1;
20766                                }
20767                            }
20768                            b"sheetFormatPr" => {
20769                                f_sheet_format =
20770                                    Some(Box::new(SheetFormat::from_xml(reader, &e, true)?));
20771                                #[cfg(feature = "extra-children")]
20772                                {
20773                                    child_idx += 1;
20774                                }
20775                            }
20776                            b"cols" => {
20777                                f_cols.push(Columns::from_xml(reader, &e, true)?);
20778                                #[cfg(feature = "extra-children")]
20779                                {
20780                                    child_idx += 1;
20781                                }
20782                            }
20783                            b"sheetData" => {
20784                                f_sheet_data =
20785                                    Some(Box::new(SheetData::from_xml(reader, &e, true)?));
20786                                #[cfg(feature = "extra-children")]
20787                                {
20788                                    child_idx += 1;
20789                                }
20790                            }
20791                            b"sheetProtection" => {
20792                                f_sheet_protection =
20793                                    Some(Box::new(SheetProtection::from_xml(reader, &e, true)?));
20794                                #[cfg(feature = "extra-children")]
20795                                {
20796                                    child_idx += 1;
20797                                }
20798                            }
20799                            b"autoFilter" => {
20800                                f_auto_filter =
20801                                    Some(Box::new(AutoFilter::from_xml(reader, &e, true)?));
20802                                #[cfg(feature = "extra-children")]
20803                                {
20804                                    child_idx += 1;
20805                                }
20806                            }
20807                            b"sortState" => {
20808                                f_sort_state =
20809                                    Some(Box::new(SortState::from_xml(reader, &e, true)?));
20810                                #[cfg(feature = "extra-children")]
20811                                {
20812                                    child_idx += 1;
20813                                }
20814                            }
20815                            b"dataConsolidate" => {
20816                                f_data_consolidate =
20817                                    Some(Box::new(CTDataConsolidate::from_xml(reader, &e, true)?));
20818                                #[cfg(feature = "extra-children")]
20819                                {
20820                                    child_idx += 1;
20821                                }
20822                            }
20823                            b"customSheetViews" => {
20824                                f_custom_sheet_views =
20825                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, true)?));
20826                                #[cfg(feature = "extra-children")]
20827                                {
20828                                    child_idx += 1;
20829                                }
20830                            }
20831                            b"phoneticPr" => {
20832                                f_phonetic_pr =
20833                                    Some(Box::new(PhoneticProperties::from_xml(reader, &e, true)?));
20834                                #[cfg(feature = "extra-children")]
20835                                {
20836                                    child_idx += 1;
20837                                }
20838                            }
20839                            b"conditionalFormatting" => {
20840                                f_conditional_formatting
20841                                    .push(ConditionalFormatting::from_xml(reader, &e, true)?);
20842                                #[cfg(feature = "extra-children")]
20843                                {
20844                                    child_idx += 1;
20845                                }
20846                            }
20847                            b"printOptions" => {
20848                                f_print_options =
20849                                    Some(Box::new(PrintOptions::from_xml(reader, &e, true)?));
20850                                #[cfg(feature = "extra-children")]
20851                                {
20852                                    child_idx += 1;
20853                                }
20854                            }
20855                            b"pageMargins" => {
20856                                f_page_margins =
20857                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
20858                                #[cfg(feature = "extra-children")]
20859                                {
20860                                    child_idx += 1;
20861                                }
20862                            }
20863                            b"pageSetup" => {
20864                                f_page_setup =
20865                                    Some(Box::new(PageSetup::from_xml(reader, &e, true)?));
20866                                #[cfg(feature = "extra-children")]
20867                                {
20868                                    child_idx += 1;
20869                                }
20870                            }
20871                            b"headerFooter" => {
20872                                f_header_footer =
20873                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
20874                                #[cfg(feature = "extra-children")]
20875                                {
20876                                    child_idx += 1;
20877                                }
20878                            }
20879                            b"rowBreaks" => {
20880                                f_row_breaks =
20881                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
20882                                #[cfg(feature = "extra-children")]
20883                                {
20884                                    child_idx += 1;
20885                                }
20886                            }
20887                            b"colBreaks" => {
20888                                f_col_breaks =
20889                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
20890                                #[cfg(feature = "extra-children")]
20891                                {
20892                                    child_idx += 1;
20893                                }
20894                            }
20895                            b"customProperties" => {
20896                                f_custom_properties =
20897                                    Some(Box::new(CTCustomProperties::from_xml(reader, &e, true)?));
20898                                #[cfg(feature = "extra-children")]
20899                                {
20900                                    child_idx += 1;
20901                                }
20902                            }
20903                            b"drawing" => {
20904                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, true)?));
20905                                #[cfg(feature = "extra-children")]
20906                                {
20907                                    child_idx += 1;
20908                                }
20909                            }
20910                            b"legacyDrawing" => {
20911                                f_legacy_drawing =
20912                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
20913                                #[cfg(feature = "extra-children")]
20914                                {
20915                                    child_idx += 1;
20916                                }
20917                            }
20918                            b"legacyDrawingHF" => {
20919                                f_legacy_drawing_h_f =
20920                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
20921                                #[cfg(feature = "extra-children")]
20922                                {
20923                                    child_idx += 1;
20924                                }
20925                            }
20926                            b"drawingHF" => {
20927                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
20928                                    reader, &e, true,
20929                                )?));
20930                                #[cfg(feature = "extra-children")]
20931                                {
20932                                    child_idx += 1;
20933                                }
20934                            }
20935                            b"picture" => {
20936                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
20937                                    reader, &e, true,
20938                                )?));
20939                                #[cfg(feature = "extra-children")]
20940                                {
20941                                    child_idx += 1;
20942                                }
20943                            }
20944                            b"oleObjects" => {
20945                                f_ole_objects =
20946                                    Some(Box::new(OleObjects::from_xml(reader, &e, true)?));
20947                                #[cfg(feature = "extra-children")]
20948                                {
20949                                    child_idx += 1;
20950                                }
20951                            }
20952                            b"extLst" => {
20953                                f_extension_list =
20954                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
20955                                #[cfg(feature = "extra-children")]
20956                                {
20957                                    child_idx += 1;
20958                                }
20959                            }
20960                            #[cfg(feature = "extra-children")]
20961                            _ => {
20962                                // Capture unknown empty element for roundtrip
20963                                let elem = RawXmlElement::from_empty(&e);
20964                                extra_children.push(PositionedNode::new(
20965                                    child_idx,
20966                                    RawXmlNode::Element(elem),
20967                                ));
20968                                child_idx += 1;
20969                            }
20970                            #[cfg(not(feature = "extra-children"))]
20971                            _ => {}
20972                        }
20973                    }
20974                    Event::End(_) => break,
20975                    Event::Eof => break,
20976                    _ => {}
20977                }
20978                buf.clear();
20979            }
20980        }
20981
20982        Ok(Self {
20983            sheet_properties: f_sheet_properties,
20984            dimension: f_dimension,
20985            sheet_views: f_sheet_views,
20986            sheet_format: f_sheet_format,
20987            cols: f_cols,
20988            sheet_data: f_sheet_data
20989                .ok_or_else(|| ParseError::MissingAttribute("sheetData".to_string()))?,
20990            sheet_protection: f_sheet_protection,
20991            auto_filter: f_auto_filter,
20992            sort_state: f_sort_state,
20993            data_consolidate: f_data_consolidate,
20994            custom_sheet_views: f_custom_sheet_views,
20995            phonetic_pr: f_phonetic_pr,
20996            conditional_formatting: f_conditional_formatting,
20997            print_options: f_print_options,
20998            page_margins: f_page_margins,
20999            page_setup: f_page_setup,
21000            header_footer: f_header_footer,
21001            row_breaks: f_row_breaks,
21002            col_breaks: f_col_breaks,
21003            custom_properties: f_custom_properties,
21004            drawing: f_drawing,
21005            legacy_drawing: f_legacy_drawing,
21006            legacy_drawing_h_f: f_legacy_drawing_h_f,
21007            drawing_h_f: f_drawing_h_f,
21008            picture: f_picture,
21009            ole_objects: f_ole_objects,
21010            extension_list: f_extension_list,
21011            #[cfg(feature = "extra-children")]
21012            extra_children,
21013        })
21014    }
21015}
21016
21017impl FromXml for CTDialogsheet {
21018    fn from_xml<R: BufRead>(
21019        reader: &mut Reader<R>,
21020        start_tag: &BytesStart,
21021        is_empty: bool,
21022    ) -> Result<Self, ParseError> {
21023        let mut f_sheet_properties = None;
21024        let mut f_sheet_views = None;
21025        let mut f_sheet_format = None;
21026        let mut f_sheet_protection = None;
21027        let mut f_custom_sheet_views = None;
21028        let mut f_print_options = None;
21029        let mut f_page_margins = None;
21030        let mut f_page_setup = None;
21031        let mut f_header_footer = None;
21032        let mut f_drawing = None;
21033        let mut f_legacy_drawing = None;
21034        let mut f_legacy_drawing_h_f = None;
21035        let mut f_drawing_h_f = None;
21036        let mut f_ole_objects = None;
21037        let mut f_controls = None;
21038        let mut f_extension_list = None;
21039        #[cfg(feature = "extra-children")]
21040        let mut extra_children = Vec::new();
21041        #[cfg(feature = "extra-children")]
21042        let mut child_idx: usize = 0;
21043
21044        // Parse child elements
21045        if !is_empty {
21046            let mut buf = Vec::new();
21047            loop {
21048                match reader.read_event_into(&mut buf)? {
21049                    Event::Start(e) => {
21050                        match e.local_name().as_ref() {
21051                            b"sheetPr" => {
21052                                f_sheet_properties =
21053                                    Some(Box::new(SheetProperties::from_xml(reader, &e, false)?));
21054                                #[cfg(feature = "extra-children")]
21055                                {
21056                                    child_idx += 1;
21057                                }
21058                            }
21059                            b"sheetViews" => {
21060                                f_sheet_views =
21061                                    Some(Box::new(SheetViews::from_xml(reader, &e, false)?));
21062                                #[cfg(feature = "extra-children")]
21063                                {
21064                                    child_idx += 1;
21065                                }
21066                            }
21067                            b"sheetFormatPr" => {
21068                                f_sheet_format =
21069                                    Some(Box::new(SheetFormat::from_xml(reader, &e, false)?));
21070                                #[cfg(feature = "extra-children")]
21071                                {
21072                                    child_idx += 1;
21073                                }
21074                            }
21075                            b"sheetProtection" => {
21076                                f_sheet_protection =
21077                                    Some(Box::new(SheetProtection::from_xml(reader, &e, false)?));
21078                                #[cfg(feature = "extra-children")]
21079                                {
21080                                    child_idx += 1;
21081                                }
21082                            }
21083                            b"customSheetViews" => {
21084                                f_custom_sheet_views =
21085                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, false)?));
21086                                #[cfg(feature = "extra-children")]
21087                                {
21088                                    child_idx += 1;
21089                                }
21090                            }
21091                            b"printOptions" => {
21092                                f_print_options =
21093                                    Some(Box::new(PrintOptions::from_xml(reader, &e, false)?));
21094                                #[cfg(feature = "extra-children")]
21095                                {
21096                                    child_idx += 1;
21097                                }
21098                            }
21099                            b"pageMargins" => {
21100                                f_page_margins =
21101                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
21102                                #[cfg(feature = "extra-children")]
21103                                {
21104                                    child_idx += 1;
21105                                }
21106                            }
21107                            b"pageSetup" => {
21108                                f_page_setup =
21109                                    Some(Box::new(PageSetup::from_xml(reader, &e, false)?));
21110                                #[cfg(feature = "extra-children")]
21111                                {
21112                                    child_idx += 1;
21113                                }
21114                            }
21115                            b"headerFooter" => {
21116                                f_header_footer =
21117                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
21118                                #[cfg(feature = "extra-children")]
21119                                {
21120                                    child_idx += 1;
21121                                }
21122                            }
21123                            b"drawing" => {
21124                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, false)?));
21125                                #[cfg(feature = "extra-children")]
21126                                {
21127                                    child_idx += 1;
21128                                }
21129                            }
21130                            b"legacyDrawing" => {
21131                                f_legacy_drawing =
21132                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
21133                                #[cfg(feature = "extra-children")]
21134                                {
21135                                    child_idx += 1;
21136                                }
21137                            }
21138                            b"legacyDrawingHF" => {
21139                                f_legacy_drawing_h_f =
21140                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
21141                                #[cfg(feature = "extra-children")]
21142                                {
21143                                    child_idx += 1;
21144                                }
21145                            }
21146                            b"drawingHF" => {
21147                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
21148                                    reader, &e, false,
21149                                )?));
21150                                #[cfg(feature = "extra-children")]
21151                                {
21152                                    child_idx += 1;
21153                                }
21154                            }
21155                            b"oleObjects" => {
21156                                f_ole_objects =
21157                                    Some(Box::new(OleObjects::from_xml(reader, &e, false)?));
21158                                #[cfg(feature = "extra-children")]
21159                                {
21160                                    child_idx += 1;
21161                                }
21162                            }
21163                            b"controls" => {
21164                                f_controls = Some(Box::new(Controls::from_xml(reader, &e, false)?));
21165                                #[cfg(feature = "extra-children")]
21166                                {
21167                                    child_idx += 1;
21168                                }
21169                            }
21170                            b"extLst" => {
21171                                f_extension_list =
21172                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
21173                                #[cfg(feature = "extra-children")]
21174                                {
21175                                    child_idx += 1;
21176                                }
21177                            }
21178                            #[cfg(feature = "extra-children")]
21179                            _ => {
21180                                // Capture unknown element for roundtrip
21181                                let elem = RawXmlElement::from_reader(reader, &e)?;
21182                                extra_children.push(PositionedNode::new(
21183                                    child_idx,
21184                                    RawXmlNode::Element(elem),
21185                                ));
21186                                child_idx += 1;
21187                            }
21188                            #[cfg(not(feature = "extra-children"))]
21189                            _ => {
21190                                // Skip unknown element
21191                                skip_element(reader)?;
21192                            }
21193                        }
21194                    }
21195                    Event::Empty(e) => {
21196                        match e.local_name().as_ref() {
21197                            b"sheetPr" => {
21198                                f_sheet_properties =
21199                                    Some(Box::new(SheetProperties::from_xml(reader, &e, true)?));
21200                                #[cfg(feature = "extra-children")]
21201                                {
21202                                    child_idx += 1;
21203                                }
21204                            }
21205                            b"sheetViews" => {
21206                                f_sheet_views =
21207                                    Some(Box::new(SheetViews::from_xml(reader, &e, true)?));
21208                                #[cfg(feature = "extra-children")]
21209                                {
21210                                    child_idx += 1;
21211                                }
21212                            }
21213                            b"sheetFormatPr" => {
21214                                f_sheet_format =
21215                                    Some(Box::new(SheetFormat::from_xml(reader, &e, true)?));
21216                                #[cfg(feature = "extra-children")]
21217                                {
21218                                    child_idx += 1;
21219                                }
21220                            }
21221                            b"sheetProtection" => {
21222                                f_sheet_protection =
21223                                    Some(Box::new(SheetProtection::from_xml(reader, &e, true)?));
21224                                #[cfg(feature = "extra-children")]
21225                                {
21226                                    child_idx += 1;
21227                                }
21228                            }
21229                            b"customSheetViews" => {
21230                                f_custom_sheet_views =
21231                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, true)?));
21232                                #[cfg(feature = "extra-children")]
21233                                {
21234                                    child_idx += 1;
21235                                }
21236                            }
21237                            b"printOptions" => {
21238                                f_print_options =
21239                                    Some(Box::new(PrintOptions::from_xml(reader, &e, true)?));
21240                                #[cfg(feature = "extra-children")]
21241                                {
21242                                    child_idx += 1;
21243                                }
21244                            }
21245                            b"pageMargins" => {
21246                                f_page_margins =
21247                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
21248                                #[cfg(feature = "extra-children")]
21249                                {
21250                                    child_idx += 1;
21251                                }
21252                            }
21253                            b"pageSetup" => {
21254                                f_page_setup =
21255                                    Some(Box::new(PageSetup::from_xml(reader, &e, true)?));
21256                                #[cfg(feature = "extra-children")]
21257                                {
21258                                    child_idx += 1;
21259                                }
21260                            }
21261                            b"headerFooter" => {
21262                                f_header_footer =
21263                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
21264                                #[cfg(feature = "extra-children")]
21265                                {
21266                                    child_idx += 1;
21267                                }
21268                            }
21269                            b"drawing" => {
21270                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, true)?));
21271                                #[cfg(feature = "extra-children")]
21272                                {
21273                                    child_idx += 1;
21274                                }
21275                            }
21276                            b"legacyDrawing" => {
21277                                f_legacy_drawing =
21278                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
21279                                #[cfg(feature = "extra-children")]
21280                                {
21281                                    child_idx += 1;
21282                                }
21283                            }
21284                            b"legacyDrawingHF" => {
21285                                f_legacy_drawing_h_f =
21286                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
21287                                #[cfg(feature = "extra-children")]
21288                                {
21289                                    child_idx += 1;
21290                                }
21291                            }
21292                            b"drawingHF" => {
21293                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
21294                                    reader, &e, true,
21295                                )?));
21296                                #[cfg(feature = "extra-children")]
21297                                {
21298                                    child_idx += 1;
21299                                }
21300                            }
21301                            b"oleObjects" => {
21302                                f_ole_objects =
21303                                    Some(Box::new(OleObjects::from_xml(reader, &e, true)?));
21304                                #[cfg(feature = "extra-children")]
21305                                {
21306                                    child_idx += 1;
21307                                }
21308                            }
21309                            b"controls" => {
21310                                f_controls = Some(Box::new(Controls::from_xml(reader, &e, true)?));
21311                                #[cfg(feature = "extra-children")]
21312                                {
21313                                    child_idx += 1;
21314                                }
21315                            }
21316                            b"extLst" => {
21317                                f_extension_list =
21318                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
21319                                #[cfg(feature = "extra-children")]
21320                                {
21321                                    child_idx += 1;
21322                                }
21323                            }
21324                            #[cfg(feature = "extra-children")]
21325                            _ => {
21326                                // Capture unknown empty element for roundtrip
21327                                let elem = RawXmlElement::from_empty(&e);
21328                                extra_children.push(PositionedNode::new(
21329                                    child_idx,
21330                                    RawXmlNode::Element(elem),
21331                                ));
21332                                child_idx += 1;
21333                            }
21334                            #[cfg(not(feature = "extra-children"))]
21335                            _ => {}
21336                        }
21337                    }
21338                    Event::End(_) => break,
21339                    Event::Eof => break,
21340                    _ => {}
21341                }
21342                buf.clear();
21343            }
21344        }
21345
21346        Ok(Self {
21347            sheet_properties: f_sheet_properties,
21348            sheet_views: f_sheet_views,
21349            sheet_format: f_sheet_format,
21350            sheet_protection: f_sheet_protection,
21351            custom_sheet_views: f_custom_sheet_views,
21352            print_options: f_print_options,
21353            page_margins: f_page_margins,
21354            page_setup: f_page_setup,
21355            header_footer: f_header_footer,
21356            drawing: f_drawing,
21357            legacy_drawing: f_legacy_drawing,
21358            legacy_drawing_h_f: f_legacy_drawing_h_f,
21359            drawing_h_f: f_drawing_h_f,
21360            ole_objects: f_ole_objects,
21361            controls: f_controls,
21362            extension_list: f_extension_list,
21363            #[cfg(feature = "extra-children")]
21364            extra_children,
21365        })
21366    }
21367}
21368
21369impl FromXml for Worksheet {
21370    fn from_xml<R: BufRead>(
21371        reader: &mut Reader<R>,
21372        start_tag: &BytesStart,
21373        is_empty: bool,
21374    ) -> Result<Self, ParseError> {
21375        #[cfg(feature = "sml-styling")]
21376        let mut f_sheet_properties = None;
21377        let mut f_dimension = None;
21378        let mut f_sheet_views = None;
21379        #[cfg(feature = "sml-styling")]
21380        let mut f_sheet_format = None;
21381        #[cfg(feature = "sml-styling")]
21382        let mut f_cols = Vec::new();
21383        let mut f_sheet_data: Option<Box<SheetData>> = None;
21384        #[cfg(feature = "sml-formulas")]
21385        let mut f_sheet_calc_pr = None;
21386        #[cfg(feature = "sml-protection")]
21387        let mut f_sheet_protection = None;
21388        #[cfg(feature = "sml-protection")]
21389        let mut f_protected_ranges = None;
21390        #[cfg(feature = "sml-formulas-advanced")]
21391        let mut f_scenarios = None;
21392        #[cfg(feature = "sml-filtering")]
21393        let mut f_auto_filter = None;
21394        #[cfg(feature = "sml-filtering")]
21395        let mut f_sort_state = None;
21396        #[cfg(feature = "sml-formulas-advanced")]
21397        let mut f_data_consolidate = None;
21398        #[cfg(feature = "sml-structure")]
21399        let mut f_custom_sheet_views = None;
21400        let mut f_merged_cells = None;
21401        #[cfg(feature = "sml-i18n")]
21402        let mut f_phonetic_pr = None;
21403        #[cfg(feature = "sml-styling")]
21404        let mut f_conditional_formatting = Vec::new();
21405        #[cfg(feature = "sml-validation")]
21406        let mut f_data_validations = None;
21407        #[cfg(feature = "sml-hyperlinks")]
21408        let mut f_hyperlinks = None;
21409        #[cfg(feature = "sml-layout")]
21410        let mut f_print_options = None;
21411        #[cfg(feature = "sml-layout")]
21412        let mut f_page_margins = None;
21413        #[cfg(feature = "sml-layout")]
21414        let mut f_page_setup = None;
21415        #[cfg(feature = "sml-layout")]
21416        let mut f_header_footer = None;
21417        #[cfg(feature = "sml-layout")]
21418        let mut f_row_breaks = None;
21419        #[cfg(feature = "sml-layout")]
21420        let mut f_col_breaks = None;
21421        #[cfg(feature = "sml-metadata")]
21422        let mut f_custom_properties = None;
21423        #[cfg(feature = "sml-formulas-advanced")]
21424        let mut f_cell_watches = None;
21425        #[cfg(feature = "sml-validation")]
21426        let mut f_ignored_errors = None;
21427        #[cfg(feature = "sml-metadata")]
21428        let mut f_smart_tags = None;
21429        #[cfg(feature = "sml-drawings")]
21430        let mut f_drawing = None;
21431        #[cfg(feature = "sml-comments")]
21432        let mut f_legacy_drawing = None;
21433        #[cfg(feature = "sml-layout")]
21434        let mut f_legacy_drawing_h_f = None;
21435        #[cfg(feature = "sml-drawings")]
21436        let mut f_drawing_h_f = None;
21437        #[cfg(feature = "sml-drawings")]
21438        let mut f_picture = None;
21439        #[cfg(feature = "sml-external")]
21440        let mut f_ole_objects = None;
21441        #[cfg(feature = "sml-external")]
21442        let mut f_controls = None;
21443        #[cfg(feature = "sml-external")]
21444        let mut f_web_publish_items = None;
21445        #[cfg(feature = "sml-tables")]
21446        let mut f_table_parts = None;
21447        #[cfg(feature = "sml-extensions")]
21448        let mut f_extension_list = None;
21449        #[cfg(feature = "extra-children")]
21450        let mut extra_children = Vec::new();
21451        #[cfg(feature = "extra-children")]
21452        let mut child_idx: usize = 0;
21453
21454        // Parse child elements
21455        if !is_empty {
21456            let mut buf = Vec::new();
21457            loop {
21458                match reader.read_event_into(&mut buf)? {
21459                    Event::Start(e) => {
21460                        match e.local_name().as_ref() {
21461                            #[cfg(feature = "sml-styling")]
21462                            b"sheetPr" => {
21463                                f_sheet_properties =
21464                                    Some(Box::new(SheetProperties::from_xml(reader, &e, false)?));
21465                                #[cfg(feature = "extra-children")]
21466                                {
21467                                    child_idx += 1;
21468                                }
21469                            }
21470                            b"dimension" => {
21471                                f_dimension =
21472                                    Some(Box::new(SheetDimension::from_xml(reader, &e, false)?));
21473                                #[cfg(feature = "extra-children")]
21474                                {
21475                                    child_idx += 1;
21476                                }
21477                            }
21478                            b"sheetViews" => {
21479                                f_sheet_views =
21480                                    Some(Box::new(SheetViews::from_xml(reader, &e, false)?));
21481                                #[cfg(feature = "extra-children")]
21482                                {
21483                                    child_idx += 1;
21484                                }
21485                            }
21486                            #[cfg(feature = "sml-styling")]
21487                            b"sheetFormatPr" => {
21488                                f_sheet_format =
21489                                    Some(Box::new(SheetFormat::from_xml(reader, &e, false)?));
21490                                #[cfg(feature = "extra-children")]
21491                                {
21492                                    child_idx += 1;
21493                                }
21494                            }
21495                            #[cfg(feature = "sml-styling")]
21496                            b"cols" => {
21497                                f_cols.push(Columns::from_xml(reader, &e, false)?);
21498                                #[cfg(feature = "extra-children")]
21499                                {
21500                                    child_idx += 1;
21501                                }
21502                            }
21503                            b"sheetData" => {
21504                                f_sheet_data =
21505                                    Some(Box::new(SheetData::from_xml(reader, &e, false)?));
21506                                #[cfg(feature = "extra-children")]
21507                                {
21508                                    child_idx += 1;
21509                                }
21510                            }
21511                            #[cfg(feature = "sml-formulas")]
21512                            b"sheetCalcPr" => {
21513                                f_sheet_calc_pr = Some(Box::new(SheetCalcProperties::from_xml(
21514                                    reader, &e, false,
21515                                )?));
21516                                #[cfg(feature = "extra-children")]
21517                                {
21518                                    child_idx += 1;
21519                                }
21520                            }
21521                            #[cfg(feature = "sml-protection")]
21522                            b"sheetProtection" => {
21523                                f_sheet_protection =
21524                                    Some(Box::new(SheetProtection::from_xml(reader, &e, false)?));
21525                                #[cfg(feature = "extra-children")]
21526                                {
21527                                    child_idx += 1;
21528                                }
21529                            }
21530                            #[cfg(feature = "sml-protection")]
21531                            b"protectedRanges" => {
21532                                f_protected_ranges =
21533                                    Some(Box::new(ProtectedRanges::from_xml(reader, &e, false)?));
21534                                #[cfg(feature = "extra-children")]
21535                                {
21536                                    child_idx += 1;
21537                                }
21538                            }
21539                            #[cfg(feature = "sml-formulas-advanced")]
21540                            b"scenarios" => {
21541                                f_scenarios =
21542                                    Some(Box::new(Scenarios::from_xml(reader, &e, false)?));
21543                                #[cfg(feature = "extra-children")]
21544                                {
21545                                    child_idx += 1;
21546                                }
21547                            }
21548                            #[cfg(feature = "sml-filtering")]
21549                            b"autoFilter" => {
21550                                f_auto_filter =
21551                                    Some(Box::new(AutoFilter::from_xml(reader, &e, false)?));
21552                                #[cfg(feature = "extra-children")]
21553                                {
21554                                    child_idx += 1;
21555                                }
21556                            }
21557                            #[cfg(feature = "sml-filtering")]
21558                            b"sortState" => {
21559                                f_sort_state =
21560                                    Some(Box::new(SortState::from_xml(reader, &e, false)?));
21561                                #[cfg(feature = "extra-children")]
21562                                {
21563                                    child_idx += 1;
21564                                }
21565                            }
21566                            #[cfg(feature = "sml-formulas-advanced")]
21567                            b"dataConsolidate" => {
21568                                f_data_consolidate =
21569                                    Some(Box::new(CTDataConsolidate::from_xml(reader, &e, false)?));
21570                                #[cfg(feature = "extra-children")]
21571                                {
21572                                    child_idx += 1;
21573                                }
21574                            }
21575                            #[cfg(feature = "sml-structure")]
21576                            b"customSheetViews" => {
21577                                f_custom_sheet_views =
21578                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, false)?));
21579                                #[cfg(feature = "extra-children")]
21580                                {
21581                                    child_idx += 1;
21582                                }
21583                            }
21584                            b"mergeCells" => {
21585                                f_merged_cells =
21586                                    Some(Box::new(MergedCells::from_xml(reader, &e, false)?));
21587                                #[cfg(feature = "extra-children")]
21588                                {
21589                                    child_idx += 1;
21590                                }
21591                            }
21592                            #[cfg(feature = "sml-i18n")]
21593                            b"phoneticPr" => {
21594                                f_phonetic_pr = Some(Box::new(PhoneticProperties::from_xml(
21595                                    reader, &e, false,
21596                                )?));
21597                                #[cfg(feature = "extra-children")]
21598                                {
21599                                    child_idx += 1;
21600                                }
21601                            }
21602                            #[cfg(feature = "sml-styling")]
21603                            b"conditionalFormatting" => {
21604                                f_conditional_formatting
21605                                    .push(ConditionalFormatting::from_xml(reader, &e, false)?);
21606                                #[cfg(feature = "extra-children")]
21607                                {
21608                                    child_idx += 1;
21609                                }
21610                            }
21611                            #[cfg(feature = "sml-validation")]
21612                            b"dataValidations" => {
21613                                f_data_validations =
21614                                    Some(Box::new(DataValidations::from_xml(reader, &e, false)?));
21615                                #[cfg(feature = "extra-children")]
21616                                {
21617                                    child_idx += 1;
21618                                }
21619                            }
21620                            #[cfg(feature = "sml-hyperlinks")]
21621                            b"hyperlinks" => {
21622                                f_hyperlinks =
21623                                    Some(Box::new(Hyperlinks::from_xml(reader, &e, false)?));
21624                                #[cfg(feature = "extra-children")]
21625                                {
21626                                    child_idx += 1;
21627                                }
21628                            }
21629                            #[cfg(feature = "sml-layout")]
21630                            b"printOptions" => {
21631                                f_print_options =
21632                                    Some(Box::new(PrintOptions::from_xml(reader, &e, false)?));
21633                                #[cfg(feature = "extra-children")]
21634                                {
21635                                    child_idx += 1;
21636                                }
21637                            }
21638                            #[cfg(feature = "sml-layout")]
21639                            b"pageMargins" => {
21640                                f_page_margins =
21641                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
21642                                #[cfg(feature = "extra-children")]
21643                                {
21644                                    child_idx += 1;
21645                                }
21646                            }
21647                            #[cfg(feature = "sml-layout")]
21648                            b"pageSetup" => {
21649                                f_page_setup =
21650                                    Some(Box::new(PageSetup::from_xml(reader, &e, false)?));
21651                                #[cfg(feature = "extra-children")]
21652                                {
21653                                    child_idx += 1;
21654                                }
21655                            }
21656                            #[cfg(feature = "sml-layout")]
21657                            b"headerFooter" => {
21658                                f_header_footer =
21659                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
21660                                #[cfg(feature = "extra-children")]
21661                                {
21662                                    child_idx += 1;
21663                                }
21664                            }
21665                            #[cfg(feature = "sml-layout")]
21666                            b"rowBreaks" => {
21667                                f_row_breaks =
21668                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
21669                                #[cfg(feature = "extra-children")]
21670                                {
21671                                    child_idx += 1;
21672                                }
21673                            }
21674                            #[cfg(feature = "sml-layout")]
21675                            b"colBreaks" => {
21676                                f_col_breaks =
21677                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
21678                                #[cfg(feature = "extra-children")]
21679                                {
21680                                    child_idx += 1;
21681                                }
21682                            }
21683                            #[cfg(feature = "sml-metadata")]
21684                            b"customProperties" => {
21685                                f_custom_properties = Some(Box::new(CTCustomProperties::from_xml(
21686                                    reader, &e, false,
21687                                )?));
21688                                #[cfg(feature = "extra-children")]
21689                                {
21690                                    child_idx += 1;
21691                                }
21692                            }
21693                            #[cfg(feature = "sml-formulas-advanced")]
21694                            b"cellWatches" => {
21695                                f_cell_watches =
21696                                    Some(Box::new(CellWatches::from_xml(reader, &e, false)?));
21697                                #[cfg(feature = "extra-children")]
21698                                {
21699                                    child_idx += 1;
21700                                }
21701                            }
21702                            #[cfg(feature = "sml-validation")]
21703                            b"ignoredErrors" => {
21704                                f_ignored_errors =
21705                                    Some(Box::new(IgnoredErrors::from_xml(reader, &e, false)?));
21706                                #[cfg(feature = "extra-children")]
21707                                {
21708                                    child_idx += 1;
21709                                }
21710                            }
21711                            #[cfg(feature = "sml-metadata")]
21712                            b"smartTags" => {
21713                                f_smart_tags =
21714                                    Some(Box::new(SmartTags::from_xml(reader, &e, false)?));
21715                                #[cfg(feature = "extra-children")]
21716                                {
21717                                    child_idx += 1;
21718                                }
21719                            }
21720                            #[cfg(feature = "sml-drawings")]
21721                            b"drawing" => {
21722                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, false)?));
21723                                #[cfg(feature = "extra-children")]
21724                                {
21725                                    child_idx += 1;
21726                                }
21727                            }
21728                            #[cfg(feature = "sml-comments")]
21729                            b"legacyDrawing" => {
21730                                f_legacy_drawing =
21731                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
21732                                #[cfg(feature = "extra-children")]
21733                                {
21734                                    child_idx += 1;
21735                                }
21736                            }
21737                            #[cfg(feature = "sml-layout")]
21738                            b"legacyDrawingHF" => {
21739                                f_legacy_drawing_h_f =
21740                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
21741                                #[cfg(feature = "extra-children")]
21742                                {
21743                                    child_idx += 1;
21744                                }
21745                            }
21746                            #[cfg(feature = "sml-drawings")]
21747                            b"drawingHF" => {
21748                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
21749                                    reader, &e, false,
21750                                )?));
21751                                #[cfg(feature = "extra-children")]
21752                                {
21753                                    child_idx += 1;
21754                                }
21755                            }
21756                            #[cfg(feature = "sml-drawings")]
21757                            b"picture" => {
21758                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
21759                                    reader, &e, false,
21760                                )?));
21761                                #[cfg(feature = "extra-children")]
21762                                {
21763                                    child_idx += 1;
21764                                }
21765                            }
21766                            #[cfg(feature = "sml-external")]
21767                            b"oleObjects" => {
21768                                f_ole_objects =
21769                                    Some(Box::new(OleObjects::from_xml(reader, &e, false)?));
21770                                #[cfg(feature = "extra-children")]
21771                                {
21772                                    child_idx += 1;
21773                                }
21774                            }
21775                            #[cfg(feature = "sml-external")]
21776                            b"controls" => {
21777                                f_controls = Some(Box::new(Controls::from_xml(reader, &e, false)?));
21778                                #[cfg(feature = "extra-children")]
21779                                {
21780                                    child_idx += 1;
21781                                }
21782                            }
21783                            #[cfg(feature = "sml-external")]
21784                            b"webPublishItems" => {
21785                                f_web_publish_items =
21786                                    Some(Box::new(WebPublishItems::from_xml(reader, &e, false)?));
21787                                #[cfg(feature = "extra-children")]
21788                                {
21789                                    child_idx += 1;
21790                                }
21791                            }
21792                            #[cfg(feature = "sml-tables")]
21793                            b"tableParts" => {
21794                                f_table_parts =
21795                                    Some(Box::new(TableParts::from_xml(reader, &e, false)?));
21796                                #[cfg(feature = "extra-children")]
21797                                {
21798                                    child_idx += 1;
21799                                }
21800                            }
21801                            #[cfg(feature = "sml-extensions")]
21802                            b"extLst" => {
21803                                f_extension_list =
21804                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
21805                                #[cfg(feature = "extra-children")]
21806                                {
21807                                    child_idx += 1;
21808                                }
21809                            }
21810                            #[cfg(feature = "extra-children")]
21811                            _ => {
21812                                // Capture unknown element for roundtrip
21813                                let elem = RawXmlElement::from_reader(reader, &e)?;
21814                                extra_children.push(PositionedNode::new(
21815                                    child_idx,
21816                                    RawXmlNode::Element(elem),
21817                                ));
21818                                child_idx += 1;
21819                            }
21820                            #[cfg(not(feature = "extra-children"))]
21821                            _ => {
21822                                // Skip unknown element
21823                                skip_element(reader)?;
21824                            }
21825                        }
21826                    }
21827                    Event::Empty(e) => {
21828                        match e.local_name().as_ref() {
21829                            #[cfg(feature = "sml-styling")]
21830                            b"sheetPr" => {
21831                                f_sheet_properties =
21832                                    Some(Box::new(SheetProperties::from_xml(reader, &e, true)?));
21833                                #[cfg(feature = "extra-children")]
21834                                {
21835                                    child_idx += 1;
21836                                }
21837                            }
21838                            b"dimension" => {
21839                                f_dimension =
21840                                    Some(Box::new(SheetDimension::from_xml(reader, &e, true)?));
21841                                #[cfg(feature = "extra-children")]
21842                                {
21843                                    child_idx += 1;
21844                                }
21845                            }
21846                            b"sheetViews" => {
21847                                f_sheet_views =
21848                                    Some(Box::new(SheetViews::from_xml(reader, &e, true)?));
21849                                #[cfg(feature = "extra-children")]
21850                                {
21851                                    child_idx += 1;
21852                                }
21853                            }
21854                            #[cfg(feature = "sml-styling")]
21855                            b"sheetFormatPr" => {
21856                                f_sheet_format =
21857                                    Some(Box::new(SheetFormat::from_xml(reader, &e, true)?));
21858                                #[cfg(feature = "extra-children")]
21859                                {
21860                                    child_idx += 1;
21861                                }
21862                            }
21863                            #[cfg(feature = "sml-styling")]
21864                            b"cols" => {
21865                                f_cols.push(Columns::from_xml(reader, &e, true)?);
21866                                #[cfg(feature = "extra-children")]
21867                                {
21868                                    child_idx += 1;
21869                                }
21870                            }
21871                            b"sheetData" => {
21872                                f_sheet_data =
21873                                    Some(Box::new(SheetData::from_xml(reader, &e, true)?));
21874                                #[cfg(feature = "extra-children")]
21875                                {
21876                                    child_idx += 1;
21877                                }
21878                            }
21879                            #[cfg(feature = "sml-formulas")]
21880                            b"sheetCalcPr" => {
21881                                f_sheet_calc_pr = Some(Box::new(SheetCalcProperties::from_xml(
21882                                    reader, &e, true,
21883                                )?));
21884                                #[cfg(feature = "extra-children")]
21885                                {
21886                                    child_idx += 1;
21887                                }
21888                            }
21889                            #[cfg(feature = "sml-protection")]
21890                            b"sheetProtection" => {
21891                                f_sheet_protection =
21892                                    Some(Box::new(SheetProtection::from_xml(reader, &e, true)?));
21893                                #[cfg(feature = "extra-children")]
21894                                {
21895                                    child_idx += 1;
21896                                }
21897                            }
21898                            #[cfg(feature = "sml-protection")]
21899                            b"protectedRanges" => {
21900                                f_protected_ranges =
21901                                    Some(Box::new(ProtectedRanges::from_xml(reader, &e, true)?));
21902                                #[cfg(feature = "extra-children")]
21903                                {
21904                                    child_idx += 1;
21905                                }
21906                            }
21907                            #[cfg(feature = "sml-formulas-advanced")]
21908                            b"scenarios" => {
21909                                f_scenarios =
21910                                    Some(Box::new(Scenarios::from_xml(reader, &e, true)?));
21911                                #[cfg(feature = "extra-children")]
21912                                {
21913                                    child_idx += 1;
21914                                }
21915                            }
21916                            #[cfg(feature = "sml-filtering")]
21917                            b"autoFilter" => {
21918                                f_auto_filter =
21919                                    Some(Box::new(AutoFilter::from_xml(reader, &e, true)?));
21920                                #[cfg(feature = "extra-children")]
21921                                {
21922                                    child_idx += 1;
21923                                }
21924                            }
21925                            #[cfg(feature = "sml-filtering")]
21926                            b"sortState" => {
21927                                f_sort_state =
21928                                    Some(Box::new(SortState::from_xml(reader, &e, true)?));
21929                                #[cfg(feature = "extra-children")]
21930                                {
21931                                    child_idx += 1;
21932                                }
21933                            }
21934                            #[cfg(feature = "sml-formulas-advanced")]
21935                            b"dataConsolidate" => {
21936                                f_data_consolidate =
21937                                    Some(Box::new(CTDataConsolidate::from_xml(reader, &e, true)?));
21938                                #[cfg(feature = "extra-children")]
21939                                {
21940                                    child_idx += 1;
21941                                }
21942                            }
21943                            #[cfg(feature = "sml-structure")]
21944                            b"customSheetViews" => {
21945                                f_custom_sheet_views =
21946                                    Some(Box::new(CustomSheetViews::from_xml(reader, &e, true)?));
21947                                #[cfg(feature = "extra-children")]
21948                                {
21949                                    child_idx += 1;
21950                                }
21951                            }
21952                            b"mergeCells" => {
21953                                f_merged_cells =
21954                                    Some(Box::new(MergedCells::from_xml(reader, &e, true)?));
21955                                #[cfg(feature = "extra-children")]
21956                                {
21957                                    child_idx += 1;
21958                                }
21959                            }
21960                            #[cfg(feature = "sml-i18n")]
21961                            b"phoneticPr" => {
21962                                f_phonetic_pr =
21963                                    Some(Box::new(PhoneticProperties::from_xml(reader, &e, true)?));
21964                                #[cfg(feature = "extra-children")]
21965                                {
21966                                    child_idx += 1;
21967                                }
21968                            }
21969                            #[cfg(feature = "sml-styling")]
21970                            b"conditionalFormatting" => {
21971                                f_conditional_formatting
21972                                    .push(ConditionalFormatting::from_xml(reader, &e, true)?);
21973                                #[cfg(feature = "extra-children")]
21974                                {
21975                                    child_idx += 1;
21976                                }
21977                            }
21978                            #[cfg(feature = "sml-validation")]
21979                            b"dataValidations" => {
21980                                f_data_validations =
21981                                    Some(Box::new(DataValidations::from_xml(reader, &e, true)?));
21982                                #[cfg(feature = "extra-children")]
21983                                {
21984                                    child_idx += 1;
21985                                }
21986                            }
21987                            #[cfg(feature = "sml-hyperlinks")]
21988                            b"hyperlinks" => {
21989                                f_hyperlinks =
21990                                    Some(Box::new(Hyperlinks::from_xml(reader, &e, true)?));
21991                                #[cfg(feature = "extra-children")]
21992                                {
21993                                    child_idx += 1;
21994                                }
21995                            }
21996                            #[cfg(feature = "sml-layout")]
21997                            b"printOptions" => {
21998                                f_print_options =
21999                                    Some(Box::new(PrintOptions::from_xml(reader, &e, true)?));
22000                                #[cfg(feature = "extra-children")]
22001                                {
22002                                    child_idx += 1;
22003                                }
22004                            }
22005                            #[cfg(feature = "sml-layout")]
22006                            b"pageMargins" => {
22007                                f_page_margins =
22008                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
22009                                #[cfg(feature = "extra-children")]
22010                                {
22011                                    child_idx += 1;
22012                                }
22013                            }
22014                            #[cfg(feature = "sml-layout")]
22015                            b"pageSetup" => {
22016                                f_page_setup =
22017                                    Some(Box::new(PageSetup::from_xml(reader, &e, true)?));
22018                                #[cfg(feature = "extra-children")]
22019                                {
22020                                    child_idx += 1;
22021                                }
22022                            }
22023                            #[cfg(feature = "sml-layout")]
22024                            b"headerFooter" => {
22025                                f_header_footer =
22026                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
22027                                #[cfg(feature = "extra-children")]
22028                                {
22029                                    child_idx += 1;
22030                                }
22031                            }
22032                            #[cfg(feature = "sml-layout")]
22033                            b"rowBreaks" => {
22034                                f_row_breaks =
22035                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
22036                                #[cfg(feature = "extra-children")]
22037                                {
22038                                    child_idx += 1;
22039                                }
22040                            }
22041                            #[cfg(feature = "sml-layout")]
22042                            b"colBreaks" => {
22043                                f_col_breaks =
22044                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
22045                                #[cfg(feature = "extra-children")]
22046                                {
22047                                    child_idx += 1;
22048                                }
22049                            }
22050                            #[cfg(feature = "sml-metadata")]
22051                            b"customProperties" => {
22052                                f_custom_properties =
22053                                    Some(Box::new(CTCustomProperties::from_xml(reader, &e, true)?));
22054                                #[cfg(feature = "extra-children")]
22055                                {
22056                                    child_idx += 1;
22057                                }
22058                            }
22059                            #[cfg(feature = "sml-formulas-advanced")]
22060                            b"cellWatches" => {
22061                                f_cell_watches =
22062                                    Some(Box::new(CellWatches::from_xml(reader, &e, true)?));
22063                                #[cfg(feature = "extra-children")]
22064                                {
22065                                    child_idx += 1;
22066                                }
22067                            }
22068                            #[cfg(feature = "sml-validation")]
22069                            b"ignoredErrors" => {
22070                                f_ignored_errors =
22071                                    Some(Box::new(IgnoredErrors::from_xml(reader, &e, true)?));
22072                                #[cfg(feature = "extra-children")]
22073                                {
22074                                    child_idx += 1;
22075                                }
22076                            }
22077                            #[cfg(feature = "sml-metadata")]
22078                            b"smartTags" => {
22079                                f_smart_tags =
22080                                    Some(Box::new(SmartTags::from_xml(reader, &e, true)?));
22081                                #[cfg(feature = "extra-children")]
22082                                {
22083                                    child_idx += 1;
22084                                }
22085                            }
22086                            #[cfg(feature = "sml-drawings")]
22087                            b"drawing" => {
22088                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, true)?));
22089                                #[cfg(feature = "extra-children")]
22090                                {
22091                                    child_idx += 1;
22092                                }
22093                            }
22094                            #[cfg(feature = "sml-comments")]
22095                            b"legacyDrawing" => {
22096                                f_legacy_drawing =
22097                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
22098                                #[cfg(feature = "extra-children")]
22099                                {
22100                                    child_idx += 1;
22101                                }
22102                            }
22103                            #[cfg(feature = "sml-layout")]
22104                            b"legacyDrawingHF" => {
22105                                f_legacy_drawing_h_f =
22106                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
22107                                #[cfg(feature = "extra-children")]
22108                                {
22109                                    child_idx += 1;
22110                                }
22111                            }
22112                            #[cfg(feature = "sml-drawings")]
22113                            b"drawingHF" => {
22114                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
22115                                    reader, &e, true,
22116                                )?));
22117                                #[cfg(feature = "extra-children")]
22118                                {
22119                                    child_idx += 1;
22120                                }
22121                            }
22122                            #[cfg(feature = "sml-drawings")]
22123                            b"picture" => {
22124                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
22125                                    reader, &e, true,
22126                                )?));
22127                                #[cfg(feature = "extra-children")]
22128                                {
22129                                    child_idx += 1;
22130                                }
22131                            }
22132                            #[cfg(feature = "sml-external")]
22133                            b"oleObjects" => {
22134                                f_ole_objects =
22135                                    Some(Box::new(OleObjects::from_xml(reader, &e, true)?));
22136                                #[cfg(feature = "extra-children")]
22137                                {
22138                                    child_idx += 1;
22139                                }
22140                            }
22141                            #[cfg(feature = "sml-external")]
22142                            b"controls" => {
22143                                f_controls = Some(Box::new(Controls::from_xml(reader, &e, true)?));
22144                                #[cfg(feature = "extra-children")]
22145                                {
22146                                    child_idx += 1;
22147                                }
22148                            }
22149                            #[cfg(feature = "sml-external")]
22150                            b"webPublishItems" => {
22151                                f_web_publish_items =
22152                                    Some(Box::new(WebPublishItems::from_xml(reader, &e, true)?));
22153                                #[cfg(feature = "extra-children")]
22154                                {
22155                                    child_idx += 1;
22156                                }
22157                            }
22158                            #[cfg(feature = "sml-tables")]
22159                            b"tableParts" => {
22160                                f_table_parts =
22161                                    Some(Box::new(TableParts::from_xml(reader, &e, true)?));
22162                                #[cfg(feature = "extra-children")]
22163                                {
22164                                    child_idx += 1;
22165                                }
22166                            }
22167                            #[cfg(feature = "sml-extensions")]
22168                            b"extLst" => {
22169                                f_extension_list =
22170                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
22171                                #[cfg(feature = "extra-children")]
22172                                {
22173                                    child_idx += 1;
22174                                }
22175                            }
22176                            #[cfg(feature = "extra-children")]
22177                            _ => {
22178                                // Capture unknown empty element for roundtrip
22179                                let elem = RawXmlElement::from_empty(&e);
22180                                extra_children.push(PositionedNode::new(
22181                                    child_idx,
22182                                    RawXmlNode::Element(elem),
22183                                ));
22184                                child_idx += 1;
22185                            }
22186                            #[cfg(not(feature = "extra-children"))]
22187                            _ => {}
22188                        }
22189                    }
22190                    Event::End(_) => break,
22191                    Event::Eof => break,
22192                    _ => {}
22193                }
22194                buf.clear();
22195            }
22196        }
22197
22198        Ok(Self {
22199            #[cfg(feature = "sml-styling")]
22200            sheet_properties: f_sheet_properties,
22201            dimension: f_dimension,
22202            sheet_views: f_sheet_views,
22203            #[cfg(feature = "sml-styling")]
22204            sheet_format: f_sheet_format,
22205            #[cfg(feature = "sml-styling")]
22206            cols: f_cols,
22207            sheet_data: f_sheet_data
22208                .ok_or_else(|| ParseError::MissingAttribute("sheetData".to_string()))?,
22209            #[cfg(feature = "sml-formulas")]
22210            sheet_calc_pr: f_sheet_calc_pr,
22211            #[cfg(feature = "sml-protection")]
22212            sheet_protection: f_sheet_protection,
22213            #[cfg(feature = "sml-protection")]
22214            protected_ranges: f_protected_ranges,
22215            #[cfg(feature = "sml-formulas-advanced")]
22216            scenarios: f_scenarios,
22217            #[cfg(feature = "sml-filtering")]
22218            auto_filter: f_auto_filter,
22219            #[cfg(feature = "sml-filtering")]
22220            sort_state: f_sort_state,
22221            #[cfg(feature = "sml-formulas-advanced")]
22222            data_consolidate: f_data_consolidate,
22223            #[cfg(feature = "sml-structure")]
22224            custom_sheet_views: f_custom_sheet_views,
22225            merged_cells: f_merged_cells,
22226            #[cfg(feature = "sml-i18n")]
22227            phonetic_pr: f_phonetic_pr,
22228            #[cfg(feature = "sml-styling")]
22229            conditional_formatting: f_conditional_formatting,
22230            #[cfg(feature = "sml-validation")]
22231            data_validations: f_data_validations,
22232            #[cfg(feature = "sml-hyperlinks")]
22233            hyperlinks: f_hyperlinks,
22234            #[cfg(feature = "sml-layout")]
22235            print_options: f_print_options,
22236            #[cfg(feature = "sml-layout")]
22237            page_margins: f_page_margins,
22238            #[cfg(feature = "sml-layout")]
22239            page_setup: f_page_setup,
22240            #[cfg(feature = "sml-layout")]
22241            header_footer: f_header_footer,
22242            #[cfg(feature = "sml-layout")]
22243            row_breaks: f_row_breaks,
22244            #[cfg(feature = "sml-layout")]
22245            col_breaks: f_col_breaks,
22246            #[cfg(feature = "sml-metadata")]
22247            custom_properties: f_custom_properties,
22248            #[cfg(feature = "sml-formulas-advanced")]
22249            cell_watches: f_cell_watches,
22250            #[cfg(feature = "sml-validation")]
22251            ignored_errors: f_ignored_errors,
22252            #[cfg(feature = "sml-metadata")]
22253            smart_tags: f_smart_tags,
22254            #[cfg(feature = "sml-drawings")]
22255            drawing: f_drawing,
22256            #[cfg(feature = "sml-comments")]
22257            legacy_drawing: f_legacy_drawing,
22258            #[cfg(feature = "sml-layout")]
22259            legacy_drawing_h_f: f_legacy_drawing_h_f,
22260            #[cfg(feature = "sml-drawings")]
22261            drawing_h_f: f_drawing_h_f,
22262            #[cfg(feature = "sml-drawings")]
22263            picture: f_picture,
22264            #[cfg(feature = "sml-external")]
22265            ole_objects: f_ole_objects,
22266            #[cfg(feature = "sml-external")]
22267            controls: f_controls,
22268            #[cfg(feature = "sml-external")]
22269            web_publish_items: f_web_publish_items,
22270            #[cfg(feature = "sml-tables")]
22271            table_parts: f_table_parts,
22272            #[cfg(feature = "sml-extensions")]
22273            extension_list: f_extension_list,
22274            #[cfg(feature = "extra-children")]
22275            extra_children,
22276        })
22277    }
22278}
22279
22280impl FromXml for SheetData {
22281    fn from_xml<R: BufRead>(
22282        reader: &mut Reader<R>,
22283        start_tag: &BytesStart,
22284        is_empty: bool,
22285    ) -> Result<Self, ParseError> {
22286        let mut f_row = Vec::new();
22287        #[cfg(feature = "extra-children")]
22288        let mut extra_children = Vec::new();
22289        #[cfg(feature = "extra-children")]
22290        let mut child_idx: usize = 0;
22291
22292        // Parse child elements
22293        if !is_empty {
22294            let mut buf = Vec::new();
22295            loop {
22296                match reader.read_event_into(&mut buf)? {
22297                    Event::Start(e) => {
22298                        match e.local_name().as_ref() {
22299                            b"row" => {
22300                                f_row.push(Row::from_xml(reader, &e, false)?);
22301                                #[cfg(feature = "extra-children")]
22302                                {
22303                                    child_idx += 1;
22304                                }
22305                            }
22306                            #[cfg(feature = "extra-children")]
22307                            _ => {
22308                                // Capture unknown element for roundtrip
22309                                let elem = RawXmlElement::from_reader(reader, &e)?;
22310                                extra_children.push(PositionedNode::new(
22311                                    child_idx,
22312                                    RawXmlNode::Element(elem),
22313                                ));
22314                                child_idx += 1;
22315                            }
22316                            #[cfg(not(feature = "extra-children"))]
22317                            _ => {
22318                                // Skip unknown element
22319                                skip_element(reader)?;
22320                            }
22321                        }
22322                    }
22323                    Event::Empty(e) => {
22324                        match e.local_name().as_ref() {
22325                            b"row" => {
22326                                f_row.push(Row::from_xml(reader, &e, true)?);
22327                                #[cfg(feature = "extra-children")]
22328                                {
22329                                    child_idx += 1;
22330                                }
22331                            }
22332                            #[cfg(feature = "extra-children")]
22333                            _ => {
22334                                // Capture unknown empty element for roundtrip
22335                                let elem = RawXmlElement::from_empty(&e);
22336                                extra_children.push(PositionedNode::new(
22337                                    child_idx,
22338                                    RawXmlNode::Element(elem),
22339                                ));
22340                                child_idx += 1;
22341                            }
22342                            #[cfg(not(feature = "extra-children"))]
22343                            _ => {}
22344                        }
22345                    }
22346                    Event::End(_) => break,
22347                    Event::Eof => break,
22348                    _ => {}
22349                }
22350                buf.clear();
22351            }
22352        }
22353
22354        Ok(Self {
22355            row: f_row,
22356            #[cfg(feature = "extra-children")]
22357            extra_children,
22358        })
22359    }
22360}
22361
22362impl FromXml for SheetCalcProperties {
22363    fn from_xml<R: BufRead>(
22364        reader: &mut Reader<R>,
22365        start_tag: &BytesStart,
22366        is_empty: bool,
22367    ) -> Result<Self, ParseError> {
22368        let mut f_full_calc_on_load = None;
22369        #[cfg(feature = "extra-attrs")]
22370        let mut extra_attrs = std::collections::HashMap::new();
22371
22372        // Parse attributes
22373        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
22374            let val = String::from_utf8_lossy(&attr.value);
22375            match attr.key.local_name().as_ref() {
22376                b"fullCalcOnLoad" => {
22377                    f_full_calc_on_load = Some(val == "true" || val == "1");
22378                }
22379                #[cfg(feature = "extra-attrs")]
22380                unknown => {
22381                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
22382                    extra_attrs.insert(key, val.into_owned());
22383                }
22384                #[cfg(not(feature = "extra-attrs"))]
22385                _ => {}
22386            }
22387        }
22388
22389        if !is_empty {
22390            let mut buf = Vec::new();
22391            loop {
22392                match reader.read_event_into(&mut buf)? {
22393                    Event::End(_) => break,
22394                    Event::Eof => break,
22395                    _ => {}
22396                }
22397                buf.clear();
22398            }
22399        }
22400
22401        Ok(Self {
22402            full_calc_on_load: f_full_calc_on_load,
22403            #[cfg(feature = "extra-attrs")]
22404            extra_attrs,
22405        })
22406    }
22407}
22408
22409impl FromXml for SheetFormat {
22410    fn from_xml<R: BufRead>(
22411        reader: &mut Reader<R>,
22412        start_tag: &BytesStart,
22413        is_empty: bool,
22414    ) -> Result<Self, ParseError> {
22415        let mut f_base_col_width = None;
22416        let mut f_default_col_width = None;
22417        let mut f_default_row_height: Option<f64> = None;
22418        let mut f_custom_height = None;
22419        let mut f_zero_height = None;
22420        let mut f_thick_top = None;
22421        let mut f_thick_bottom = None;
22422        let mut f_outline_level_row = None;
22423        let mut f_outline_level_col = None;
22424        #[cfg(feature = "extra-attrs")]
22425        let mut extra_attrs = std::collections::HashMap::new();
22426
22427        // Parse attributes
22428        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
22429            let val = String::from_utf8_lossy(&attr.value);
22430            match attr.key.local_name().as_ref() {
22431                b"baseColWidth" => {
22432                    f_base_col_width = val.parse().ok();
22433                }
22434                b"defaultColWidth" => {
22435                    f_default_col_width = val.parse().ok();
22436                }
22437                b"defaultRowHeight" => {
22438                    f_default_row_height = val.parse().ok();
22439                }
22440                b"customHeight" => {
22441                    f_custom_height = Some(val == "true" || val == "1");
22442                }
22443                b"zeroHeight" => {
22444                    f_zero_height = Some(val == "true" || val == "1");
22445                }
22446                b"thickTop" => {
22447                    f_thick_top = Some(val == "true" || val == "1");
22448                }
22449                b"thickBottom" => {
22450                    f_thick_bottom = Some(val == "true" || val == "1");
22451                }
22452                b"outlineLevelRow" => {
22453                    f_outline_level_row = val.parse().ok();
22454                }
22455                b"outlineLevelCol" => {
22456                    f_outline_level_col = val.parse().ok();
22457                }
22458                #[cfg(feature = "extra-attrs")]
22459                unknown => {
22460                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
22461                    extra_attrs.insert(key, val.into_owned());
22462                }
22463                #[cfg(not(feature = "extra-attrs"))]
22464                _ => {}
22465            }
22466        }
22467
22468        if !is_empty {
22469            let mut buf = Vec::new();
22470            loop {
22471                match reader.read_event_into(&mut buf)? {
22472                    Event::End(_) => break,
22473                    Event::Eof => break,
22474                    _ => {}
22475                }
22476                buf.clear();
22477            }
22478        }
22479
22480        Ok(Self {
22481            base_col_width: f_base_col_width,
22482            default_col_width: f_default_col_width,
22483            default_row_height: f_default_row_height
22484                .ok_or_else(|| ParseError::MissingAttribute("defaultRowHeight".to_string()))?,
22485            custom_height: f_custom_height,
22486            zero_height: f_zero_height,
22487            thick_top: f_thick_top,
22488            thick_bottom: f_thick_bottom,
22489            outline_level_row: f_outline_level_row,
22490            outline_level_col: f_outline_level_col,
22491            #[cfg(feature = "extra-attrs")]
22492            extra_attrs,
22493        })
22494    }
22495}
22496
22497impl FromXml for Columns {
22498    fn from_xml<R: BufRead>(
22499        reader: &mut Reader<R>,
22500        start_tag: &BytesStart,
22501        is_empty: bool,
22502    ) -> Result<Self, ParseError> {
22503        let mut f_col = Vec::new();
22504        #[cfg(feature = "extra-children")]
22505        let mut extra_children = Vec::new();
22506        #[cfg(feature = "extra-children")]
22507        let mut child_idx: usize = 0;
22508
22509        // Parse child elements
22510        if !is_empty {
22511            let mut buf = Vec::new();
22512            loop {
22513                match reader.read_event_into(&mut buf)? {
22514                    Event::Start(e) => {
22515                        match e.local_name().as_ref() {
22516                            b"col" => {
22517                                f_col.push(Column::from_xml(reader, &e, false)?);
22518                                #[cfg(feature = "extra-children")]
22519                                {
22520                                    child_idx += 1;
22521                                }
22522                            }
22523                            #[cfg(feature = "extra-children")]
22524                            _ => {
22525                                // Capture unknown element for roundtrip
22526                                let elem = RawXmlElement::from_reader(reader, &e)?;
22527                                extra_children.push(PositionedNode::new(
22528                                    child_idx,
22529                                    RawXmlNode::Element(elem),
22530                                ));
22531                                child_idx += 1;
22532                            }
22533                            #[cfg(not(feature = "extra-children"))]
22534                            _ => {
22535                                // Skip unknown element
22536                                skip_element(reader)?;
22537                            }
22538                        }
22539                    }
22540                    Event::Empty(e) => {
22541                        match e.local_name().as_ref() {
22542                            b"col" => {
22543                                f_col.push(Column::from_xml(reader, &e, true)?);
22544                                #[cfg(feature = "extra-children")]
22545                                {
22546                                    child_idx += 1;
22547                                }
22548                            }
22549                            #[cfg(feature = "extra-children")]
22550                            _ => {
22551                                // Capture unknown empty element for roundtrip
22552                                let elem = RawXmlElement::from_empty(&e);
22553                                extra_children.push(PositionedNode::new(
22554                                    child_idx,
22555                                    RawXmlNode::Element(elem),
22556                                ));
22557                                child_idx += 1;
22558                            }
22559                            #[cfg(not(feature = "extra-children"))]
22560                            _ => {}
22561                        }
22562                    }
22563                    Event::End(_) => break,
22564                    Event::Eof => break,
22565                    _ => {}
22566                }
22567                buf.clear();
22568            }
22569        }
22570
22571        Ok(Self {
22572            col: f_col,
22573            #[cfg(feature = "extra-children")]
22574            extra_children,
22575        })
22576    }
22577}
22578
22579impl FromXml for Column {
22580    fn from_xml<R: BufRead>(
22581        reader: &mut Reader<R>,
22582        start_tag: &BytesStart,
22583        is_empty: bool,
22584    ) -> Result<Self, ParseError> {
22585        #[cfg(feature = "sml-styling")]
22586        let mut f_start_column: Option<u32> = None;
22587        #[cfg(feature = "sml-styling")]
22588        let mut f_end_column: Option<u32> = None;
22589        #[cfg(feature = "sml-styling")]
22590        let mut f_width = None;
22591        #[cfg(feature = "sml-styling")]
22592        let mut f_style = None;
22593        #[cfg(feature = "sml-structure")]
22594        let mut f_hidden = None;
22595        #[cfg(feature = "sml-styling")]
22596        let mut f_best_fit = None;
22597        #[cfg(feature = "sml-styling")]
22598        let mut f_custom_width = None;
22599        #[cfg(feature = "sml-i18n")]
22600        let mut f_phonetic = None;
22601        #[cfg(feature = "sml-structure")]
22602        let mut f_outline_level = None;
22603        #[cfg(feature = "sml-structure")]
22604        let mut f_collapsed = None;
22605        #[cfg(feature = "extra-attrs")]
22606        let mut extra_attrs = std::collections::HashMap::new();
22607
22608        // Parse attributes
22609        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
22610            let val = String::from_utf8_lossy(&attr.value);
22611            match attr.key.local_name().as_ref() {
22612                #[cfg(feature = "sml-styling")]
22613                b"min" => {
22614                    f_start_column = val.parse().ok();
22615                }
22616                #[cfg(feature = "sml-styling")]
22617                b"max" => {
22618                    f_end_column = val.parse().ok();
22619                }
22620                #[cfg(feature = "sml-styling")]
22621                b"width" => {
22622                    f_width = val.parse().ok();
22623                }
22624                #[cfg(feature = "sml-styling")]
22625                b"style" => {
22626                    f_style = val.parse().ok();
22627                }
22628                #[cfg(feature = "sml-structure")]
22629                b"hidden" => {
22630                    f_hidden = Some(val == "true" || val == "1");
22631                }
22632                #[cfg(feature = "sml-styling")]
22633                b"bestFit" => {
22634                    f_best_fit = Some(val == "true" || val == "1");
22635                }
22636                #[cfg(feature = "sml-styling")]
22637                b"customWidth" => {
22638                    f_custom_width = Some(val == "true" || val == "1");
22639                }
22640                #[cfg(feature = "sml-i18n")]
22641                b"phonetic" => {
22642                    f_phonetic = Some(val == "true" || val == "1");
22643                }
22644                #[cfg(feature = "sml-structure")]
22645                b"outlineLevel" => {
22646                    f_outline_level = val.parse().ok();
22647                }
22648                #[cfg(feature = "sml-structure")]
22649                b"collapsed" => {
22650                    f_collapsed = Some(val == "true" || val == "1");
22651                }
22652                #[cfg(feature = "extra-attrs")]
22653                unknown => {
22654                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
22655                    extra_attrs.insert(key, val.into_owned());
22656                }
22657                #[cfg(not(feature = "extra-attrs"))]
22658                _ => {}
22659            }
22660        }
22661
22662        if !is_empty {
22663            let mut buf = Vec::new();
22664            loop {
22665                match reader.read_event_into(&mut buf)? {
22666                    Event::End(_) => break,
22667                    Event::Eof => break,
22668                    _ => {}
22669                }
22670                buf.clear();
22671            }
22672        }
22673
22674        Ok(Self {
22675            #[cfg(feature = "sml-styling")]
22676            start_column: f_start_column
22677                .ok_or_else(|| ParseError::MissingAttribute("min".to_string()))?,
22678            #[cfg(feature = "sml-styling")]
22679            end_column: f_end_column
22680                .ok_or_else(|| ParseError::MissingAttribute("max".to_string()))?,
22681            #[cfg(feature = "sml-styling")]
22682            width: f_width,
22683            #[cfg(feature = "sml-styling")]
22684            style: f_style,
22685            #[cfg(feature = "sml-structure")]
22686            hidden: f_hidden,
22687            #[cfg(feature = "sml-styling")]
22688            best_fit: f_best_fit,
22689            #[cfg(feature = "sml-styling")]
22690            custom_width: f_custom_width,
22691            #[cfg(feature = "sml-i18n")]
22692            phonetic: f_phonetic,
22693            #[cfg(feature = "sml-structure")]
22694            outline_level: f_outline_level,
22695            #[cfg(feature = "sml-structure")]
22696            collapsed: f_collapsed,
22697            #[cfg(feature = "extra-attrs")]
22698            extra_attrs,
22699        })
22700    }
22701}
22702
22703impl FromXml for Row {
22704    fn from_xml<R: BufRead>(
22705        reader: &mut Reader<R>,
22706        start_tag: &BytesStart,
22707        is_empty: bool,
22708    ) -> Result<Self, ParseError> {
22709        let mut f_reference = None;
22710        let mut f_cell_spans = None;
22711        let mut f_style_index = None;
22712        #[cfg(feature = "sml-styling")]
22713        let mut f_custom_format = None;
22714        #[cfg(feature = "sml-styling")]
22715        let mut f_height = None;
22716        #[cfg(feature = "sml-structure")]
22717        let mut f_hidden = None;
22718        #[cfg(feature = "sml-styling")]
22719        let mut f_custom_height = None;
22720        #[cfg(feature = "sml-structure")]
22721        let mut f_outline_level = None;
22722        #[cfg(feature = "sml-structure")]
22723        let mut f_collapsed = None;
22724        #[cfg(feature = "sml-styling")]
22725        let mut f_thick_top = None;
22726        #[cfg(feature = "sml-styling")]
22727        let mut f_thick_bot = None;
22728        #[cfg(feature = "sml-i18n")]
22729        let mut f_placeholder = None;
22730        let mut f_cells = Vec::new();
22731        #[cfg(feature = "sml-extensions")]
22732        let mut f_extension_list = None;
22733        #[cfg(feature = "extra-attrs")]
22734        let mut extra_attrs = std::collections::HashMap::new();
22735        #[cfg(feature = "extra-children")]
22736        let mut extra_children = Vec::new();
22737        #[cfg(feature = "extra-children")]
22738        let mut child_idx: usize = 0;
22739
22740        // Parse attributes
22741        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
22742            let val = String::from_utf8_lossy(&attr.value);
22743            match attr.key.local_name().as_ref() {
22744                b"r" => {
22745                    f_reference = val.parse().ok();
22746                }
22747                b"spans" => {
22748                    f_cell_spans = Some(val.into_owned());
22749                }
22750                b"s" => {
22751                    f_style_index = val.parse().ok();
22752                }
22753                #[cfg(feature = "sml-styling")]
22754                b"customFormat" => {
22755                    f_custom_format = Some(val == "true" || val == "1");
22756                }
22757                #[cfg(feature = "sml-styling")]
22758                b"ht" => {
22759                    f_height = val.parse().ok();
22760                }
22761                #[cfg(feature = "sml-structure")]
22762                b"hidden" => {
22763                    f_hidden = Some(val == "true" || val == "1");
22764                }
22765                #[cfg(feature = "sml-styling")]
22766                b"customHeight" => {
22767                    f_custom_height = Some(val == "true" || val == "1");
22768                }
22769                #[cfg(feature = "sml-structure")]
22770                b"outlineLevel" => {
22771                    f_outline_level = val.parse().ok();
22772                }
22773                #[cfg(feature = "sml-structure")]
22774                b"collapsed" => {
22775                    f_collapsed = Some(val == "true" || val == "1");
22776                }
22777                #[cfg(feature = "sml-styling")]
22778                b"thickTop" => {
22779                    f_thick_top = Some(val == "true" || val == "1");
22780                }
22781                #[cfg(feature = "sml-styling")]
22782                b"thickBot" => {
22783                    f_thick_bot = Some(val == "true" || val == "1");
22784                }
22785                #[cfg(feature = "sml-i18n")]
22786                b"ph" => {
22787                    f_placeholder = Some(val == "true" || val == "1");
22788                }
22789                #[cfg(feature = "extra-attrs")]
22790                unknown => {
22791                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
22792                    extra_attrs.insert(key, val.into_owned());
22793                }
22794                #[cfg(not(feature = "extra-attrs"))]
22795                _ => {}
22796            }
22797        }
22798
22799        // Parse child elements
22800        if !is_empty {
22801            let mut buf = Vec::new();
22802            loop {
22803                match reader.read_event_into(&mut buf)? {
22804                    Event::Start(e) => {
22805                        match e.local_name().as_ref() {
22806                            b"c" => {
22807                                f_cells.push(Cell::from_xml(reader, &e, false)?);
22808                                #[cfg(feature = "extra-children")]
22809                                {
22810                                    child_idx += 1;
22811                                }
22812                            }
22813                            #[cfg(feature = "sml-extensions")]
22814                            b"extLst" => {
22815                                f_extension_list =
22816                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
22817                                #[cfg(feature = "extra-children")]
22818                                {
22819                                    child_idx += 1;
22820                                }
22821                            }
22822                            #[cfg(feature = "extra-children")]
22823                            _ => {
22824                                // Capture unknown element for roundtrip
22825                                let elem = RawXmlElement::from_reader(reader, &e)?;
22826                                extra_children.push(PositionedNode::new(
22827                                    child_idx,
22828                                    RawXmlNode::Element(elem),
22829                                ));
22830                                child_idx += 1;
22831                            }
22832                            #[cfg(not(feature = "extra-children"))]
22833                            _ => {
22834                                // Skip unknown element
22835                                skip_element(reader)?;
22836                            }
22837                        }
22838                    }
22839                    Event::Empty(e) => {
22840                        match e.local_name().as_ref() {
22841                            b"c" => {
22842                                f_cells.push(Cell::from_xml(reader, &e, true)?);
22843                                #[cfg(feature = "extra-children")]
22844                                {
22845                                    child_idx += 1;
22846                                }
22847                            }
22848                            #[cfg(feature = "sml-extensions")]
22849                            b"extLst" => {
22850                                f_extension_list =
22851                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
22852                                #[cfg(feature = "extra-children")]
22853                                {
22854                                    child_idx += 1;
22855                                }
22856                            }
22857                            #[cfg(feature = "extra-children")]
22858                            _ => {
22859                                // Capture unknown empty element for roundtrip
22860                                let elem = RawXmlElement::from_empty(&e);
22861                                extra_children.push(PositionedNode::new(
22862                                    child_idx,
22863                                    RawXmlNode::Element(elem),
22864                                ));
22865                                child_idx += 1;
22866                            }
22867                            #[cfg(not(feature = "extra-children"))]
22868                            _ => {}
22869                        }
22870                    }
22871                    Event::End(_) => break,
22872                    Event::Eof => break,
22873                    _ => {}
22874                }
22875                buf.clear();
22876            }
22877        }
22878
22879        Ok(Self {
22880            reference: f_reference,
22881            cell_spans: f_cell_spans,
22882            style_index: f_style_index,
22883            #[cfg(feature = "sml-styling")]
22884            custom_format: f_custom_format,
22885            #[cfg(feature = "sml-styling")]
22886            height: f_height,
22887            #[cfg(feature = "sml-structure")]
22888            hidden: f_hidden,
22889            #[cfg(feature = "sml-styling")]
22890            custom_height: f_custom_height,
22891            #[cfg(feature = "sml-structure")]
22892            outline_level: f_outline_level,
22893            #[cfg(feature = "sml-structure")]
22894            collapsed: f_collapsed,
22895            #[cfg(feature = "sml-styling")]
22896            thick_top: f_thick_top,
22897            #[cfg(feature = "sml-styling")]
22898            thick_bot: f_thick_bot,
22899            #[cfg(feature = "sml-i18n")]
22900            placeholder: f_placeholder,
22901            cells: f_cells,
22902            #[cfg(feature = "sml-extensions")]
22903            extension_list: f_extension_list,
22904            #[cfg(feature = "extra-attrs")]
22905            extra_attrs,
22906            #[cfg(feature = "extra-children")]
22907            extra_children,
22908        })
22909    }
22910}
22911
22912impl FromXml for Cell {
22913    fn from_xml<R: BufRead>(
22914        reader: &mut Reader<R>,
22915        start_tag: &BytesStart,
22916        is_empty: bool,
22917    ) -> Result<Self, ParseError> {
22918        let mut f_reference = None;
22919        let mut f_style_index = None;
22920        let mut f_cell_type = None;
22921        #[cfg(feature = "sml-metadata")]
22922        let mut f_cm = None;
22923        #[cfg(feature = "sml-metadata")]
22924        let mut f_vm = None;
22925        #[cfg(feature = "sml-i18n")]
22926        let mut f_placeholder = None;
22927        let mut f_formula = None;
22928        let mut f_value = None;
22929        let mut f_is = None;
22930        #[cfg(feature = "sml-extensions")]
22931        let mut f_extension_list = None;
22932        #[cfg(feature = "extra-attrs")]
22933        let mut extra_attrs = std::collections::HashMap::new();
22934        #[cfg(feature = "extra-children")]
22935        let mut extra_children = Vec::new();
22936        #[cfg(feature = "extra-children")]
22937        let mut child_idx: usize = 0;
22938
22939        // Parse attributes
22940        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
22941            let val = String::from_utf8_lossy(&attr.value);
22942            match attr.key.local_name().as_ref() {
22943                b"r" => {
22944                    f_reference = Some(val.into_owned());
22945                }
22946                b"s" => {
22947                    f_style_index = val.parse().ok();
22948                }
22949                b"t" => {
22950                    f_cell_type = val.parse().ok();
22951                }
22952                #[cfg(feature = "sml-metadata")]
22953                b"cm" => {
22954                    f_cm = val.parse().ok();
22955                }
22956                #[cfg(feature = "sml-metadata")]
22957                b"vm" => {
22958                    f_vm = val.parse().ok();
22959                }
22960                #[cfg(feature = "sml-i18n")]
22961                b"ph" => {
22962                    f_placeholder = Some(val == "true" || val == "1");
22963                }
22964                #[cfg(feature = "extra-attrs")]
22965                unknown => {
22966                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
22967                    extra_attrs.insert(key, val.into_owned());
22968                }
22969                #[cfg(not(feature = "extra-attrs"))]
22970                _ => {}
22971            }
22972        }
22973
22974        // Parse child elements
22975        if !is_empty {
22976            let mut buf = Vec::new();
22977            loop {
22978                match reader.read_event_into(&mut buf)? {
22979                    Event::Start(e) => {
22980                        match e.local_name().as_ref() {
22981                            b"f" => {
22982                                f_formula =
22983                                    Some(Box::new(CellFormula::from_xml(reader, &e, false)?));
22984                                #[cfg(feature = "extra-children")]
22985                                {
22986                                    child_idx += 1;
22987                                }
22988                            }
22989                            b"v" => {
22990                                f_value = Some(read_text_content(reader)?);
22991                                #[cfg(feature = "extra-children")]
22992                                {
22993                                    child_idx += 1;
22994                                }
22995                            }
22996                            b"is" => {
22997                                f_is = Some(Box::new(RichString::from_xml(reader, &e, false)?));
22998                                #[cfg(feature = "extra-children")]
22999                                {
23000                                    child_idx += 1;
23001                                }
23002                            }
23003                            #[cfg(feature = "sml-extensions")]
23004                            b"extLst" => {
23005                                f_extension_list =
23006                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
23007                                #[cfg(feature = "extra-children")]
23008                                {
23009                                    child_idx += 1;
23010                                }
23011                            }
23012                            #[cfg(feature = "extra-children")]
23013                            _ => {
23014                                // Capture unknown element for roundtrip
23015                                let elem = RawXmlElement::from_reader(reader, &e)?;
23016                                extra_children.push(PositionedNode::new(
23017                                    child_idx,
23018                                    RawXmlNode::Element(elem),
23019                                ));
23020                                child_idx += 1;
23021                            }
23022                            #[cfg(not(feature = "extra-children"))]
23023                            _ => {
23024                                // Skip unknown element
23025                                skip_element(reader)?;
23026                            }
23027                        }
23028                    }
23029                    Event::Empty(e) => {
23030                        match e.local_name().as_ref() {
23031                            b"f" => {
23032                                f_formula =
23033                                    Some(Box::new(CellFormula::from_xml(reader, &e, true)?));
23034                                #[cfg(feature = "extra-children")]
23035                                {
23036                                    child_idx += 1;
23037                                }
23038                            }
23039                            b"v" => {
23040                                f_value = Some(String::new());
23041                                #[cfg(feature = "extra-children")]
23042                                {
23043                                    child_idx += 1;
23044                                }
23045                            }
23046                            b"is" => {
23047                                f_is = Some(Box::new(RichString::from_xml(reader, &e, true)?));
23048                                #[cfg(feature = "extra-children")]
23049                                {
23050                                    child_idx += 1;
23051                                }
23052                            }
23053                            #[cfg(feature = "sml-extensions")]
23054                            b"extLst" => {
23055                                f_extension_list =
23056                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
23057                                #[cfg(feature = "extra-children")]
23058                                {
23059                                    child_idx += 1;
23060                                }
23061                            }
23062                            #[cfg(feature = "extra-children")]
23063                            _ => {
23064                                // Capture unknown empty element for roundtrip
23065                                let elem = RawXmlElement::from_empty(&e);
23066                                extra_children.push(PositionedNode::new(
23067                                    child_idx,
23068                                    RawXmlNode::Element(elem),
23069                                ));
23070                                child_idx += 1;
23071                            }
23072                            #[cfg(not(feature = "extra-children"))]
23073                            _ => {}
23074                        }
23075                    }
23076                    Event::End(_) => break,
23077                    Event::Eof => break,
23078                    _ => {}
23079                }
23080                buf.clear();
23081            }
23082        }
23083
23084        Ok(Self {
23085            reference: f_reference,
23086            style_index: f_style_index,
23087            cell_type: f_cell_type,
23088            #[cfg(feature = "sml-metadata")]
23089            cm: f_cm,
23090            #[cfg(feature = "sml-metadata")]
23091            vm: f_vm,
23092            #[cfg(feature = "sml-i18n")]
23093            placeholder: f_placeholder,
23094            formula: f_formula,
23095            value: f_value,
23096            is: f_is,
23097            #[cfg(feature = "sml-extensions")]
23098            extension_list: f_extension_list,
23099            #[cfg(feature = "extra-attrs")]
23100            extra_attrs,
23101            #[cfg(feature = "extra-children")]
23102            extra_children,
23103        })
23104    }
23105}
23106
23107impl FromXml for SheetProperties {
23108    fn from_xml<R: BufRead>(
23109        reader: &mut Reader<R>,
23110        start_tag: &BytesStart,
23111        is_empty: bool,
23112    ) -> Result<Self, ParseError> {
23113        #[cfg(feature = "sml-structure")]
23114        let mut f_sync_horizontal = None;
23115        #[cfg(feature = "sml-structure")]
23116        let mut f_sync_vertical = None;
23117        #[cfg(feature = "sml-structure")]
23118        let mut f_sync_ref = None;
23119        #[cfg(feature = "sml-formulas")]
23120        let mut f_transition_evaluation = None;
23121        #[cfg(feature = "sml-formulas")]
23122        let mut f_transition_entry = None;
23123        #[cfg(feature = "sml-external")]
23124        let mut f_published = None;
23125        #[cfg(feature = "sml-structure")]
23126        let mut f_code_name = None;
23127        #[cfg(feature = "sml-filtering")]
23128        let mut f_filter_mode = None;
23129        #[cfg(feature = "sml-styling")]
23130        let mut f_enable_format_conditions_calculation = None;
23131        #[cfg(feature = "sml-styling")]
23132        let mut f_tab_color = None;
23133        #[cfg(feature = "sml-structure")]
23134        let mut f_outline_pr = None;
23135        #[cfg(feature = "sml-layout")]
23136        let mut f_page_set_up_pr = None;
23137        #[cfg(feature = "extra-attrs")]
23138        let mut extra_attrs = std::collections::HashMap::new();
23139        #[cfg(feature = "extra-children")]
23140        let mut extra_children = Vec::new();
23141        #[cfg(feature = "extra-children")]
23142        let mut child_idx: usize = 0;
23143
23144        // Parse attributes
23145        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
23146            let val = String::from_utf8_lossy(&attr.value);
23147            match attr.key.local_name().as_ref() {
23148                #[cfg(feature = "sml-structure")]
23149                b"syncHorizontal" => {
23150                    f_sync_horizontal = Some(val == "true" || val == "1");
23151                }
23152                #[cfg(feature = "sml-structure")]
23153                b"syncVertical" => {
23154                    f_sync_vertical = Some(val == "true" || val == "1");
23155                }
23156                #[cfg(feature = "sml-structure")]
23157                b"syncRef" => {
23158                    f_sync_ref = Some(val.into_owned());
23159                }
23160                #[cfg(feature = "sml-formulas")]
23161                b"transitionEvaluation" => {
23162                    f_transition_evaluation = Some(val == "true" || val == "1");
23163                }
23164                #[cfg(feature = "sml-formulas")]
23165                b"transitionEntry" => {
23166                    f_transition_entry = Some(val == "true" || val == "1");
23167                }
23168                #[cfg(feature = "sml-external")]
23169                b"published" => {
23170                    f_published = Some(val == "true" || val == "1");
23171                }
23172                #[cfg(feature = "sml-structure")]
23173                b"codeName" => {
23174                    f_code_name = Some(val.into_owned());
23175                }
23176                #[cfg(feature = "sml-filtering")]
23177                b"filterMode" => {
23178                    f_filter_mode = Some(val == "true" || val == "1");
23179                }
23180                #[cfg(feature = "sml-styling")]
23181                b"enableFormatConditionsCalculation" => {
23182                    f_enable_format_conditions_calculation = Some(val == "true" || val == "1");
23183                }
23184                #[cfg(feature = "extra-attrs")]
23185                unknown => {
23186                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
23187                    extra_attrs.insert(key, val.into_owned());
23188                }
23189                #[cfg(not(feature = "extra-attrs"))]
23190                _ => {}
23191            }
23192        }
23193
23194        // Parse child elements
23195        if !is_empty {
23196            let mut buf = Vec::new();
23197            loop {
23198                match reader.read_event_into(&mut buf)? {
23199                    Event::Start(e) => {
23200                        match e.local_name().as_ref() {
23201                            #[cfg(feature = "sml-styling")]
23202                            b"tabColor" => {
23203                                f_tab_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
23204                                #[cfg(feature = "extra-children")]
23205                                {
23206                                    child_idx += 1;
23207                                }
23208                            }
23209                            #[cfg(feature = "sml-structure")]
23210                            b"outlinePr" => {
23211                                f_outline_pr =
23212                                    Some(Box::new(OutlineProperties::from_xml(reader, &e, false)?));
23213                                #[cfg(feature = "extra-children")]
23214                                {
23215                                    child_idx += 1;
23216                                }
23217                            }
23218                            #[cfg(feature = "sml-layout")]
23219                            b"pageSetUpPr" => {
23220                                f_page_set_up_pr = Some(Box::new(PageSetupProperties::from_xml(
23221                                    reader, &e, false,
23222                                )?));
23223                                #[cfg(feature = "extra-children")]
23224                                {
23225                                    child_idx += 1;
23226                                }
23227                            }
23228                            #[cfg(feature = "extra-children")]
23229                            _ => {
23230                                // Capture unknown element for roundtrip
23231                                let elem = RawXmlElement::from_reader(reader, &e)?;
23232                                extra_children.push(PositionedNode::new(
23233                                    child_idx,
23234                                    RawXmlNode::Element(elem),
23235                                ));
23236                                child_idx += 1;
23237                            }
23238                            #[cfg(not(feature = "extra-children"))]
23239                            _ => {
23240                                // Skip unknown element
23241                                skip_element(reader)?;
23242                            }
23243                        }
23244                    }
23245                    Event::Empty(e) => {
23246                        match e.local_name().as_ref() {
23247                            #[cfg(feature = "sml-styling")]
23248                            b"tabColor" => {
23249                                f_tab_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
23250                                #[cfg(feature = "extra-children")]
23251                                {
23252                                    child_idx += 1;
23253                                }
23254                            }
23255                            #[cfg(feature = "sml-structure")]
23256                            b"outlinePr" => {
23257                                f_outline_pr =
23258                                    Some(Box::new(OutlineProperties::from_xml(reader, &e, true)?));
23259                                #[cfg(feature = "extra-children")]
23260                                {
23261                                    child_idx += 1;
23262                                }
23263                            }
23264                            #[cfg(feature = "sml-layout")]
23265                            b"pageSetUpPr" => {
23266                                f_page_set_up_pr = Some(Box::new(PageSetupProperties::from_xml(
23267                                    reader, &e, true,
23268                                )?));
23269                                #[cfg(feature = "extra-children")]
23270                                {
23271                                    child_idx += 1;
23272                                }
23273                            }
23274                            #[cfg(feature = "extra-children")]
23275                            _ => {
23276                                // Capture unknown empty element for roundtrip
23277                                let elem = RawXmlElement::from_empty(&e);
23278                                extra_children.push(PositionedNode::new(
23279                                    child_idx,
23280                                    RawXmlNode::Element(elem),
23281                                ));
23282                                child_idx += 1;
23283                            }
23284                            #[cfg(not(feature = "extra-children"))]
23285                            _ => {}
23286                        }
23287                    }
23288                    Event::End(_) => break,
23289                    Event::Eof => break,
23290                    _ => {}
23291                }
23292                buf.clear();
23293            }
23294        }
23295
23296        Ok(Self {
23297            #[cfg(feature = "sml-structure")]
23298            sync_horizontal: f_sync_horizontal,
23299            #[cfg(feature = "sml-structure")]
23300            sync_vertical: f_sync_vertical,
23301            #[cfg(feature = "sml-structure")]
23302            sync_ref: f_sync_ref,
23303            #[cfg(feature = "sml-formulas")]
23304            transition_evaluation: f_transition_evaluation,
23305            #[cfg(feature = "sml-formulas")]
23306            transition_entry: f_transition_entry,
23307            #[cfg(feature = "sml-external")]
23308            published: f_published,
23309            #[cfg(feature = "sml-structure")]
23310            code_name: f_code_name,
23311            #[cfg(feature = "sml-filtering")]
23312            filter_mode: f_filter_mode,
23313            #[cfg(feature = "sml-styling")]
23314            enable_format_conditions_calculation: f_enable_format_conditions_calculation,
23315            #[cfg(feature = "sml-styling")]
23316            tab_color: f_tab_color,
23317            #[cfg(feature = "sml-structure")]
23318            outline_pr: f_outline_pr,
23319            #[cfg(feature = "sml-layout")]
23320            page_set_up_pr: f_page_set_up_pr,
23321            #[cfg(feature = "extra-attrs")]
23322            extra_attrs,
23323            #[cfg(feature = "extra-children")]
23324            extra_children,
23325        })
23326    }
23327}
23328
23329impl FromXml for SheetDimension {
23330    fn from_xml<R: BufRead>(
23331        reader: &mut Reader<R>,
23332        start_tag: &BytesStart,
23333        is_empty: bool,
23334    ) -> Result<Self, ParseError> {
23335        let mut f_reference: Option<Reference> = None;
23336        #[cfg(feature = "extra-attrs")]
23337        let mut extra_attrs = std::collections::HashMap::new();
23338
23339        // Parse attributes
23340        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
23341            let val = String::from_utf8_lossy(&attr.value);
23342            match attr.key.local_name().as_ref() {
23343                b"ref" => {
23344                    f_reference = Some(val.into_owned());
23345                }
23346                #[cfg(feature = "extra-attrs")]
23347                unknown => {
23348                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
23349                    extra_attrs.insert(key, val.into_owned());
23350                }
23351                #[cfg(not(feature = "extra-attrs"))]
23352                _ => {}
23353            }
23354        }
23355
23356        if !is_empty {
23357            let mut buf = Vec::new();
23358            loop {
23359                match reader.read_event_into(&mut buf)? {
23360                    Event::End(_) => break,
23361                    Event::Eof => break,
23362                    _ => {}
23363                }
23364                buf.clear();
23365            }
23366        }
23367
23368        Ok(Self {
23369            reference: f_reference
23370                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
23371            #[cfg(feature = "extra-attrs")]
23372            extra_attrs,
23373        })
23374    }
23375}
23376
23377impl FromXml for SheetViews {
23378    fn from_xml<R: BufRead>(
23379        reader: &mut Reader<R>,
23380        start_tag: &BytesStart,
23381        is_empty: bool,
23382    ) -> Result<Self, ParseError> {
23383        let mut f_sheet_view = Vec::new();
23384        let mut f_extension_list = None;
23385        #[cfg(feature = "extra-children")]
23386        let mut extra_children = Vec::new();
23387        #[cfg(feature = "extra-children")]
23388        let mut child_idx: usize = 0;
23389
23390        // Parse child elements
23391        if !is_empty {
23392            let mut buf = Vec::new();
23393            loop {
23394                match reader.read_event_into(&mut buf)? {
23395                    Event::Start(e) => {
23396                        match e.local_name().as_ref() {
23397                            b"sheetView" => {
23398                                f_sheet_view.push(SheetView::from_xml(reader, &e, false)?);
23399                                #[cfg(feature = "extra-children")]
23400                                {
23401                                    child_idx += 1;
23402                                }
23403                            }
23404                            b"extLst" => {
23405                                f_extension_list =
23406                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
23407                                #[cfg(feature = "extra-children")]
23408                                {
23409                                    child_idx += 1;
23410                                }
23411                            }
23412                            #[cfg(feature = "extra-children")]
23413                            _ => {
23414                                // Capture unknown element for roundtrip
23415                                let elem = RawXmlElement::from_reader(reader, &e)?;
23416                                extra_children.push(PositionedNode::new(
23417                                    child_idx,
23418                                    RawXmlNode::Element(elem),
23419                                ));
23420                                child_idx += 1;
23421                            }
23422                            #[cfg(not(feature = "extra-children"))]
23423                            _ => {
23424                                // Skip unknown element
23425                                skip_element(reader)?;
23426                            }
23427                        }
23428                    }
23429                    Event::Empty(e) => {
23430                        match e.local_name().as_ref() {
23431                            b"sheetView" => {
23432                                f_sheet_view.push(SheetView::from_xml(reader, &e, true)?);
23433                                #[cfg(feature = "extra-children")]
23434                                {
23435                                    child_idx += 1;
23436                                }
23437                            }
23438                            b"extLst" => {
23439                                f_extension_list =
23440                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
23441                                #[cfg(feature = "extra-children")]
23442                                {
23443                                    child_idx += 1;
23444                                }
23445                            }
23446                            #[cfg(feature = "extra-children")]
23447                            _ => {
23448                                // Capture unknown empty element for roundtrip
23449                                let elem = RawXmlElement::from_empty(&e);
23450                                extra_children.push(PositionedNode::new(
23451                                    child_idx,
23452                                    RawXmlNode::Element(elem),
23453                                ));
23454                                child_idx += 1;
23455                            }
23456                            #[cfg(not(feature = "extra-children"))]
23457                            _ => {}
23458                        }
23459                    }
23460                    Event::End(_) => break,
23461                    Event::Eof => break,
23462                    _ => {}
23463                }
23464                buf.clear();
23465            }
23466        }
23467
23468        Ok(Self {
23469            sheet_view: f_sheet_view,
23470            extension_list: f_extension_list,
23471            #[cfg(feature = "extra-children")]
23472            extra_children,
23473        })
23474    }
23475}
23476
23477impl FromXml for SheetView {
23478    fn from_xml<R: BufRead>(
23479        reader: &mut Reader<R>,
23480        start_tag: &BytesStart,
23481        is_empty: bool,
23482    ) -> Result<Self, ParseError> {
23483        #[cfg(feature = "sml-protection")]
23484        let mut f_window_protection = None;
23485        #[cfg(feature = "sml-formulas")]
23486        let mut f_show_formulas = None;
23487        #[cfg(feature = "sml-styling")]
23488        let mut f_show_grid_lines = None;
23489        #[cfg(feature = "sml-styling")]
23490        let mut f_show_row_col_headers = None;
23491        #[cfg(feature = "sml-styling")]
23492        let mut f_show_zeros = None;
23493        #[cfg(feature = "sml-i18n")]
23494        let mut f_right_to_left = None;
23495        let mut f_tab_selected = None;
23496        #[cfg(feature = "sml-layout")]
23497        let mut f_show_ruler = None;
23498        #[cfg(feature = "sml-structure")]
23499        let mut f_show_outline_symbols = None;
23500        #[cfg(feature = "sml-styling")]
23501        let mut f_default_grid_color = None;
23502        #[cfg(feature = "sml-layout")]
23503        let mut f_show_white_space = None;
23504        let mut f_view = None;
23505        let mut f_top_left_cell = None;
23506        #[cfg(feature = "sml-styling")]
23507        let mut f_color_id = None;
23508        let mut f_zoom_scale = None;
23509        let mut f_zoom_scale_normal = None;
23510        #[cfg(feature = "sml-layout")]
23511        let mut f_zoom_scale_sheet_layout_view = None;
23512        #[cfg(feature = "sml-layout")]
23513        let mut f_zoom_scale_page_layout_view = None;
23514        let mut f_workbook_view_id: Option<u32> = None;
23515        #[cfg(feature = "sml-structure")]
23516        let mut f_pane = None;
23517        let mut f_selection = Vec::new();
23518        #[cfg(feature = "sml-pivot")]
23519        let mut f_pivot_selection = Vec::new();
23520        #[cfg(feature = "sml-extensions")]
23521        let mut f_extension_list = None;
23522        #[cfg(feature = "extra-attrs")]
23523        let mut extra_attrs = std::collections::HashMap::new();
23524        #[cfg(feature = "extra-children")]
23525        let mut extra_children = Vec::new();
23526        #[cfg(feature = "extra-children")]
23527        let mut child_idx: usize = 0;
23528
23529        // Parse attributes
23530        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
23531            let val = String::from_utf8_lossy(&attr.value);
23532            match attr.key.local_name().as_ref() {
23533                #[cfg(feature = "sml-protection")]
23534                b"windowProtection" => {
23535                    f_window_protection = Some(val == "true" || val == "1");
23536                }
23537                #[cfg(feature = "sml-formulas")]
23538                b"showFormulas" => {
23539                    f_show_formulas = Some(val == "true" || val == "1");
23540                }
23541                #[cfg(feature = "sml-styling")]
23542                b"showGridLines" => {
23543                    f_show_grid_lines = Some(val == "true" || val == "1");
23544                }
23545                #[cfg(feature = "sml-styling")]
23546                b"showRowColHeaders" => {
23547                    f_show_row_col_headers = Some(val == "true" || val == "1");
23548                }
23549                #[cfg(feature = "sml-styling")]
23550                b"showZeros" => {
23551                    f_show_zeros = Some(val == "true" || val == "1");
23552                }
23553                #[cfg(feature = "sml-i18n")]
23554                b"rightToLeft" => {
23555                    f_right_to_left = Some(val == "true" || val == "1");
23556                }
23557                b"tabSelected" => {
23558                    f_tab_selected = Some(val == "true" || val == "1");
23559                }
23560                #[cfg(feature = "sml-layout")]
23561                b"showRuler" => {
23562                    f_show_ruler = Some(val == "true" || val == "1");
23563                }
23564                #[cfg(feature = "sml-structure")]
23565                b"showOutlineSymbols" => {
23566                    f_show_outline_symbols = Some(val == "true" || val == "1");
23567                }
23568                #[cfg(feature = "sml-styling")]
23569                b"defaultGridColor" => {
23570                    f_default_grid_color = Some(val == "true" || val == "1");
23571                }
23572                #[cfg(feature = "sml-layout")]
23573                b"showWhiteSpace" => {
23574                    f_show_white_space = Some(val == "true" || val == "1");
23575                }
23576                b"view" => {
23577                    f_view = val.parse().ok();
23578                }
23579                b"topLeftCell" => {
23580                    f_top_left_cell = Some(val.into_owned());
23581                }
23582                #[cfg(feature = "sml-styling")]
23583                b"colorId" => {
23584                    f_color_id = val.parse().ok();
23585                }
23586                b"zoomScale" => {
23587                    f_zoom_scale = val.parse().ok();
23588                }
23589                b"zoomScaleNormal" => {
23590                    f_zoom_scale_normal = val.parse().ok();
23591                }
23592                #[cfg(feature = "sml-layout")]
23593                b"zoomScaleSheetLayoutView" => {
23594                    f_zoom_scale_sheet_layout_view = val.parse().ok();
23595                }
23596                #[cfg(feature = "sml-layout")]
23597                b"zoomScalePageLayoutView" => {
23598                    f_zoom_scale_page_layout_view = val.parse().ok();
23599                }
23600                b"workbookViewId" => {
23601                    f_workbook_view_id = val.parse().ok();
23602                }
23603                #[cfg(feature = "extra-attrs")]
23604                unknown => {
23605                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
23606                    extra_attrs.insert(key, val.into_owned());
23607                }
23608                #[cfg(not(feature = "extra-attrs"))]
23609                _ => {}
23610            }
23611        }
23612
23613        // Parse child elements
23614        if !is_empty {
23615            let mut buf = Vec::new();
23616            loop {
23617                match reader.read_event_into(&mut buf)? {
23618                    Event::Start(e) => {
23619                        match e.local_name().as_ref() {
23620                            #[cfg(feature = "sml-structure")]
23621                            b"pane" => {
23622                                f_pane = Some(Box::new(Pane::from_xml(reader, &e, false)?));
23623                                #[cfg(feature = "extra-children")]
23624                                {
23625                                    child_idx += 1;
23626                                }
23627                            }
23628                            b"selection" => {
23629                                f_selection.push(Selection::from_xml(reader, &e, false)?);
23630                                #[cfg(feature = "extra-children")]
23631                                {
23632                                    child_idx += 1;
23633                                }
23634                            }
23635                            #[cfg(feature = "sml-pivot")]
23636                            b"pivotSelection" => {
23637                                f_pivot_selection
23638                                    .push(CTPivotSelection::from_xml(reader, &e, false)?);
23639                                #[cfg(feature = "extra-children")]
23640                                {
23641                                    child_idx += 1;
23642                                }
23643                            }
23644                            #[cfg(feature = "sml-extensions")]
23645                            b"extLst" => {
23646                                f_extension_list =
23647                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
23648                                #[cfg(feature = "extra-children")]
23649                                {
23650                                    child_idx += 1;
23651                                }
23652                            }
23653                            #[cfg(feature = "extra-children")]
23654                            _ => {
23655                                // Capture unknown element for roundtrip
23656                                let elem = RawXmlElement::from_reader(reader, &e)?;
23657                                extra_children.push(PositionedNode::new(
23658                                    child_idx,
23659                                    RawXmlNode::Element(elem),
23660                                ));
23661                                child_idx += 1;
23662                            }
23663                            #[cfg(not(feature = "extra-children"))]
23664                            _ => {
23665                                // Skip unknown element
23666                                skip_element(reader)?;
23667                            }
23668                        }
23669                    }
23670                    Event::Empty(e) => {
23671                        match e.local_name().as_ref() {
23672                            #[cfg(feature = "sml-structure")]
23673                            b"pane" => {
23674                                f_pane = Some(Box::new(Pane::from_xml(reader, &e, true)?));
23675                                #[cfg(feature = "extra-children")]
23676                                {
23677                                    child_idx += 1;
23678                                }
23679                            }
23680                            b"selection" => {
23681                                f_selection.push(Selection::from_xml(reader, &e, true)?);
23682                                #[cfg(feature = "extra-children")]
23683                                {
23684                                    child_idx += 1;
23685                                }
23686                            }
23687                            #[cfg(feature = "sml-pivot")]
23688                            b"pivotSelection" => {
23689                                f_pivot_selection
23690                                    .push(CTPivotSelection::from_xml(reader, &e, true)?);
23691                                #[cfg(feature = "extra-children")]
23692                                {
23693                                    child_idx += 1;
23694                                }
23695                            }
23696                            #[cfg(feature = "sml-extensions")]
23697                            b"extLst" => {
23698                                f_extension_list =
23699                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
23700                                #[cfg(feature = "extra-children")]
23701                                {
23702                                    child_idx += 1;
23703                                }
23704                            }
23705                            #[cfg(feature = "extra-children")]
23706                            _ => {
23707                                // Capture unknown empty element for roundtrip
23708                                let elem = RawXmlElement::from_empty(&e);
23709                                extra_children.push(PositionedNode::new(
23710                                    child_idx,
23711                                    RawXmlNode::Element(elem),
23712                                ));
23713                                child_idx += 1;
23714                            }
23715                            #[cfg(not(feature = "extra-children"))]
23716                            _ => {}
23717                        }
23718                    }
23719                    Event::End(_) => break,
23720                    Event::Eof => break,
23721                    _ => {}
23722                }
23723                buf.clear();
23724            }
23725        }
23726
23727        Ok(Self {
23728            #[cfg(feature = "sml-protection")]
23729            window_protection: f_window_protection,
23730            #[cfg(feature = "sml-formulas")]
23731            show_formulas: f_show_formulas,
23732            #[cfg(feature = "sml-styling")]
23733            show_grid_lines: f_show_grid_lines,
23734            #[cfg(feature = "sml-styling")]
23735            show_row_col_headers: f_show_row_col_headers,
23736            #[cfg(feature = "sml-styling")]
23737            show_zeros: f_show_zeros,
23738            #[cfg(feature = "sml-i18n")]
23739            right_to_left: f_right_to_left,
23740            tab_selected: f_tab_selected,
23741            #[cfg(feature = "sml-layout")]
23742            show_ruler: f_show_ruler,
23743            #[cfg(feature = "sml-structure")]
23744            show_outline_symbols: f_show_outline_symbols,
23745            #[cfg(feature = "sml-styling")]
23746            default_grid_color: f_default_grid_color,
23747            #[cfg(feature = "sml-layout")]
23748            show_white_space: f_show_white_space,
23749            view: f_view,
23750            top_left_cell: f_top_left_cell,
23751            #[cfg(feature = "sml-styling")]
23752            color_id: f_color_id,
23753            zoom_scale: f_zoom_scale,
23754            zoom_scale_normal: f_zoom_scale_normal,
23755            #[cfg(feature = "sml-layout")]
23756            zoom_scale_sheet_layout_view: f_zoom_scale_sheet_layout_view,
23757            #[cfg(feature = "sml-layout")]
23758            zoom_scale_page_layout_view: f_zoom_scale_page_layout_view,
23759            workbook_view_id: f_workbook_view_id
23760                .ok_or_else(|| ParseError::MissingAttribute("workbookViewId".to_string()))?,
23761            #[cfg(feature = "sml-structure")]
23762            pane: f_pane,
23763            selection: f_selection,
23764            #[cfg(feature = "sml-pivot")]
23765            pivot_selection: f_pivot_selection,
23766            #[cfg(feature = "sml-extensions")]
23767            extension_list: f_extension_list,
23768            #[cfg(feature = "extra-attrs")]
23769            extra_attrs,
23770            #[cfg(feature = "extra-children")]
23771            extra_children,
23772        })
23773    }
23774}
23775
23776impl FromXml for Pane {
23777    fn from_xml<R: BufRead>(
23778        reader: &mut Reader<R>,
23779        start_tag: &BytesStart,
23780        is_empty: bool,
23781    ) -> Result<Self, ParseError> {
23782        #[cfg(feature = "sml-structure")]
23783        let mut f_x_split = None;
23784        #[cfg(feature = "sml-structure")]
23785        let mut f_y_split = None;
23786        #[cfg(feature = "sml-structure")]
23787        let mut f_top_left_cell = None;
23788        #[cfg(feature = "sml-structure")]
23789        let mut f_active_pane = None;
23790        #[cfg(feature = "sml-structure")]
23791        let mut f_state = None;
23792        #[cfg(feature = "extra-attrs")]
23793        let mut extra_attrs = std::collections::HashMap::new();
23794
23795        // Parse attributes
23796        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
23797            let val = String::from_utf8_lossy(&attr.value);
23798            match attr.key.local_name().as_ref() {
23799                #[cfg(feature = "sml-structure")]
23800                b"xSplit" => {
23801                    f_x_split = val.parse().ok();
23802                }
23803                #[cfg(feature = "sml-structure")]
23804                b"ySplit" => {
23805                    f_y_split = val.parse().ok();
23806                }
23807                #[cfg(feature = "sml-structure")]
23808                b"topLeftCell" => {
23809                    f_top_left_cell = Some(val.into_owned());
23810                }
23811                #[cfg(feature = "sml-structure")]
23812                b"activePane" => {
23813                    f_active_pane = val.parse().ok();
23814                }
23815                #[cfg(feature = "sml-structure")]
23816                b"state" => {
23817                    f_state = val.parse().ok();
23818                }
23819                #[cfg(feature = "extra-attrs")]
23820                unknown => {
23821                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
23822                    extra_attrs.insert(key, val.into_owned());
23823                }
23824                #[cfg(not(feature = "extra-attrs"))]
23825                _ => {}
23826            }
23827        }
23828
23829        if !is_empty {
23830            let mut buf = Vec::new();
23831            loop {
23832                match reader.read_event_into(&mut buf)? {
23833                    Event::End(_) => break,
23834                    Event::Eof => break,
23835                    _ => {}
23836                }
23837                buf.clear();
23838            }
23839        }
23840
23841        Ok(Self {
23842            #[cfg(feature = "sml-structure")]
23843            x_split: f_x_split,
23844            #[cfg(feature = "sml-structure")]
23845            y_split: f_y_split,
23846            #[cfg(feature = "sml-structure")]
23847            top_left_cell: f_top_left_cell,
23848            #[cfg(feature = "sml-structure")]
23849            active_pane: f_active_pane,
23850            #[cfg(feature = "sml-structure")]
23851            state: f_state,
23852            #[cfg(feature = "extra-attrs")]
23853            extra_attrs,
23854        })
23855    }
23856}
23857
23858impl FromXml for CTPivotSelection {
23859    fn from_xml<R: BufRead>(
23860        reader: &mut Reader<R>,
23861        start_tag: &BytesStart,
23862        is_empty: bool,
23863    ) -> Result<Self, ParseError> {
23864        let mut f_pane = None;
23865        let mut f_show_header = None;
23866        let mut f_label = None;
23867        let mut f_data = None;
23868        let mut f_extendable = None;
23869        let mut f_count = None;
23870        let mut f_axis = None;
23871        let mut f_dimension = None;
23872        let mut f_start = None;
23873        let mut f_start_column = None;
23874        let mut f_end_column = None;
23875        let mut f_active_row = None;
23876        let mut f_active_col = None;
23877        let mut f_previous_row = None;
23878        let mut f_previous_col = None;
23879        let mut f_click = None;
23880        let mut f_id = None;
23881        let mut f_pivot_area: Option<Box<PivotArea>> = None;
23882        #[cfg(feature = "extra-attrs")]
23883        let mut extra_attrs = std::collections::HashMap::new();
23884        #[cfg(feature = "extra-children")]
23885        let mut extra_children = Vec::new();
23886        #[cfg(feature = "extra-children")]
23887        let mut child_idx: usize = 0;
23888
23889        // Parse attributes
23890        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
23891            let val = String::from_utf8_lossy(&attr.value);
23892            match attr.key.local_name().as_ref() {
23893                b"pane" => {
23894                    f_pane = val.parse().ok();
23895                }
23896                b"showHeader" => {
23897                    f_show_header = Some(val == "true" || val == "1");
23898                }
23899                b"label" => {
23900                    f_label = Some(val == "true" || val == "1");
23901                }
23902                b"data" => {
23903                    f_data = Some(val == "true" || val == "1");
23904                }
23905                b"extendable" => {
23906                    f_extendable = Some(val == "true" || val == "1");
23907                }
23908                b"count" => {
23909                    f_count = val.parse().ok();
23910                }
23911                b"axis" => {
23912                    f_axis = val.parse().ok();
23913                }
23914                b"dimension" => {
23915                    f_dimension = val.parse().ok();
23916                }
23917                b"start" => {
23918                    f_start = val.parse().ok();
23919                }
23920                b"min" => {
23921                    f_start_column = val.parse().ok();
23922                }
23923                b"max" => {
23924                    f_end_column = val.parse().ok();
23925                }
23926                b"activeRow" => {
23927                    f_active_row = val.parse().ok();
23928                }
23929                b"activeCol" => {
23930                    f_active_col = val.parse().ok();
23931                }
23932                b"previousRow" => {
23933                    f_previous_row = val.parse().ok();
23934                }
23935                b"previousCol" => {
23936                    f_previous_col = val.parse().ok();
23937                }
23938                b"click" => {
23939                    f_click = val.parse().ok();
23940                }
23941                b"id" => {
23942                    f_id = Some(val.into_owned());
23943                }
23944                #[cfg(feature = "extra-attrs")]
23945                unknown => {
23946                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
23947                    extra_attrs.insert(key, val.into_owned());
23948                }
23949                #[cfg(not(feature = "extra-attrs"))]
23950                _ => {}
23951            }
23952        }
23953
23954        // Parse child elements
23955        if !is_empty {
23956            let mut buf = Vec::new();
23957            loop {
23958                match reader.read_event_into(&mut buf)? {
23959                    Event::Start(e) => {
23960                        match e.local_name().as_ref() {
23961                            b"pivotArea" => {
23962                                f_pivot_area =
23963                                    Some(Box::new(PivotArea::from_xml(reader, &e, false)?));
23964                                #[cfg(feature = "extra-children")]
23965                                {
23966                                    child_idx += 1;
23967                                }
23968                            }
23969                            #[cfg(feature = "extra-children")]
23970                            _ => {
23971                                // Capture unknown element for roundtrip
23972                                let elem = RawXmlElement::from_reader(reader, &e)?;
23973                                extra_children.push(PositionedNode::new(
23974                                    child_idx,
23975                                    RawXmlNode::Element(elem),
23976                                ));
23977                                child_idx += 1;
23978                            }
23979                            #[cfg(not(feature = "extra-children"))]
23980                            _ => {
23981                                // Skip unknown element
23982                                skip_element(reader)?;
23983                            }
23984                        }
23985                    }
23986                    Event::Empty(e) => {
23987                        match e.local_name().as_ref() {
23988                            b"pivotArea" => {
23989                                f_pivot_area =
23990                                    Some(Box::new(PivotArea::from_xml(reader, &e, true)?));
23991                                #[cfg(feature = "extra-children")]
23992                                {
23993                                    child_idx += 1;
23994                                }
23995                            }
23996                            #[cfg(feature = "extra-children")]
23997                            _ => {
23998                                // Capture unknown empty element for roundtrip
23999                                let elem = RawXmlElement::from_empty(&e);
24000                                extra_children.push(PositionedNode::new(
24001                                    child_idx,
24002                                    RawXmlNode::Element(elem),
24003                                ));
24004                                child_idx += 1;
24005                            }
24006                            #[cfg(not(feature = "extra-children"))]
24007                            _ => {}
24008                        }
24009                    }
24010                    Event::End(_) => break,
24011                    Event::Eof => break,
24012                    _ => {}
24013                }
24014                buf.clear();
24015            }
24016        }
24017
24018        Ok(Self {
24019            pane: f_pane,
24020            show_header: f_show_header,
24021            label: f_label,
24022            data: f_data,
24023            extendable: f_extendable,
24024            count: f_count,
24025            axis: f_axis,
24026            dimension: f_dimension,
24027            start: f_start,
24028            start_column: f_start_column,
24029            end_column: f_end_column,
24030            active_row: f_active_row,
24031            active_col: f_active_col,
24032            previous_row: f_previous_row,
24033            previous_col: f_previous_col,
24034            click: f_click,
24035            id: f_id,
24036            pivot_area: f_pivot_area
24037                .ok_or_else(|| ParseError::MissingAttribute("pivotArea".to_string()))?,
24038            #[cfg(feature = "extra-attrs")]
24039            extra_attrs,
24040            #[cfg(feature = "extra-children")]
24041            extra_children,
24042        })
24043    }
24044}
24045
24046impl FromXml for Selection {
24047    fn from_xml<R: BufRead>(
24048        reader: &mut Reader<R>,
24049        start_tag: &BytesStart,
24050        is_empty: bool,
24051    ) -> Result<Self, ParseError> {
24052        let mut f_pane = None;
24053        let mut f_active_cell = None;
24054        let mut f_active_cell_id = None;
24055        let mut f_square_reference = None;
24056        #[cfg(feature = "extra-attrs")]
24057        let mut extra_attrs = std::collections::HashMap::new();
24058
24059        // Parse attributes
24060        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24061            let val = String::from_utf8_lossy(&attr.value);
24062            match attr.key.local_name().as_ref() {
24063                b"pane" => {
24064                    f_pane = val.parse().ok();
24065                }
24066                b"activeCell" => {
24067                    f_active_cell = Some(val.into_owned());
24068                }
24069                b"activeCellId" => {
24070                    f_active_cell_id = val.parse().ok();
24071                }
24072                b"sqref" => {
24073                    f_square_reference = Some(val.into_owned());
24074                }
24075                #[cfg(feature = "extra-attrs")]
24076                unknown => {
24077                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24078                    extra_attrs.insert(key, val.into_owned());
24079                }
24080                #[cfg(not(feature = "extra-attrs"))]
24081                _ => {}
24082            }
24083        }
24084
24085        if !is_empty {
24086            let mut buf = Vec::new();
24087            loop {
24088                match reader.read_event_into(&mut buf)? {
24089                    Event::End(_) => break,
24090                    Event::Eof => break,
24091                    _ => {}
24092                }
24093                buf.clear();
24094            }
24095        }
24096
24097        Ok(Self {
24098            pane: f_pane,
24099            active_cell: f_active_cell,
24100            active_cell_id: f_active_cell_id,
24101            square_reference: f_square_reference,
24102            #[cfg(feature = "extra-attrs")]
24103            extra_attrs,
24104        })
24105    }
24106}
24107
24108impl FromXml for PageBreaks {
24109    fn from_xml<R: BufRead>(
24110        reader: &mut Reader<R>,
24111        start_tag: &BytesStart,
24112        is_empty: bool,
24113    ) -> Result<Self, ParseError> {
24114        #[cfg(feature = "sml-layout")]
24115        let mut f_count = None;
24116        #[cfg(feature = "sml-layout")]
24117        let mut f_manual_break_count = None;
24118        #[cfg(feature = "sml-layout")]
24119        let mut f_brk = Vec::new();
24120        #[cfg(feature = "extra-attrs")]
24121        let mut extra_attrs = std::collections::HashMap::new();
24122        #[cfg(feature = "extra-children")]
24123        let mut extra_children = Vec::new();
24124        #[cfg(feature = "extra-children")]
24125        let mut child_idx: usize = 0;
24126
24127        // Parse attributes
24128        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24129            let val = String::from_utf8_lossy(&attr.value);
24130            match attr.key.local_name().as_ref() {
24131                #[cfg(feature = "sml-layout")]
24132                b"count" => {
24133                    f_count = val.parse().ok();
24134                }
24135                #[cfg(feature = "sml-layout")]
24136                b"manualBreakCount" => {
24137                    f_manual_break_count = val.parse().ok();
24138                }
24139                #[cfg(feature = "extra-attrs")]
24140                unknown => {
24141                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24142                    extra_attrs.insert(key, val.into_owned());
24143                }
24144                #[cfg(not(feature = "extra-attrs"))]
24145                _ => {}
24146            }
24147        }
24148
24149        // Parse child elements
24150        if !is_empty {
24151            let mut buf = Vec::new();
24152            loop {
24153                match reader.read_event_into(&mut buf)? {
24154                    Event::Start(e) => {
24155                        match e.local_name().as_ref() {
24156                            #[cfg(feature = "sml-layout")]
24157                            b"brk" => {
24158                                f_brk.push(PageBreak::from_xml(reader, &e, false)?);
24159                                #[cfg(feature = "extra-children")]
24160                                {
24161                                    child_idx += 1;
24162                                }
24163                            }
24164                            #[cfg(feature = "extra-children")]
24165                            _ => {
24166                                // Capture unknown element for roundtrip
24167                                let elem = RawXmlElement::from_reader(reader, &e)?;
24168                                extra_children.push(PositionedNode::new(
24169                                    child_idx,
24170                                    RawXmlNode::Element(elem),
24171                                ));
24172                                child_idx += 1;
24173                            }
24174                            #[cfg(not(feature = "extra-children"))]
24175                            _ => {
24176                                // Skip unknown element
24177                                skip_element(reader)?;
24178                            }
24179                        }
24180                    }
24181                    Event::Empty(e) => {
24182                        match e.local_name().as_ref() {
24183                            #[cfg(feature = "sml-layout")]
24184                            b"brk" => {
24185                                f_brk.push(PageBreak::from_xml(reader, &e, true)?);
24186                                #[cfg(feature = "extra-children")]
24187                                {
24188                                    child_idx += 1;
24189                                }
24190                            }
24191                            #[cfg(feature = "extra-children")]
24192                            _ => {
24193                                // Capture unknown empty element for roundtrip
24194                                let elem = RawXmlElement::from_empty(&e);
24195                                extra_children.push(PositionedNode::new(
24196                                    child_idx,
24197                                    RawXmlNode::Element(elem),
24198                                ));
24199                                child_idx += 1;
24200                            }
24201                            #[cfg(not(feature = "extra-children"))]
24202                            _ => {}
24203                        }
24204                    }
24205                    Event::End(_) => break,
24206                    Event::Eof => break,
24207                    _ => {}
24208                }
24209                buf.clear();
24210            }
24211        }
24212
24213        Ok(Self {
24214            #[cfg(feature = "sml-layout")]
24215            count: f_count,
24216            #[cfg(feature = "sml-layout")]
24217            manual_break_count: f_manual_break_count,
24218            #[cfg(feature = "sml-layout")]
24219            brk: f_brk,
24220            #[cfg(feature = "extra-attrs")]
24221            extra_attrs,
24222            #[cfg(feature = "extra-children")]
24223            extra_children,
24224        })
24225    }
24226}
24227
24228impl FromXml for PageBreak {
24229    fn from_xml<R: BufRead>(
24230        reader: &mut Reader<R>,
24231        start_tag: &BytesStart,
24232        is_empty: bool,
24233    ) -> Result<Self, ParseError> {
24234        let mut f_id = None;
24235        let mut f_start_column = None;
24236        let mut f_end_column = None;
24237        let mut f_man = None;
24238        let mut f_pt = None;
24239        #[cfg(feature = "extra-attrs")]
24240        let mut extra_attrs = std::collections::HashMap::new();
24241
24242        // Parse attributes
24243        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24244            let val = String::from_utf8_lossy(&attr.value);
24245            match attr.key.local_name().as_ref() {
24246                b"id" => {
24247                    f_id = val.parse().ok();
24248                }
24249                b"min" => {
24250                    f_start_column = val.parse().ok();
24251                }
24252                b"max" => {
24253                    f_end_column = val.parse().ok();
24254                }
24255                b"man" => {
24256                    f_man = Some(val == "true" || val == "1");
24257                }
24258                b"pt" => {
24259                    f_pt = Some(val == "true" || val == "1");
24260                }
24261                #[cfg(feature = "extra-attrs")]
24262                unknown => {
24263                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24264                    extra_attrs.insert(key, val.into_owned());
24265                }
24266                #[cfg(not(feature = "extra-attrs"))]
24267                _ => {}
24268            }
24269        }
24270
24271        if !is_empty {
24272            let mut buf = Vec::new();
24273            loop {
24274                match reader.read_event_into(&mut buf)? {
24275                    Event::End(_) => break,
24276                    Event::Eof => break,
24277                    _ => {}
24278                }
24279                buf.clear();
24280            }
24281        }
24282
24283        Ok(Self {
24284            id: f_id,
24285            start_column: f_start_column,
24286            end_column: f_end_column,
24287            man: f_man,
24288            pt: f_pt,
24289            #[cfg(feature = "extra-attrs")]
24290            extra_attrs,
24291        })
24292    }
24293}
24294
24295impl FromXml for OutlineProperties {
24296    fn from_xml<R: BufRead>(
24297        reader: &mut Reader<R>,
24298        start_tag: &BytesStart,
24299        is_empty: bool,
24300    ) -> Result<Self, ParseError> {
24301        let mut f_apply_styles = None;
24302        let mut f_summary_below = None;
24303        let mut f_summary_right = None;
24304        let mut f_show_outline_symbols = None;
24305        #[cfg(feature = "extra-attrs")]
24306        let mut extra_attrs = std::collections::HashMap::new();
24307
24308        // Parse attributes
24309        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24310            let val = String::from_utf8_lossy(&attr.value);
24311            match attr.key.local_name().as_ref() {
24312                b"applyStyles" => {
24313                    f_apply_styles = Some(val == "true" || val == "1");
24314                }
24315                b"summaryBelow" => {
24316                    f_summary_below = Some(val == "true" || val == "1");
24317                }
24318                b"summaryRight" => {
24319                    f_summary_right = Some(val == "true" || val == "1");
24320                }
24321                b"showOutlineSymbols" => {
24322                    f_show_outline_symbols = Some(val == "true" || val == "1");
24323                }
24324                #[cfg(feature = "extra-attrs")]
24325                unknown => {
24326                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24327                    extra_attrs.insert(key, val.into_owned());
24328                }
24329                #[cfg(not(feature = "extra-attrs"))]
24330                _ => {}
24331            }
24332        }
24333
24334        if !is_empty {
24335            let mut buf = Vec::new();
24336            loop {
24337                match reader.read_event_into(&mut buf)? {
24338                    Event::End(_) => break,
24339                    Event::Eof => break,
24340                    _ => {}
24341                }
24342                buf.clear();
24343            }
24344        }
24345
24346        Ok(Self {
24347            apply_styles: f_apply_styles,
24348            summary_below: f_summary_below,
24349            summary_right: f_summary_right,
24350            show_outline_symbols: f_show_outline_symbols,
24351            #[cfg(feature = "extra-attrs")]
24352            extra_attrs,
24353        })
24354    }
24355}
24356
24357impl FromXml for PageSetupProperties {
24358    fn from_xml<R: BufRead>(
24359        reader: &mut Reader<R>,
24360        start_tag: &BytesStart,
24361        is_empty: bool,
24362    ) -> Result<Self, ParseError> {
24363        let mut f_auto_page_breaks = None;
24364        let mut f_fit_to_page = None;
24365        #[cfg(feature = "extra-attrs")]
24366        let mut extra_attrs = std::collections::HashMap::new();
24367
24368        // Parse attributes
24369        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24370            let val = String::from_utf8_lossy(&attr.value);
24371            match attr.key.local_name().as_ref() {
24372                b"autoPageBreaks" => {
24373                    f_auto_page_breaks = Some(val == "true" || val == "1");
24374                }
24375                b"fitToPage" => {
24376                    f_fit_to_page = Some(val == "true" || val == "1");
24377                }
24378                #[cfg(feature = "extra-attrs")]
24379                unknown => {
24380                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24381                    extra_attrs.insert(key, val.into_owned());
24382                }
24383                #[cfg(not(feature = "extra-attrs"))]
24384                _ => {}
24385            }
24386        }
24387
24388        if !is_empty {
24389            let mut buf = Vec::new();
24390            loop {
24391                match reader.read_event_into(&mut buf)? {
24392                    Event::End(_) => break,
24393                    Event::Eof => break,
24394                    _ => {}
24395                }
24396                buf.clear();
24397            }
24398        }
24399
24400        Ok(Self {
24401            auto_page_breaks: f_auto_page_breaks,
24402            fit_to_page: f_fit_to_page,
24403            #[cfg(feature = "extra-attrs")]
24404            extra_attrs,
24405        })
24406    }
24407}
24408
24409impl FromXml for CTDataConsolidate {
24410    fn from_xml<R: BufRead>(
24411        reader: &mut Reader<R>,
24412        start_tag: &BytesStart,
24413        is_empty: bool,
24414    ) -> Result<Self, ParseError> {
24415        let mut f_function = None;
24416        let mut f_start_labels = None;
24417        let mut f_left_labels = None;
24418        let mut f_top_labels = None;
24419        let mut f_link = None;
24420        let mut f_data_refs = None;
24421        #[cfg(feature = "extra-attrs")]
24422        let mut extra_attrs = std::collections::HashMap::new();
24423        #[cfg(feature = "extra-children")]
24424        let mut extra_children = Vec::new();
24425        #[cfg(feature = "extra-children")]
24426        let mut child_idx: usize = 0;
24427
24428        // Parse attributes
24429        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24430            let val = String::from_utf8_lossy(&attr.value);
24431            match attr.key.local_name().as_ref() {
24432                b"function" => {
24433                    f_function = val.parse().ok();
24434                }
24435                b"startLabels" => {
24436                    f_start_labels = Some(val == "true" || val == "1");
24437                }
24438                b"leftLabels" => {
24439                    f_left_labels = Some(val == "true" || val == "1");
24440                }
24441                b"topLabels" => {
24442                    f_top_labels = Some(val == "true" || val == "1");
24443                }
24444                b"link" => {
24445                    f_link = Some(val == "true" || val == "1");
24446                }
24447                #[cfg(feature = "extra-attrs")]
24448                unknown => {
24449                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24450                    extra_attrs.insert(key, val.into_owned());
24451                }
24452                #[cfg(not(feature = "extra-attrs"))]
24453                _ => {}
24454            }
24455        }
24456
24457        // Parse child elements
24458        if !is_empty {
24459            let mut buf = Vec::new();
24460            loop {
24461                match reader.read_event_into(&mut buf)? {
24462                    Event::Start(e) => {
24463                        match e.local_name().as_ref() {
24464                            b"dataRefs" => {
24465                                f_data_refs =
24466                                    Some(Box::new(CTDataRefs::from_xml(reader, &e, false)?));
24467                                #[cfg(feature = "extra-children")]
24468                                {
24469                                    child_idx += 1;
24470                                }
24471                            }
24472                            #[cfg(feature = "extra-children")]
24473                            _ => {
24474                                // Capture unknown element for roundtrip
24475                                let elem = RawXmlElement::from_reader(reader, &e)?;
24476                                extra_children.push(PositionedNode::new(
24477                                    child_idx,
24478                                    RawXmlNode::Element(elem),
24479                                ));
24480                                child_idx += 1;
24481                            }
24482                            #[cfg(not(feature = "extra-children"))]
24483                            _ => {
24484                                // Skip unknown element
24485                                skip_element(reader)?;
24486                            }
24487                        }
24488                    }
24489                    Event::Empty(e) => {
24490                        match e.local_name().as_ref() {
24491                            b"dataRefs" => {
24492                                f_data_refs =
24493                                    Some(Box::new(CTDataRefs::from_xml(reader, &e, true)?));
24494                                #[cfg(feature = "extra-children")]
24495                                {
24496                                    child_idx += 1;
24497                                }
24498                            }
24499                            #[cfg(feature = "extra-children")]
24500                            _ => {
24501                                // Capture unknown empty element for roundtrip
24502                                let elem = RawXmlElement::from_empty(&e);
24503                                extra_children.push(PositionedNode::new(
24504                                    child_idx,
24505                                    RawXmlNode::Element(elem),
24506                                ));
24507                                child_idx += 1;
24508                            }
24509                            #[cfg(not(feature = "extra-children"))]
24510                            _ => {}
24511                        }
24512                    }
24513                    Event::End(_) => break,
24514                    Event::Eof => break,
24515                    _ => {}
24516                }
24517                buf.clear();
24518            }
24519        }
24520
24521        Ok(Self {
24522            function: f_function,
24523            start_labels: f_start_labels,
24524            left_labels: f_left_labels,
24525            top_labels: f_top_labels,
24526            link: f_link,
24527            data_refs: f_data_refs,
24528            #[cfg(feature = "extra-attrs")]
24529            extra_attrs,
24530            #[cfg(feature = "extra-children")]
24531            extra_children,
24532        })
24533    }
24534}
24535
24536impl FromXml for CTDataRefs {
24537    fn from_xml<R: BufRead>(
24538        reader: &mut Reader<R>,
24539        start_tag: &BytesStart,
24540        is_empty: bool,
24541    ) -> Result<Self, ParseError> {
24542        let mut f_count = None;
24543        let mut f_data_ref = Vec::new();
24544        #[cfg(feature = "extra-attrs")]
24545        let mut extra_attrs = std::collections::HashMap::new();
24546        #[cfg(feature = "extra-children")]
24547        let mut extra_children = Vec::new();
24548        #[cfg(feature = "extra-children")]
24549        let mut child_idx: usize = 0;
24550
24551        // Parse attributes
24552        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24553            let val = String::from_utf8_lossy(&attr.value);
24554            match attr.key.local_name().as_ref() {
24555                b"count" => {
24556                    f_count = val.parse().ok();
24557                }
24558                #[cfg(feature = "extra-attrs")]
24559                unknown => {
24560                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24561                    extra_attrs.insert(key, val.into_owned());
24562                }
24563                #[cfg(not(feature = "extra-attrs"))]
24564                _ => {}
24565            }
24566        }
24567
24568        // Parse child elements
24569        if !is_empty {
24570            let mut buf = Vec::new();
24571            loop {
24572                match reader.read_event_into(&mut buf)? {
24573                    Event::Start(e) => {
24574                        match e.local_name().as_ref() {
24575                            b"dataRef" => {
24576                                f_data_ref.push(CTDataRef::from_xml(reader, &e, false)?);
24577                                #[cfg(feature = "extra-children")]
24578                                {
24579                                    child_idx += 1;
24580                                }
24581                            }
24582                            #[cfg(feature = "extra-children")]
24583                            _ => {
24584                                // Capture unknown element for roundtrip
24585                                let elem = RawXmlElement::from_reader(reader, &e)?;
24586                                extra_children.push(PositionedNode::new(
24587                                    child_idx,
24588                                    RawXmlNode::Element(elem),
24589                                ));
24590                                child_idx += 1;
24591                            }
24592                            #[cfg(not(feature = "extra-children"))]
24593                            _ => {
24594                                // Skip unknown element
24595                                skip_element(reader)?;
24596                            }
24597                        }
24598                    }
24599                    Event::Empty(e) => {
24600                        match e.local_name().as_ref() {
24601                            b"dataRef" => {
24602                                f_data_ref.push(CTDataRef::from_xml(reader, &e, true)?);
24603                                #[cfg(feature = "extra-children")]
24604                                {
24605                                    child_idx += 1;
24606                                }
24607                            }
24608                            #[cfg(feature = "extra-children")]
24609                            _ => {
24610                                // Capture unknown empty element for roundtrip
24611                                let elem = RawXmlElement::from_empty(&e);
24612                                extra_children.push(PositionedNode::new(
24613                                    child_idx,
24614                                    RawXmlNode::Element(elem),
24615                                ));
24616                                child_idx += 1;
24617                            }
24618                            #[cfg(not(feature = "extra-children"))]
24619                            _ => {}
24620                        }
24621                    }
24622                    Event::End(_) => break,
24623                    Event::Eof => break,
24624                    _ => {}
24625                }
24626                buf.clear();
24627            }
24628        }
24629
24630        Ok(Self {
24631            count: f_count,
24632            data_ref: f_data_ref,
24633            #[cfg(feature = "extra-attrs")]
24634            extra_attrs,
24635            #[cfg(feature = "extra-children")]
24636            extra_children,
24637        })
24638    }
24639}
24640
24641impl FromXml for CTDataRef {
24642    fn from_xml<R: BufRead>(
24643        reader: &mut Reader<R>,
24644        start_tag: &BytesStart,
24645        is_empty: bool,
24646    ) -> Result<Self, ParseError> {
24647        let mut f_reference = None;
24648        let mut f_name = None;
24649        let mut f_sheet = None;
24650        let mut f_id = None;
24651        #[cfg(feature = "extra-attrs")]
24652        let mut extra_attrs = std::collections::HashMap::new();
24653
24654        // Parse attributes
24655        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24656            let val = String::from_utf8_lossy(&attr.value);
24657            match attr.key.local_name().as_ref() {
24658                b"ref" => {
24659                    f_reference = Some(val.into_owned());
24660                }
24661                b"name" => {
24662                    f_name = Some(val.into_owned());
24663                }
24664                b"sheet" => {
24665                    f_sheet = Some(val.into_owned());
24666                }
24667                b"id" => {
24668                    f_id = Some(val.into_owned());
24669                }
24670                #[cfg(feature = "extra-attrs")]
24671                unknown => {
24672                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24673                    extra_attrs.insert(key, val.into_owned());
24674                }
24675                #[cfg(not(feature = "extra-attrs"))]
24676                _ => {}
24677            }
24678        }
24679
24680        if !is_empty {
24681            let mut buf = Vec::new();
24682            loop {
24683                match reader.read_event_into(&mut buf)? {
24684                    Event::End(_) => break,
24685                    Event::Eof => break,
24686                    _ => {}
24687                }
24688                buf.clear();
24689            }
24690        }
24691
24692        Ok(Self {
24693            reference: f_reference,
24694            name: f_name,
24695            sheet: f_sheet,
24696            id: f_id,
24697            #[cfg(feature = "extra-attrs")]
24698            extra_attrs,
24699        })
24700    }
24701}
24702
24703impl FromXml for MergedCells {
24704    fn from_xml<R: BufRead>(
24705        reader: &mut Reader<R>,
24706        start_tag: &BytesStart,
24707        is_empty: bool,
24708    ) -> Result<Self, ParseError> {
24709        let mut f_count = None;
24710        let mut f_merge_cell = Vec::new();
24711        #[cfg(feature = "extra-attrs")]
24712        let mut extra_attrs = std::collections::HashMap::new();
24713        #[cfg(feature = "extra-children")]
24714        let mut extra_children = Vec::new();
24715        #[cfg(feature = "extra-children")]
24716        let mut child_idx: usize = 0;
24717
24718        // Parse attributes
24719        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24720            let val = String::from_utf8_lossy(&attr.value);
24721            match attr.key.local_name().as_ref() {
24722                b"count" => {
24723                    f_count = val.parse().ok();
24724                }
24725                #[cfg(feature = "extra-attrs")]
24726                unknown => {
24727                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24728                    extra_attrs.insert(key, val.into_owned());
24729                }
24730                #[cfg(not(feature = "extra-attrs"))]
24731                _ => {}
24732            }
24733        }
24734
24735        // Parse child elements
24736        if !is_empty {
24737            let mut buf = Vec::new();
24738            loop {
24739                match reader.read_event_into(&mut buf)? {
24740                    Event::Start(e) => {
24741                        match e.local_name().as_ref() {
24742                            b"mergeCell" => {
24743                                f_merge_cell.push(MergedCell::from_xml(reader, &e, false)?);
24744                                #[cfg(feature = "extra-children")]
24745                                {
24746                                    child_idx += 1;
24747                                }
24748                            }
24749                            #[cfg(feature = "extra-children")]
24750                            _ => {
24751                                // Capture unknown element for roundtrip
24752                                let elem = RawXmlElement::from_reader(reader, &e)?;
24753                                extra_children.push(PositionedNode::new(
24754                                    child_idx,
24755                                    RawXmlNode::Element(elem),
24756                                ));
24757                                child_idx += 1;
24758                            }
24759                            #[cfg(not(feature = "extra-children"))]
24760                            _ => {
24761                                // Skip unknown element
24762                                skip_element(reader)?;
24763                            }
24764                        }
24765                    }
24766                    Event::Empty(e) => {
24767                        match e.local_name().as_ref() {
24768                            b"mergeCell" => {
24769                                f_merge_cell.push(MergedCell::from_xml(reader, &e, true)?);
24770                                #[cfg(feature = "extra-children")]
24771                                {
24772                                    child_idx += 1;
24773                                }
24774                            }
24775                            #[cfg(feature = "extra-children")]
24776                            _ => {
24777                                // Capture unknown empty element for roundtrip
24778                                let elem = RawXmlElement::from_empty(&e);
24779                                extra_children.push(PositionedNode::new(
24780                                    child_idx,
24781                                    RawXmlNode::Element(elem),
24782                                ));
24783                                child_idx += 1;
24784                            }
24785                            #[cfg(not(feature = "extra-children"))]
24786                            _ => {}
24787                        }
24788                    }
24789                    Event::End(_) => break,
24790                    Event::Eof => break,
24791                    _ => {}
24792                }
24793                buf.clear();
24794            }
24795        }
24796
24797        Ok(Self {
24798            count: f_count,
24799            merge_cell: f_merge_cell,
24800            #[cfg(feature = "extra-attrs")]
24801            extra_attrs,
24802            #[cfg(feature = "extra-children")]
24803            extra_children,
24804        })
24805    }
24806}
24807
24808impl FromXml for MergedCell {
24809    fn from_xml<R: BufRead>(
24810        reader: &mut Reader<R>,
24811        start_tag: &BytesStart,
24812        is_empty: bool,
24813    ) -> Result<Self, ParseError> {
24814        let mut f_reference: Option<Reference> = None;
24815        #[cfg(feature = "extra-attrs")]
24816        let mut extra_attrs = std::collections::HashMap::new();
24817
24818        // Parse attributes
24819        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24820            let val = String::from_utf8_lossy(&attr.value);
24821            match attr.key.local_name().as_ref() {
24822                b"ref" => {
24823                    f_reference = Some(val.into_owned());
24824                }
24825                #[cfg(feature = "extra-attrs")]
24826                unknown => {
24827                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24828                    extra_attrs.insert(key, val.into_owned());
24829                }
24830                #[cfg(not(feature = "extra-attrs"))]
24831                _ => {}
24832            }
24833        }
24834
24835        if !is_empty {
24836            let mut buf = Vec::new();
24837            loop {
24838                match reader.read_event_into(&mut buf)? {
24839                    Event::End(_) => break,
24840                    Event::Eof => break,
24841                    _ => {}
24842                }
24843                buf.clear();
24844            }
24845        }
24846
24847        Ok(Self {
24848            reference: f_reference
24849                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
24850            #[cfg(feature = "extra-attrs")]
24851            extra_attrs,
24852        })
24853    }
24854}
24855
24856impl FromXml for SmartTags {
24857    fn from_xml<R: BufRead>(
24858        reader: &mut Reader<R>,
24859        start_tag: &BytesStart,
24860        is_empty: bool,
24861    ) -> Result<Self, ParseError> {
24862        let mut f_cell_smart_tags = Vec::new();
24863        #[cfg(feature = "extra-children")]
24864        let mut extra_children = Vec::new();
24865        #[cfg(feature = "extra-children")]
24866        let mut child_idx: usize = 0;
24867
24868        // Parse child elements
24869        if !is_empty {
24870            let mut buf = Vec::new();
24871            loop {
24872                match reader.read_event_into(&mut buf)? {
24873                    Event::Start(e) => {
24874                        match e.local_name().as_ref() {
24875                            b"cellSmartTags" => {
24876                                f_cell_smart_tags.push(CellSmartTags::from_xml(reader, &e, false)?);
24877                                #[cfg(feature = "extra-children")]
24878                                {
24879                                    child_idx += 1;
24880                                }
24881                            }
24882                            #[cfg(feature = "extra-children")]
24883                            _ => {
24884                                // Capture unknown element for roundtrip
24885                                let elem = RawXmlElement::from_reader(reader, &e)?;
24886                                extra_children.push(PositionedNode::new(
24887                                    child_idx,
24888                                    RawXmlNode::Element(elem),
24889                                ));
24890                                child_idx += 1;
24891                            }
24892                            #[cfg(not(feature = "extra-children"))]
24893                            _ => {
24894                                // Skip unknown element
24895                                skip_element(reader)?;
24896                            }
24897                        }
24898                    }
24899                    Event::Empty(e) => {
24900                        match e.local_name().as_ref() {
24901                            b"cellSmartTags" => {
24902                                f_cell_smart_tags.push(CellSmartTags::from_xml(reader, &e, true)?);
24903                                #[cfg(feature = "extra-children")]
24904                                {
24905                                    child_idx += 1;
24906                                }
24907                            }
24908                            #[cfg(feature = "extra-children")]
24909                            _ => {
24910                                // Capture unknown empty element for roundtrip
24911                                let elem = RawXmlElement::from_empty(&e);
24912                                extra_children.push(PositionedNode::new(
24913                                    child_idx,
24914                                    RawXmlNode::Element(elem),
24915                                ));
24916                                child_idx += 1;
24917                            }
24918                            #[cfg(not(feature = "extra-children"))]
24919                            _ => {}
24920                        }
24921                    }
24922                    Event::End(_) => break,
24923                    Event::Eof => break,
24924                    _ => {}
24925                }
24926                buf.clear();
24927            }
24928        }
24929
24930        Ok(Self {
24931            cell_smart_tags: f_cell_smart_tags,
24932            #[cfg(feature = "extra-children")]
24933            extra_children,
24934        })
24935    }
24936}
24937
24938impl FromXml for CellSmartTags {
24939    fn from_xml<R: BufRead>(
24940        reader: &mut Reader<R>,
24941        start_tag: &BytesStart,
24942        is_empty: bool,
24943    ) -> Result<Self, ParseError> {
24944        let mut f_reference: Option<CellRef> = None;
24945        let mut f_cell_smart_tag = Vec::new();
24946        #[cfg(feature = "extra-attrs")]
24947        let mut extra_attrs = std::collections::HashMap::new();
24948        #[cfg(feature = "extra-children")]
24949        let mut extra_children = Vec::new();
24950        #[cfg(feature = "extra-children")]
24951        let mut child_idx: usize = 0;
24952
24953        // Parse attributes
24954        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
24955            let val = String::from_utf8_lossy(&attr.value);
24956            match attr.key.local_name().as_ref() {
24957                b"r" => {
24958                    f_reference = Some(val.into_owned());
24959                }
24960                #[cfg(feature = "extra-attrs")]
24961                unknown => {
24962                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
24963                    extra_attrs.insert(key, val.into_owned());
24964                }
24965                #[cfg(not(feature = "extra-attrs"))]
24966                _ => {}
24967            }
24968        }
24969
24970        // Parse child elements
24971        if !is_empty {
24972            let mut buf = Vec::new();
24973            loop {
24974                match reader.read_event_into(&mut buf)? {
24975                    Event::Start(e) => {
24976                        match e.local_name().as_ref() {
24977                            b"cellSmartTag" => {
24978                                f_cell_smart_tag.push(CellSmartTag::from_xml(reader, &e, false)?);
24979                                #[cfg(feature = "extra-children")]
24980                                {
24981                                    child_idx += 1;
24982                                }
24983                            }
24984                            #[cfg(feature = "extra-children")]
24985                            _ => {
24986                                // Capture unknown element for roundtrip
24987                                let elem = RawXmlElement::from_reader(reader, &e)?;
24988                                extra_children.push(PositionedNode::new(
24989                                    child_idx,
24990                                    RawXmlNode::Element(elem),
24991                                ));
24992                                child_idx += 1;
24993                            }
24994                            #[cfg(not(feature = "extra-children"))]
24995                            _ => {
24996                                // Skip unknown element
24997                                skip_element(reader)?;
24998                            }
24999                        }
25000                    }
25001                    Event::Empty(e) => {
25002                        match e.local_name().as_ref() {
25003                            b"cellSmartTag" => {
25004                                f_cell_smart_tag.push(CellSmartTag::from_xml(reader, &e, true)?);
25005                                #[cfg(feature = "extra-children")]
25006                                {
25007                                    child_idx += 1;
25008                                }
25009                            }
25010                            #[cfg(feature = "extra-children")]
25011                            _ => {
25012                                // Capture unknown empty element for roundtrip
25013                                let elem = RawXmlElement::from_empty(&e);
25014                                extra_children.push(PositionedNode::new(
25015                                    child_idx,
25016                                    RawXmlNode::Element(elem),
25017                                ));
25018                                child_idx += 1;
25019                            }
25020                            #[cfg(not(feature = "extra-children"))]
25021                            _ => {}
25022                        }
25023                    }
25024                    Event::End(_) => break,
25025                    Event::Eof => break,
25026                    _ => {}
25027                }
25028                buf.clear();
25029            }
25030        }
25031
25032        Ok(Self {
25033            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
25034            cell_smart_tag: f_cell_smart_tag,
25035            #[cfg(feature = "extra-attrs")]
25036            extra_attrs,
25037            #[cfg(feature = "extra-children")]
25038            extra_children,
25039        })
25040    }
25041}
25042
25043impl FromXml for CellSmartTag {
25044    fn from_xml<R: BufRead>(
25045        reader: &mut Reader<R>,
25046        start_tag: &BytesStart,
25047        is_empty: bool,
25048    ) -> Result<Self, ParseError> {
25049        let mut f_type: Option<u32> = None;
25050        let mut f_deleted = None;
25051        let mut f_xml_based = None;
25052        let mut f_cell_smart_tag_pr = Vec::new();
25053        #[cfg(feature = "extra-attrs")]
25054        let mut extra_attrs = std::collections::HashMap::new();
25055        #[cfg(feature = "extra-children")]
25056        let mut extra_children = Vec::new();
25057        #[cfg(feature = "extra-children")]
25058        let mut child_idx: usize = 0;
25059
25060        // Parse attributes
25061        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25062            let val = String::from_utf8_lossy(&attr.value);
25063            match attr.key.local_name().as_ref() {
25064                b"type" => {
25065                    f_type = val.parse().ok();
25066                }
25067                b"deleted" => {
25068                    f_deleted = Some(val == "true" || val == "1");
25069                }
25070                b"xmlBased" => {
25071                    f_xml_based = Some(val == "true" || val == "1");
25072                }
25073                #[cfg(feature = "extra-attrs")]
25074                unknown => {
25075                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25076                    extra_attrs.insert(key, val.into_owned());
25077                }
25078                #[cfg(not(feature = "extra-attrs"))]
25079                _ => {}
25080            }
25081        }
25082
25083        // Parse child elements
25084        if !is_empty {
25085            let mut buf = Vec::new();
25086            loop {
25087                match reader.read_event_into(&mut buf)? {
25088                    Event::Start(e) => {
25089                        match e.local_name().as_ref() {
25090                            b"cellSmartTagPr" => {
25091                                f_cell_smart_tag_pr
25092                                    .push(CTCellSmartTagPr::from_xml(reader, &e, false)?);
25093                                #[cfg(feature = "extra-children")]
25094                                {
25095                                    child_idx += 1;
25096                                }
25097                            }
25098                            #[cfg(feature = "extra-children")]
25099                            _ => {
25100                                // Capture unknown element for roundtrip
25101                                let elem = RawXmlElement::from_reader(reader, &e)?;
25102                                extra_children.push(PositionedNode::new(
25103                                    child_idx,
25104                                    RawXmlNode::Element(elem),
25105                                ));
25106                                child_idx += 1;
25107                            }
25108                            #[cfg(not(feature = "extra-children"))]
25109                            _ => {
25110                                // Skip unknown element
25111                                skip_element(reader)?;
25112                            }
25113                        }
25114                    }
25115                    Event::Empty(e) => {
25116                        match e.local_name().as_ref() {
25117                            b"cellSmartTagPr" => {
25118                                f_cell_smart_tag_pr
25119                                    .push(CTCellSmartTagPr::from_xml(reader, &e, true)?);
25120                                #[cfg(feature = "extra-children")]
25121                                {
25122                                    child_idx += 1;
25123                                }
25124                            }
25125                            #[cfg(feature = "extra-children")]
25126                            _ => {
25127                                // Capture unknown empty element for roundtrip
25128                                let elem = RawXmlElement::from_empty(&e);
25129                                extra_children.push(PositionedNode::new(
25130                                    child_idx,
25131                                    RawXmlNode::Element(elem),
25132                                ));
25133                                child_idx += 1;
25134                            }
25135                            #[cfg(not(feature = "extra-children"))]
25136                            _ => {}
25137                        }
25138                    }
25139                    Event::End(_) => break,
25140                    Event::Eof => break,
25141                    _ => {}
25142                }
25143                buf.clear();
25144            }
25145        }
25146
25147        Ok(Self {
25148            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
25149            deleted: f_deleted,
25150            xml_based: f_xml_based,
25151            cell_smart_tag_pr: f_cell_smart_tag_pr,
25152            #[cfg(feature = "extra-attrs")]
25153            extra_attrs,
25154            #[cfg(feature = "extra-children")]
25155            extra_children,
25156        })
25157    }
25158}
25159
25160impl FromXml for CTCellSmartTagPr {
25161    fn from_xml<R: BufRead>(
25162        reader: &mut Reader<R>,
25163        start_tag: &BytesStart,
25164        is_empty: bool,
25165    ) -> Result<Self, ParseError> {
25166        let mut f_key: Option<XmlString> = None;
25167        let mut f_value: Option<XmlString> = None;
25168        #[cfg(feature = "extra-attrs")]
25169        let mut extra_attrs = std::collections::HashMap::new();
25170
25171        // Parse attributes
25172        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25173            let val = String::from_utf8_lossy(&attr.value);
25174            match attr.key.local_name().as_ref() {
25175                b"key" => {
25176                    f_key = Some(val.into_owned());
25177                }
25178                b"val" => {
25179                    f_value = Some(val.into_owned());
25180                }
25181                #[cfg(feature = "extra-attrs")]
25182                unknown => {
25183                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25184                    extra_attrs.insert(key, val.into_owned());
25185                }
25186                #[cfg(not(feature = "extra-attrs"))]
25187                _ => {}
25188            }
25189        }
25190
25191        if !is_empty {
25192            let mut buf = Vec::new();
25193            loop {
25194                match reader.read_event_into(&mut buf)? {
25195                    Event::End(_) => break,
25196                    Event::Eof => break,
25197                    _ => {}
25198                }
25199                buf.clear();
25200            }
25201        }
25202
25203        Ok(Self {
25204            key: f_key.ok_or_else(|| ParseError::MissingAttribute("key".to_string()))?,
25205            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
25206            #[cfg(feature = "extra-attrs")]
25207            extra_attrs,
25208        })
25209    }
25210}
25211
25212impl FromXml for Drawing {
25213    fn from_xml<R: BufRead>(
25214        reader: &mut Reader<R>,
25215        start_tag: &BytesStart,
25216        is_empty: bool,
25217    ) -> Result<Self, ParseError> {
25218        let mut f_id: Option<STRelationshipId> = None;
25219        #[cfg(feature = "extra-attrs")]
25220        let mut extra_attrs = std::collections::HashMap::new();
25221
25222        // Parse attributes
25223        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25224            let val = String::from_utf8_lossy(&attr.value);
25225            match attr.key.local_name().as_ref() {
25226                b"id" => {
25227                    f_id = Some(val.into_owned());
25228                }
25229                #[cfg(feature = "extra-attrs")]
25230                unknown => {
25231                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25232                    extra_attrs.insert(key, val.into_owned());
25233                }
25234                #[cfg(not(feature = "extra-attrs"))]
25235                _ => {}
25236            }
25237        }
25238
25239        if !is_empty {
25240            let mut buf = Vec::new();
25241            loop {
25242                match reader.read_event_into(&mut buf)? {
25243                    Event::End(_) => break,
25244                    Event::Eof => break,
25245                    _ => {}
25246                }
25247                buf.clear();
25248            }
25249        }
25250
25251        Ok(Self {
25252            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
25253            #[cfg(feature = "extra-attrs")]
25254            extra_attrs,
25255        })
25256    }
25257}
25258
25259impl FromXml for LegacyDrawing {
25260    fn from_xml<R: BufRead>(
25261        reader: &mut Reader<R>,
25262        start_tag: &BytesStart,
25263        is_empty: bool,
25264    ) -> Result<Self, ParseError> {
25265        let mut f_id: Option<STRelationshipId> = None;
25266        #[cfg(feature = "extra-attrs")]
25267        let mut extra_attrs = std::collections::HashMap::new();
25268
25269        // Parse attributes
25270        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25271            let val = String::from_utf8_lossy(&attr.value);
25272            match attr.key.local_name().as_ref() {
25273                b"id" => {
25274                    f_id = Some(val.into_owned());
25275                }
25276                #[cfg(feature = "extra-attrs")]
25277                unknown => {
25278                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25279                    extra_attrs.insert(key, val.into_owned());
25280                }
25281                #[cfg(not(feature = "extra-attrs"))]
25282                _ => {}
25283            }
25284        }
25285
25286        if !is_empty {
25287            let mut buf = Vec::new();
25288            loop {
25289                match reader.read_event_into(&mut buf)? {
25290                    Event::End(_) => break,
25291                    Event::Eof => break,
25292                    _ => {}
25293                }
25294                buf.clear();
25295            }
25296        }
25297
25298        Ok(Self {
25299            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
25300            #[cfg(feature = "extra-attrs")]
25301            extra_attrs,
25302        })
25303    }
25304}
25305
25306impl FromXml for DrawingHeaderFooter {
25307    fn from_xml<R: BufRead>(
25308        reader: &mut Reader<R>,
25309        start_tag: &BytesStart,
25310        is_empty: bool,
25311    ) -> Result<Self, ParseError> {
25312        let mut f_id: Option<STRelationshipId> = None;
25313        let mut f_lho = None;
25314        let mut f_lhe = None;
25315        let mut f_lhf = None;
25316        let mut f_cho = None;
25317        let mut f_che = None;
25318        let mut f_chf = None;
25319        let mut f_rho = None;
25320        let mut f_rhe = None;
25321        let mut f_rhf = None;
25322        let mut f_lfo = None;
25323        let mut f_lfe = None;
25324        let mut f_lff = None;
25325        let mut f_cfo = None;
25326        let mut f_cfe = None;
25327        let mut f_cff = None;
25328        let mut f_rfo = None;
25329        let mut f_rfe = None;
25330        let mut f_rff = None;
25331        #[cfg(feature = "extra-attrs")]
25332        let mut extra_attrs = std::collections::HashMap::new();
25333
25334        // Parse attributes
25335        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25336            let val = String::from_utf8_lossy(&attr.value);
25337            match attr.key.local_name().as_ref() {
25338                b"id" => {
25339                    f_id = Some(val.into_owned());
25340                }
25341                b"lho" => {
25342                    f_lho = val.parse().ok();
25343                }
25344                b"lhe" => {
25345                    f_lhe = val.parse().ok();
25346                }
25347                b"lhf" => {
25348                    f_lhf = val.parse().ok();
25349                }
25350                b"cho" => {
25351                    f_cho = val.parse().ok();
25352                }
25353                b"che" => {
25354                    f_che = val.parse().ok();
25355                }
25356                b"chf" => {
25357                    f_chf = val.parse().ok();
25358                }
25359                b"rho" => {
25360                    f_rho = val.parse().ok();
25361                }
25362                b"rhe" => {
25363                    f_rhe = val.parse().ok();
25364                }
25365                b"rhf" => {
25366                    f_rhf = val.parse().ok();
25367                }
25368                b"lfo" => {
25369                    f_lfo = val.parse().ok();
25370                }
25371                b"lfe" => {
25372                    f_lfe = val.parse().ok();
25373                }
25374                b"lff" => {
25375                    f_lff = val.parse().ok();
25376                }
25377                b"cfo" => {
25378                    f_cfo = val.parse().ok();
25379                }
25380                b"cfe" => {
25381                    f_cfe = val.parse().ok();
25382                }
25383                b"cff" => {
25384                    f_cff = val.parse().ok();
25385                }
25386                b"rfo" => {
25387                    f_rfo = val.parse().ok();
25388                }
25389                b"rfe" => {
25390                    f_rfe = val.parse().ok();
25391                }
25392                b"rff" => {
25393                    f_rff = val.parse().ok();
25394                }
25395                #[cfg(feature = "extra-attrs")]
25396                unknown => {
25397                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25398                    extra_attrs.insert(key, val.into_owned());
25399                }
25400                #[cfg(not(feature = "extra-attrs"))]
25401                _ => {}
25402            }
25403        }
25404
25405        if !is_empty {
25406            let mut buf = Vec::new();
25407            loop {
25408                match reader.read_event_into(&mut buf)? {
25409                    Event::End(_) => break,
25410                    Event::Eof => break,
25411                    _ => {}
25412                }
25413                buf.clear();
25414            }
25415        }
25416
25417        Ok(Self {
25418            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
25419            lho: f_lho,
25420            lhe: f_lhe,
25421            lhf: f_lhf,
25422            cho: f_cho,
25423            che: f_che,
25424            chf: f_chf,
25425            rho: f_rho,
25426            rhe: f_rhe,
25427            rhf: f_rhf,
25428            lfo: f_lfo,
25429            lfe: f_lfe,
25430            lff: f_lff,
25431            cfo: f_cfo,
25432            cfe: f_cfe,
25433            cff: f_cff,
25434            rfo: f_rfo,
25435            rfe: f_rfe,
25436            rff: f_rff,
25437            #[cfg(feature = "extra-attrs")]
25438            extra_attrs,
25439        })
25440    }
25441}
25442
25443impl FromXml for CustomSheetViews {
25444    fn from_xml<R: BufRead>(
25445        reader: &mut Reader<R>,
25446        start_tag: &BytesStart,
25447        is_empty: bool,
25448    ) -> Result<Self, ParseError> {
25449        let mut f_custom_sheet_view = Vec::new();
25450        #[cfg(feature = "extra-children")]
25451        let mut extra_children = Vec::new();
25452        #[cfg(feature = "extra-children")]
25453        let mut child_idx: usize = 0;
25454
25455        // Parse child elements
25456        if !is_empty {
25457            let mut buf = Vec::new();
25458            loop {
25459                match reader.read_event_into(&mut buf)? {
25460                    Event::Start(e) => {
25461                        match e.local_name().as_ref() {
25462                            b"customSheetView" => {
25463                                f_custom_sheet_view
25464                                    .push(CustomSheetView::from_xml(reader, &e, false)?);
25465                                #[cfg(feature = "extra-children")]
25466                                {
25467                                    child_idx += 1;
25468                                }
25469                            }
25470                            #[cfg(feature = "extra-children")]
25471                            _ => {
25472                                // Capture unknown element for roundtrip
25473                                let elem = RawXmlElement::from_reader(reader, &e)?;
25474                                extra_children.push(PositionedNode::new(
25475                                    child_idx,
25476                                    RawXmlNode::Element(elem),
25477                                ));
25478                                child_idx += 1;
25479                            }
25480                            #[cfg(not(feature = "extra-children"))]
25481                            _ => {
25482                                // Skip unknown element
25483                                skip_element(reader)?;
25484                            }
25485                        }
25486                    }
25487                    Event::Empty(e) => {
25488                        match e.local_name().as_ref() {
25489                            b"customSheetView" => {
25490                                f_custom_sheet_view
25491                                    .push(CustomSheetView::from_xml(reader, &e, true)?);
25492                                #[cfg(feature = "extra-children")]
25493                                {
25494                                    child_idx += 1;
25495                                }
25496                            }
25497                            #[cfg(feature = "extra-children")]
25498                            _ => {
25499                                // Capture unknown empty element for roundtrip
25500                                let elem = RawXmlElement::from_empty(&e);
25501                                extra_children.push(PositionedNode::new(
25502                                    child_idx,
25503                                    RawXmlNode::Element(elem),
25504                                ));
25505                                child_idx += 1;
25506                            }
25507                            #[cfg(not(feature = "extra-children"))]
25508                            _ => {}
25509                        }
25510                    }
25511                    Event::End(_) => break,
25512                    Event::Eof => break,
25513                    _ => {}
25514                }
25515                buf.clear();
25516            }
25517        }
25518
25519        Ok(Self {
25520            custom_sheet_view: f_custom_sheet_view,
25521            #[cfg(feature = "extra-children")]
25522            extra_children,
25523        })
25524    }
25525}
25526
25527impl FromXml for CustomSheetView {
25528    fn from_xml<R: BufRead>(
25529        reader: &mut Reader<R>,
25530        start_tag: &BytesStart,
25531        is_empty: bool,
25532    ) -> Result<Self, ParseError> {
25533        let mut f_guid: Option<Guid> = None;
25534        let mut f_scale = None;
25535        let mut f_color_id = None;
25536        let mut f_show_page_breaks = None;
25537        let mut f_show_formulas = None;
25538        let mut f_show_grid_lines = None;
25539        let mut f_show_row_col = None;
25540        let mut f_outline_symbols = None;
25541        let mut f_zero_values = None;
25542        let mut f_fit_to_page = None;
25543        let mut f_print_area = None;
25544        let mut f_filter = None;
25545        let mut f_show_auto_filter = None;
25546        let mut f_hidden_rows = None;
25547        let mut f_hidden_columns = None;
25548        let mut f_state = None;
25549        let mut f_filter_unique = None;
25550        let mut f_view = None;
25551        let mut f_show_ruler = None;
25552        let mut f_top_left_cell = None;
25553        let mut f_pane = None;
25554        let mut f_selection = None;
25555        let mut f_row_breaks = None;
25556        let mut f_col_breaks = None;
25557        let mut f_page_margins = None;
25558        let mut f_print_options = None;
25559        let mut f_page_setup = None;
25560        let mut f_header_footer = None;
25561        let mut f_auto_filter = None;
25562        let mut f_extension_list = None;
25563        #[cfg(feature = "extra-attrs")]
25564        let mut extra_attrs = std::collections::HashMap::new();
25565        #[cfg(feature = "extra-children")]
25566        let mut extra_children = Vec::new();
25567        #[cfg(feature = "extra-children")]
25568        let mut child_idx: usize = 0;
25569
25570        // Parse attributes
25571        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25572            let val = String::from_utf8_lossy(&attr.value);
25573            match attr.key.local_name().as_ref() {
25574                b"guid" => {
25575                    f_guid = Some(val.into_owned());
25576                }
25577                b"scale" => {
25578                    f_scale = val.parse().ok();
25579                }
25580                b"colorId" => {
25581                    f_color_id = val.parse().ok();
25582                }
25583                b"showPageBreaks" => {
25584                    f_show_page_breaks = Some(val == "true" || val == "1");
25585                }
25586                b"showFormulas" => {
25587                    f_show_formulas = Some(val == "true" || val == "1");
25588                }
25589                b"showGridLines" => {
25590                    f_show_grid_lines = Some(val == "true" || val == "1");
25591                }
25592                b"showRowCol" => {
25593                    f_show_row_col = Some(val == "true" || val == "1");
25594                }
25595                b"outlineSymbols" => {
25596                    f_outline_symbols = Some(val == "true" || val == "1");
25597                }
25598                b"zeroValues" => {
25599                    f_zero_values = Some(val == "true" || val == "1");
25600                }
25601                b"fitToPage" => {
25602                    f_fit_to_page = Some(val == "true" || val == "1");
25603                }
25604                b"printArea" => {
25605                    f_print_area = Some(val == "true" || val == "1");
25606                }
25607                b"filter" => {
25608                    f_filter = Some(val == "true" || val == "1");
25609                }
25610                b"showAutoFilter" => {
25611                    f_show_auto_filter = Some(val == "true" || val == "1");
25612                }
25613                b"hiddenRows" => {
25614                    f_hidden_rows = Some(val == "true" || val == "1");
25615                }
25616                b"hiddenColumns" => {
25617                    f_hidden_columns = Some(val == "true" || val == "1");
25618                }
25619                b"state" => {
25620                    f_state = val.parse().ok();
25621                }
25622                b"filterUnique" => {
25623                    f_filter_unique = Some(val == "true" || val == "1");
25624                }
25625                b"view" => {
25626                    f_view = val.parse().ok();
25627                }
25628                b"showRuler" => {
25629                    f_show_ruler = Some(val == "true" || val == "1");
25630                }
25631                b"topLeftCell" => {
25632                    f_top_left_cell = Some(val.into_owned());
25633                }
25634                #[cfg(feature = "extra-attrs")]
25635                unknown => {
25636                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25637                    extra_attrs.insert(key, val.into_owned());
25638                }
25639                #[cfg(not(feature = "extra-attrs"))]
25640                _ => {}
25641            }
25642        }
25643
25644        // Parse child elements
25645        if !is_empty {
25646            let mut buf = Vec::new();
25647            loop {
25648                match reader.read_event_into(&mut buf)? {
25649                    Event::Start(e) => {
25650                        match e.local_name().as_ref() {
25651                            b"pane" => {
25652                                f_pane = Some(Box::new(Pane::from_xml(reader, &e, false)?));
25653                                #[cfg(feature = "extra-children")]
25654                                {
25655                                    child_idx += 1;
25656                                }
25657                            }
25658                            b"selection" => {
25659                                f_selection =
25660                                    Some(Box::new(Selection::from_xml(reader, &e, false)?));
25661                                #[cfg(feature = "extra-children")]
25662                                {
25663                                    child_idx += 1;
25664                                }
25665                            }
25666                            b"rowBreaks" => {
25667                                f_row_breaks =
25668                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
25669                                #[cfg(feature = "extra-children")]
25670                                {
25671                                    child_idx += 1;
25672                                }
25673                            }
25674                            b"colBreaks" => {
25675                                f_col_breaks =
25676                                    Some(Box::new(PageBreaks::from_xml(reader, &e, false)?));
25677                                #[cfg(feature = "extra-children")]
25678                                {
25679                                    child_idx += 1;
25680                                }
25681                            }
25682                            b"pageMargins" => {
25683                                f_page_margins =
25684                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
25685                                #[cfg(feature = "extra-children")]
25686                                {
25687                                    child_idx += 1;
25688                                }
25689                            }
25690                            b"printOptions" => {
25691                                f_print_options =
25692                                    Some(Box::new(PrintOptions::from_xml(reader, &e, false)?));
25693                                #[cfg(feature = "extra-children")]
25694                                {
25695                                    child_idx += 1;
25696                                }
25697                            }
25698                            b"pageSetup" => {
25699                                f_page_setup =
25700                                    Some(Box::new(PageSetup::from_xml(reader, &e, false)?));
25701                                #[cfg(feature = "extra-children")]
25702                                {
25703                                    child_idx += 1;
25704                                }
25705                            }
25706                            b"headerFooter" => {
25707                                f_header_footer =
25708                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
25709                                #[cfg(feature = "extra-children")]
25710                                {
25711                                    child_idx += 1;
25712                                }
25713                            }
25714                            b"autoFilter" => {
25715                                f_auto_filter =
25716                                    Some(Box::new(AutoFilter::from_xml(reader, &e, false)?));
25717                                #[cfg(feature = "extra-children")]
25718                                {
25719                                    child_idx += 1;
25720                                }
25721                            }
25722                            b"extLst" => {
25723                                f_extension_list =
25724                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
25725                                #[cfg(feature = "extra-children")]
25726                                {
25727                                    child_idx += 1;
25728                                }
25729                            }
25730                            #[cfg(feature = "extra-children")]
25731                            _ => {
25732                                // Capture unknown element for roundtrip
25733                                let elem = RawXmlElement::from_reader(reader, &e)?;
25734                                extra_children.push(PositionedNode::new(
25735                                    child_idx,
25736                                    RawXmlNode::Element(elem),
25737                                ));
25738                                child_idx += 1;
25739                            }
25740                            #[cfg(not(feature = "extra-children"))]
25741                            _ => {
25742                                // Skip unknown element
25743                                skip_element(reader)?;
25744                            }
25745                        }
25746                    }
25747                    Event::Empty(e) => {
25748                        match e.local_name().as_ref() {
25749                            b"pane" => {
25750                                f_pane = Some(Box::new(Pane::from_xml(reader, &e, true)?));
25751                                #[cfg(feature = "extra-children")]
25752                                {
25753                                    child_idx += 1;
25754                                }
25755                            }
25756                            b"selection" => {
25757                                f_selection =
25758                                    Some(Box::new(Selection::from_xml(reader, &e, true)?));
25759                                #[cfg(feature = "extra-children")]
25760                                {
25761                                    child_idx += 1;
25762                                }
25763                            }
25764                            b"rowBreaks" => {
25765                                f_row_breaks =
25766                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
25767                                #[cfg(feature = "extra-children")]
25768                                {
25769                                    child_idx += 1;
25770                                }
25771                            }
25772                            b"colBreaks" => {
25773                                f_col_breaks =
25774                                    Some(Box::new(PageBreaks::from_xml(reader, &e, true)?));
25775                                #[cfg(feature = "extra-children")]
25776                                {
25777                                    child_idx += 1;
25778                                }
25779                            }
25780                            b"pageMargins" => {
25781                                f_page_margins =
25782                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
25783                                #[cfg(feature = "extra-children")]
25784                                {
25785                                    child_idx += 1;
25786                                }
25787                            }
25788                            b"printOptions" => {
25789                                f_print_options =
25790                                    Some(Box::new(PrintOptions::from_xml(reader, &e, true)?));
25791                                #[cfg(feature = "extra-children")]
25792                                {
25793                                    child_idx += 1;
25794                                }
25795                            }
25796                            b"pageSetup" => {
25797                                f_page_setup =
25798                                    Some(Box::new(PageSetup::from_xml(reader, &e, true)?));
25799                                #[cfg(feature = "extra-children")]
25800                                {
25801                                    child_idx += 1;
25802                                }
25803                            }
25804                            b"headerFooter" => {
25805                                f_header_footer =
25806                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
25807                                #[cfg(feature = "extra-children")]
25808                                {
25809                                    child_idx += 1;
25810                                }
25811                            }
25812                            b"autoFilter" => {
25813                                f_auto_filter =
25814                                    Some(Box::new(AutoFilter::from_xml(reader, &e, true)?));
25815                                #[cfg(feature = "extra-children")]
25816                                {
25817                                    child_idx += 1;
25818                                }
25819                            }
25820                            b"extLst" => {
25821                                f_extension_list =
25822                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
25823                                #[cfg(feature = "extra-children")]
25824                                {
25825                                    child_idx += 1;
25826                                }
25827                            }
25828                            #[cfg(feature = "extra-children")]
25829                            _ => {
25830                                // Capture unknown empty element for roundtrip
25831                                let elem = RawXmlElement::from_empty(&e);
25832                                extra_children.push(PositionedNode::new(
25833                                    child_idx,
25834                                    RawXmlNode::Element(elem),
25835                                ));
25836                                child_idx += 1;
25837                            }
25838                            #[cfg(not(feature = "extra-children"))]
25839                            _ => {}
25840                        }
25841                    }
25842                    Event::End(_) => break,
25843                    Event::Eof => break,
25844                    _ => {}
25845                }
25846                buf.clear();
25847            }
25848        }
25849
25850        Ok(Self {
25851            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
25852            scale: f_scale,
25853            color_id: f_color_id,
25854            show_page_breaks: f_show_page_breaks,
25855            show_formulas: f_show_formulas,
25856            show_grid_lines: f_show_grid_lines,
25857            show_row_col: f_show_row_col,
25858            outline_symbols: f_outline_symbols,
25859            zero_values: f_zero_values,
25860            fit_to_page: f_fit_to_page,
25861            print_area: f_print_area,
25862            filter: f_filter,
25863            show_auto_filter: f_show_auto_filter,
25864            hidden_rows: f_hidden_rows,
25865            hidden_columns: f_hidden_columns,
25866            state: f_state,
25867            filter_unique: f_filter_unique,
25868            view: f_view,
25869            show_ruler: f_show_ruler,
25870            top_left_cell: f_top_left_cell,
25871            pane: f_pane,
25872            selection: f_selection,
25873            row_breaks: f_row_breaks,
25874            col_breaks: f_col_breaks,
25875            page_margins: f_page_margins,
25876            print_options: f_print_options,
25877            page_setup: f_page_setup,
25878            header_footer: f_header_footer,
25879            auto_filter: f_auto_filter,
25880            extension_list: f_extension_list,
25881            #[cfg(feature = "extra-attrs")]
25882            extra_attrs,
25883            #[cfg(feature = "extra-children")]
25884            extra_children,
25885        })
25886    }
25887}
25888
25889impl FromXml for DataValidations {
25890    fn from_xml<R: BufRead>(
25891        reader: &mut Reader<R>,
25892        start_tag: &BytesStart,
25893        is_empty: bool,
25894    ) -> Result<Self, ParseError> {
25895        let mut f_disable_prompts = None;
25896        let mut f_x_window = None;
25897        let mut f_y_window = None;
25898        let mut f_count = None;
25899        let mut f_data_validation = Vec::new();
25900        #[cfg(feature = "extra-attrs")]
25901        let mut extra_attrs = std::collections::HashMap::new();
25902        #[cfg(feature = "extra-children")]
25903        let mut extra_children = Vec::new();
25904        #[cfg(feature = "extra-children")]
25905        let mut child_idx: usize = 0;
25906
25907        // Parse attributes
25908        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
25909            let val = String::from_utf8_lossy(&attr.value);
25910            match attr.key.local_name().as_ref() {
25911                b"disablePrompts" => {
25912                    f_disable_prompts = Some(val == "true" || val == "1");
25913                }
25914                b"xWindow" => {
25915                    f_x_window = val.parse().ok();
25916                }
25917                b"yWindow" => {
25918                    f_y_window = val.parse().ok();
25919                }
25920                b"count" => {
25921                    f_count = val.parse().ok();
25922                }
25923                #[cfg(feature = "extra-attrs")]
25924                unknown => {
25925                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
25926                    extra_attrs.insert(key, val.into_owned());
25927                }
25928                #[cfg(not(feature = "extra-attrs"))]
25929                _ => {}
25930            }
25931        }
25932
25933        // Parse child elements
25934        if !is_empty {
25935            let mut buf = Vec::new();
25936            loop {
25937                match reader.read_event_into(&mut buf)? {
25938                    Event::Start(e) => {
25939                        match e.local_name().as_ref() {
25940                            b"dataValidation" => {
25941                                f_data_validation
25942                                    .push(DataValidation::from_xml(reader, &e, false)?);
25943                                #[cfg(feature = "extra-children")]
25944                                {
25945                                    child_idx += 1;
25946                                }
25947                            }
25948                            #[cfg(feature = "extra-children")]
25949                            _ => {
25950                                // Capture unknown element for roundtrip
25951                                let elem = RawXmlElement::from_reader(reader, &e)?;
25952                                extra_children.push(PositionedNode::new(
25953                                    child_idx,
25954                                    RawXmlNode::Element(elem),
25955                                ));
25956                                child_idx += 1;
25957                            }
25958                            #[cfg(not(feature = "extra-children"))]
25959                            _ => {
25960                                // Skip unknown element
25961                                skip_element(reader)?;
25962                            }
25963                        }
25964                    }
25965                    Event::Empty(e) => {
25966                        match e.local_name().as_ref() {
25967                            b"dataValidation" => {
25968                                f_data_validation.push(DataValidation::from_xml(reader, &e, true)?);
25969                                #[cfg(feature = "extra-children")]
25970                                {
25971                                    child_idx += 1;
25972                                }
25973                            }
25974                            #[cfg(feature = "extra-children")]
25975                            _ => {
25976                                // Capture unknown empty element for roundtrip
25977                                let elem = RawXmlElement::from_empty(&e);
25978                                extra_children.push(PositionedNode::new(
25979                                    child_idx,
25980                                    RawXmlNode::Element(elem),
25981                                ));
25982                                child_idx += 1;
25983                            }
25984                            #[cfg(not(feature = "extra-children"))]
25985                            _ => {}
25986                        }
25987                    }
25988                    Event::End(_) => break,
25989                    Event::Eof => break,
25990                    _ => {}
25991                }
25992                buf.clear();
25993            }
25994        }
25995
25996        Ok(Self {
25997            disable_prompts: f_disable_prompts,
25998            x_window: f_x_window,
25999            y_window: f_y_window,
26000            count: f_count,
26001            data_validation: f_data_validation,
26002            #[cfg(feature = "extra-attrs")]
26003            extra_attrs,
26004            #[cfg(feature = "extra-children")]
26005            extra_children,
26006        })
26007    }
26008}
26009
26010impl FromXml for DataValidation {
26011    fn from_xml<R: BufRead>(
26012        reader: &mut Reader<R>,
26013        start_tag: &BytesStart,
26014        is_empty: bool,
26015    ) -> Result<Self, ParseError> {
26016        #[cfg(feature = "sml-validation")]
26017        let mut f_type = None;
26018        #[cfg(feature = "sml-validation")]
26019        let mut f_error_style = None;
26020        #[cfg(feature = "sml-validation")]
26021        let mut f_ime_mode = None;
26022        #[cfg(feature = "sml-validation")]
26023        let mut f_operator = None;
26024        #[cfg(feature = "sml-validation")]
26025        let mut f_allow_blank = None;
26026        #[cfg(feature = "sml-validation")]
26027        let mut f_show_drop_down = None;
26028        #[cfg(feature = "sml-validation")]
26029        let mut f_show_input_message = None;
26030        #[cfg(feature = "sml-validation")]
26031        let mut f_show_error_message = None;
26032        #[cfg(feature = "sml-validation")]
26033        let mut f_error_title = None;
26034        #[cfg(feature = "sml-validation")]
26035        let mut f_error = None;
26036        #[cfg(feature = "sml-validation")]
26037        let mut f_prompt_title = None;
26038        #[cfg(feature = "sml-validation")]
26039        let mut f_prompt = None;
26040        #[cfg(feature = "sml-validation")]
26041        let mut f_square_reference: Option<SquareRef> = None;
26042        #[cfg(feature = "sml-validation")]
26043        let mut f_formula1 = None;
26044        #[cfg(feature = "sml-validation")]
26045        let mut f_formula2 = None;
26046        #[cfg(feature = "extra-attrs")]
26047        let mut extra_attrs = std::collections::HashMap::new();
26048        #[cfg(feature = "extra-children")]
26049        let mut extra_children = Vec::new();
26050        #[cfg(feature = "extra-children")]
26051        let mut child_idx: usize = 0;
26052
26053        // Parse attributes
26054        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
26055            let val = String::from_utf8_lossy(&attr.value);
26056            match attr.key.local_name().as_ref() {
26057                #[cfg(feature = "sml-validation")]
26058                b"type" => {
26059                    f_type = val.parse().ok();
26060                }
26061                #[cfg(feature = "sml-validation")]
26062                b"errorStyle" => {
26063                    f_error_style = val.parse().ok();
26064                }
26065                #[cfg(feature = "sml-validation")]
26066                b"imeMode" => {
26067                    f_ime_mode = val.parse().ok();
26068                }
26069                #[cfg(feature = "sml-validation")]
26070                b"operator" => {
26071                    f_operator = val.parse().ok();
26072                }
26073                #[cfg(feature = "sml-validation")]
26074                b"allowBlank" => {
26075                    f_allow_blank = Some(val == "true" || val == "1");
26076                }
26077                #[cfg(feature = "sml-validation")]
26078                b"showDropDown" => {
26079                    f_show_drop_down = Some(val == "true" || val == "1");
26080                }
26081                #[cfg(feature = "sml-validation")]
26082                b"showInputMessage" => {
26083                    f_show_input_message = Some(val == "true" || val == "1");
26084                }
26085                #[cfg(feature = "sml-validation")]
26086                b"showErrorMessage" => {
26087                    f_show_error_message = Some(val == "true" || val == "1");
26088                }
26089                #[cfg(feature = "sml-validation")]
26090                b"errorTitle" => {
26091                    f_error_title = Some(val.into_owned());
26092                }
26093                #[cfg(feature = "sml-validation")]
26094                b"error" => {
26095                    f_error = Some(val.into_owned());
26096                }
26097                #[cfg(feature = "sml-validation")]
26098                b"promptTitle" => {
26099                    f_prompt_title = Some(val.into_owned());
26100                }
26101                #[cfg(feature = "sml-validation")]
26102                b"prompt" => {
26103                    f_prompt = Some(val.into_owned());
26104                }
26105                #[cfg(feature = "sml-validation")]
26106                b"sqref" => {
26107                    f_square_reference = Some(val.into_owned());
26108                }
26109                #[cfg(feature = "extra-attrs")]
26110                unknown => {
26111                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
26112                    extra_attrs.insert(key, val.into_owned());
26113                }
26114                #[cfg(not(feature = "extra-attrs"))]
26115                _ => {}
26116            }
26117        }
26118
26119        // Parse child elements
26120        if !is_empty {
26121            let mut buf = Vec::new();
26122            loop {
26123                match reader.read_event_into(&mut buf)? {
26124                    Event::Start(e) => {
26125                        match e.local_name().as_ref() {
26126                            #[cfg(feature = "sml-validation")]
26127                            b"formula1" => {
26128                                f_formula1 = Some(read_text_content(reader)?);
26129                                #[cfg(feature = "extra-children")]
26130                                {
26131                                    child_idx += 1;
26132                                }
26133                            }
26134                            #[cfg(feature = "sml-validation")]
26135                            b"formula2" => {
26136                                f_formula2 = Some(read_text_content(reader)?);
26137                                #[cfg(feature = "extra-children")]
26138                                {
26139                                    child_idx += 1;
26140                                }
26141                            }
26142                            #[cfg(feature = "extra-children")]
26143                            _ => {
26144                                // Capture unknown element for roundtrip
26145                                let elem = RawXmlElement::from_reader(reader, &e)?;
26146                                extra_children.push(PositionedNode::new(
26147                                    child_idx,
26148                                    RawXmlNode::Element(elem),
26149                                ));
26150                                child_idx += 1;
26151                            }
26152                            #[cfg(not(feature = "extra-children"))]
26153                            _ => {
26154                                // Skip unknown element
26155                                skip_element(reader)?;
26156                            }
26157                        }
26158                    }
26159                    Event::Empty(e) => {
26160                        match e.local_name().as_ref() {
26161                            #[cfg(feature = "sml-validation")]
26162                            b"formula1" => {
26163                                f_formula1 = Some(String::new());
26164                                #[cfg(feature = "extra-children")]
26165                                {
26166                                    child_idx += 1;
26167                                }
26168                            }
26169                            #[cfg(feature = "sml-validation")]
26170                            b"formula2" => {
26171                                f_formula2 = Some(String::new());
26172                                #[cfg(feature = "extra-children")]
26173                                {
26174                                    child_idx += 1;
26175                                }
26176                            }
26177                            #[cfg(feature = "extra-children")]
26178                            _ => {
26179                                // Capture unknown empty element for roundtrip
26180                                let elem = RawXmlElement::from_empty(&e);
26181                                extra_children.push(PositionedNode::new(
26182                                    child_idx,
26183                                    RawXmlNode::Element(elem),
26184                                ));
26185                                child_idx += 1;
26186                            }
26187                            #[cfg(not(feature = "extra-children"))]
26188                            _ => {}
26189                        }
26190                    }
26191                    Event::End(_) => break,
26192                    Event::Eof => break,
26193                    _ => {}
26194                }
26195                buf.clear();
26196            }
26197        }
26198
26199        Ok(Self {
26200            #[cfg(feature = "sml-validation")]
26201            r#type: f_type,
26202            #[cfg(feature = "sml-validation")]
26203            error_style: f_error_style,
26204            #[cfg(feature = "sml-validation")]
26205            ime_mode: f_ime_mode,
26206            #[cfg(feature = "sml-validation")]
26207            operator: f_operator,
26208            #[cfg(feature = "sml-validation")]
26209            allow_blank: f_allow_blank,
26210            #[cfg(feature = "sml-validation")]
26211            show_drop_down: f_show_drop_down,
26212            #[cfg(feature = "sml-validation")]
26213            show_input_message: f_show_input_message,
26214            #[cfg(feature = "sml-validation")]
26215            show_error_message: f_show_error_message,
26216            #[cfg(feature = "sml-validation")]
26217            error_title: f_error_title,
26218            #[cfg(feature = "sml-validation")]
26219            error: f_error,
26220            #[cfg(feature = "sml-validation")]
26221            prompt_title: f_prompt_title,
26222            #[cfg(feature = "sml-validation")]
26223            prompt: f_prompt,
26224            #[cfg(feature = "sml-validation")]
26225            square_reference: f_square_reference
26226                .ok_or_else(|| ParseError::MissingAttribute("sqref".to_string()))?,
26227            #[cfg(feature = "sml-validation")]
26228            formula1: f_formula1,
26229            #[cfg(feature = "sml-validation")]
26230            formula2: f_formula2,
26231            #[cfg(feature = "extra-attrs")]
26232            extra_attrs,
26233            #[cfg(feature = "extra-children")]
26234            extra_children,
26235        })
26236    }
26237}
26238
26239impl FromXml for ConditionalFormatting {
26240    fn from_xml<R: BufRead>(
26241        reader: &mut Reader<R>,
26242        start_tag: &BytesStart,
26243        is_empty: bool,
26244    ) -> Result<Self, ParseError> {
26245        #[cfg(feature = "sml-pivot")]
26246        let mut f_pivot = None;
26247        #[cfg(feature = "sml-styling")]
26248        let mut f_square_reference = None;
26249        #[cfg(feature = "sml-styling")]
26250        let mut f_cf_rule = Vec::new();
26251        #[cfg(feature = "sml-extensions")]
26252        let mut f_extension_list = None;
26253        #[cfg(feature = "extra-attrs")]
26254        let mut extra_attrs = std::collections::HashMap::new();
26255        #[cfg(feature = "extra-children")]
26256        let mut extra_children = Vec::new();
26257        #[cfg(feature = "extra-children")]
26258        let mut child_idx: usize = 0;
26259
26260        // Parse attributes
26261        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
26262            let val = String::from_utf8_lossy(&attr.value);
26263            match attr.key.local_name().as_ref() {
26264                #[cfg(feature = "sml-pivot")]
26265                b"pivot" => {
26266                    f_pivot = Some(val == "true" || val == "1");
26267                }
26268                #[cfg(feature = "sml-styling")]
26269                b"sqref" => {
26270                    f_square_reference = Some(val.into_owned());
26271                }
26272                #[cfg(feature = "extra-attrs")]
26273                unknown => {
26274                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
26275                    extra_attrs.insert(key, val.into_owned());
26276                }
26277                #[cfg(not(feature = "extra-attrs"))]
26278                _ => {}
26279            }
26280        }
26281
26282        // Parse child elements
26283        if !is_empty {
26284            let mut buf = Vec::new();
26285            loop {
26286                match reader.read_event_into(&mut buf)? {
26287                    Event::Start(e) => {
26288                        match e.local_name().as_ref() {
26289                            #[cfg(feature = "sml-styling")]
26290                            b"cfRule" => {
26291                                f_cf_rule.push(ConditionalRule::from_xml(reader, &e, false)?);
26292                                #[cfg(feature = "extra-children")]
26293                                {
26294                                    child_idx += 1;
26295                                }
26296                            }
26297                            #[cfg(feature = "sml-extensions")]
26298                            b"extLst" => {
26299                                f_extension_list =
26300                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
26301                                #[cfg(feature = "extra-children")]
26302                                {
26303                                    child_idx += 1;
26304                                }
26305                            }
26306                            #[cfg(feature = "extra-children")]
26307                            _ => {
26308                                // Capture unknown element for roundtrip
26309                                let elem = RawXmlElement::from_reader(reader, &e)?;
26310                                extra_children.push(PositionedNode::new(
26311                                    child_idx,
26312                                    RawXmlNode::Element(elem),
26313                                ));
26314                                child_idx += 1;
26315                            }
26316                            #[cfg(not(feature = "extra-children"))]
26317                            _ => {
26318                                // Skip unknown element
26319                                skip_element(reader)?;
26320                            }
26321                        }
26322                    }
26323                    Event::Empty(e) => {
26324                        match e.local_name().as_ref() {
26325                            #[cfg(feature = "sml-styling")]
26326                            b"cfRule" => {
26327                                f_cf_rule.push(ConditionalRule::from_xml(reader, &e, true)?);
26328                                #[cfg(feature = "extra-children")]
26329                                {
26330                                    child_idx += 1;
26331                                }
26332                            }
26333                            #[cfg(feature = "sml-extensions")]
26334                            b"extLst" => {
26335                                f_extension_list =
26336                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
26337                                #[cfg(feature = "extra-children")]
26338                                {
26339                                    child_idx += 1;
26340                                }
26341                            }
26342                            #[cfg(feature = "extra-children")]
26343                            _ => {
26344                                // Capture unknown empty element for roundtrip
26345                                let elem = RawXmlElement::from_empty(&e);
26346                                extra_children.push(PositionedNode::new(
26347                                    child_idx,
26348                                    RawXmlNode::Element(elem),
26349                                ));
26350                                child_idx += 1;
26351                            }
26352                            #[cfg(not(feature = "extra-children"))]
26353                            _ => {}
26354                        }
26355                    }
26356                    Event::End(_) => break,
26357                    Event::Eof => break,
26358                    _ => {}
26359                }
26360                buf.clear();
26361            }
26362        }
26363
26364        Ok(Self {
26365            #[cfg(feature = "sml-pivot")]
26366            pivot: f_pivot,
26367            #[cfg(feature = "sml-styling")]
26368            square_reference: f_square_reference,
26369            #[cfg(feature = "sml-styling")]
26370            cf_rule: f_cf_rule,
26371            #[cfg(feature = "sml-extensions")]
26372            extension_list: f_extension_list,
26373            #[cfg(feature = "extra-attrs")]
26374            extra_attrs,
26375            #[cfg(feature = "extra-children")]
26376            extra_children,
26377        })
26378    }
26379}
26380
26381impl FromXml for ConditionalRule {
26382    fn from_xml<R: BufRead>(
26383        reader: &mut Reader<R>,
26384        start_tag: &BytesStart,
26385        is_empty: bool,
26386    ) -> Result<Self, ParseError> {
26387        #[cfg(feature = "sml-styling")]
26388        let mut f_type = None;
26389        #[cfg(feature = "sml-styling")]
26390        let mut f_dxf_id = None;
26391        #[cfg(feature = "sml-styling")]
26392        let mut f_priority: Option<i32> = None;
26393        #[cfg(feature = "sml-styling")]
26394        let mut f_stop_if_true = None;
26395        #[cfg(feature = "sml-styling")]
26396        let mut f_above_average = None;
26397        #[cfg(feature = "sml-styling")]
26398        let mut f_percent = None;
26399        #[cfg(feature = "sml-styling")]
26400        let mut f_bottom = None;
26401        #[cfg(feature = "sml-styling")]
26402        let mut f_operator = None;
26403        #[cfg(feature = "sml-styling")]
26404        let mut f_text = None;
26405        #[cfg(feature = "sml-styling")]
26406        let mut f_time_period = None;
26407        #[cfg(feature = "sml-styling")]
26408        let mut f_rank = None;
26409        #[cfg(feature = "sml-styling")]
26410        let mut f_std_dev = None;
26411        #[cfg(feature = "sml-styling")]
26412        let mut f_equal_average = None;
26413        #[cfg(feature = "sml-styling")]
26414        let mut f_formula = Vec::new();
26415        #[cfg(feature = "sml-styling")]
26416        let mut f_color_scale = None;
26417        #[cfg(feature = "sml-styling")]
26418        let mut f_data_bar = None;
26419        #[cfg(feature = "sml-styling")]
26420        let mut f_icon_set = None;
26421        #[cfg(feature = "sml-extensions")]
26422        let mut f_extension_list = None;
26423        #[cfg(feature = "extra-attrs")]
26424        let mut extra_attrs = std::collections::HashMap::new();
26425        #[cfg(feature = "extra-children")]
26426        let mut extra_children = Vec::new();
26427        #[cfg(feature = "extra-children")]
26428        let mut child_idx: usize = 0;
26429
26430        // Parse attributes
26431        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
26432            let val = String::from_utf8_lossy(&attr.value);
26433            match attr.key.local_name().as_ref() {
26434                #[cfg(feature = "sml-styling")]
26435                b"type" => {
26436                    f_type = val.parse().ok();
26437                }
26438                #[cfg(feature = "sml-styling")]
26439                b"dxfId" => {
26440                    f_dxf_id = val.parse().ok();
26441                }
26442                #[cfg(feature = "sml-styling")]
26443                b"priority" => {
26444                    f_priority = val.parse().ok();
26445                }
26446                #[cfg(feature = "sml-styling")]
26447                b"stopIfTrue" => {
26448                    f_stop_if_true = Some(val == "true" || val == "1");
26449                }
26450                #[cfg(feature = "sml-styling")]
26451                b"aboveAverage" => {
26452                    f_above_average = Some(val == "true" || val == "1");
26453                }
26454                #[cfg(feature = "sml-styling")]
26455                b"percent" => {
26456                    f_percent = Some(val == "true" || val == "1");
26457                }
26458                #[cfg(feature = "sml-styling")]
26459                b"bottom" => {
26460                    f_bottom = Some(val == "true" || val == "1");
26461                }
26462                #[cfg(feature = "sml-styling")]
26463                b"operator" => {
26464                    f_operator = val.parse().ok();
26465                }
26466                #[cfg(feature = "sml-styling")]
26467                b"text" => {
26468                    f_text = Some(val.into_owned());
26469                }
26470                #[cfg(feature = "sml-styling")]
26471                b"timePeriod" => {
26472                    f_time_period = val.parse().ok();
26473                }
26474                #[cfg(feature = "sml-styling")]
26475                b"rank" => {
26476                    f_rank = val.parse().ok();
26477                }
26478                #[cfg(feature = "sml-styling")]
26479                b"stdDev" => {
26480                    f_std_dev = val.parse().ok();
26481                }
26482                #[cfg(feature = "sml-styling")]
26483                b"equalAverage" => {
26484                    f_equal_average = Some(val == "true" || val == "1");
26485                }
26486                #[cfg(feature = "extra-attrs")]
26487                unknown => {
26488                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
26489                    extra_attrs.insert(key, val.into_owned());
26490                }
26491                #[cfg(not(feature = "extra-attrs"))]
26492                _ => {}
26493            }
26494        }
26495
26496        // Parse child elements
26497        if !is_empty {
26498            let mut buf = Vec::new();
26499            loop {
26500                match reader.read_event_into(&mut buf)? {
26501                    Event::Start(e) => {
26502                        match e.local_name().as_ref() {
26503                            #[cfg(feature = "sml-styling")]
26504                            b"formula" => {
26505                                f_formula.push(read_text_content(reader)?);
26506                                #[cfg(feature = "extra-children")]
26507                                {
26508                                    child_idx += 1;
26509                                }
26510                            }
26511                            #[cfg(feature = "sml-styling")]
26512                            b"colorScale" => {
26513                                f_color_scale =
26514                                    Some(Box::new(ColorScale::from_xml(reader, &e, false)?));
26515                                #[cfg(feature = "extra-children")]
26516                                {
26517                                    child_idx += 1;
26518                                }
26519                            }
26520                            #[cfg(feature = "sml-styling")]
26521                            b"dataBar" => {
26522                                f_data_bar = Some(Box::new(DataBar::from_xml(reader, &e, false)?));
26523                                #[cfg(feature = "extra-children")]
26524                                {
26525                                    child_idx += 1;
26526                                }
26527                            }
26528                            #[cfg(feature = "sml-styling")]
26529                            b"iconSet" => {
26530                                f_icon_set = Some(Box::new(IconSet::from_xml(reader, &e, false)?));
26531                                #[cfg(feature = "extra-children")]
26532                                {
26533                                    child_idx += 1;
26534                                }
26535                            }
26536                            #[cfg(feature = "sml-extensions")]
26537                            b"extLst" => {
26538                                f_extension_list =
26539                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
26540                                #[cfg(feature = "extra-children")]
26541                                {
26542                                    child_idx += 1;
26543                                }
26544                            }
26545                            #[cfg(feature = "extra-children")]
26546                            _ => {
26547                                // Capture unknown element for roundtrip
26548                                let elem = RawXmlElement::from_reader(reader, &e)?;
26549                                extra_children.push(PositionedNode::new(
26550                                    child_idx,
26551                                    RawXmlNode::Element(elem),
26552                                ));
26553                                child_idx += 1;
26554                            }
26555                            #[cfg(not(feature = "extra-children"))]
26556                            _ => {
26557                                // Skip unknown element
26558                                skip_element(reader)?;
26559                            }
26560                        }
26561                    }
26562                    Event::Empty(e) => {
26563                        match e.local_name().as_ref() {
26564                            #[cfg(feature = "sml-styling")]
26565                            b"formula" => {
26566                                f_formula.push(String::new());
26567                                #[cfg(feature = "extra-children")]
26568                                {
26569                                    child_idx += 1;
26570                                }
26571                            }
26572                            #[cfg(feature = "sml-styling")]
26573                            b"colorScale" => {
26574                                f_color_scale =
26575                                    Some(Box::new(ColorScale::from_xml(reader, &e, true)?));
26576                                #[cfg(feature = "extra-children")]
26577                                {
26578                                    child_idx += 1;
26579                                }
26580                            }
26581                            #[cfg(feature = "sml-styling")]
26582                            b"dataBar" => {
26583                                f_data_bar = Some(Box::new(DataBar::from_xml(reader, &e, true)?));
26584                                #[cfg(feature = "extra-children")]
26585                                {
26586                                    child_idx += 1;
26587                                }
26588                            }
26589                            #[cfg(feature = "sml-styling")]
26590                            b"iconSet" => {
26591                                f_icon_set = Some(Box::new(IconSet::from_xml(reader, &e, true)?));
26592                                #[cfg(feature = "extra-children")]
26593                                {
26594                                    child_idx += 1;
26595                                }
26596                            }
26597                            #[cfg(feature = "sml-extensions")]
26598                            b"extLst" => {
26599                                f_extension_list =
26600                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
26601                                #[cfg(feature = "extra-children")]
26602                                {
26603                                    child_idx += 1;
26604                                }
26605                            }
26606                            #[cfg(feature = "extra-children")]
26607                            _ => {
26608                                // Capture unknown empty element for roundtrip
26609                                let elem = RawXmlElement::from_empty(&e);
26610                                extra_children.push(PositionedNode::new(
26611                                    child_idx,
26612                                    RawXmlNode::Element(elem),
26613                                ));
26614                                child_idx += 1;
26615                            }
26616                            #[cfg(not(feature = "extra-children"))]
26617                            _ => {}
26618                        }
26619                    }
26620                    Event::End(_) => break,
26621                    Event::Eof => break,
26622                    _ => {}
26623                }
26624                buf.clear();
26625            }
26626        }
26627
26628        Ok(Self {
26629            #[cfg(feature = "sml-styling")]
26630            r#type: f_type,
26631            #[cfg(feature = "sml-styling")]
26632            dxf_id: f_dxf_id,
26633            #[cfg(feature = "sml-styling")]
26634            priority: f_priority
26635                .ok_or_else(|| ParseError::MissingAttribute("priority".to_string()))?,
26636            #[cfg(feature = "sml-styling")]
26637            stop_if_true: f_stop_if_true,
26638            #[cfg(feature = "sml-styling")]
26639            above_average: f_above_average,
26640            #[cfg(feature = "sml-styling")]
26641            percent: f_percent,
26642            #[cfg(feature = "sml-styling")]
26643            bottom: f_bottom,
26644            #[cfg(feature = "sml-styling")]
26645            operator: f_operator,
26646            #[cfg(feature = "sml-styling")]
26647            text: f_text,
26648            #[cfg(feature = "sml-styling")]
26649            time_period: f_time_period,
26650            #[cfg(feature = "sml-styling")]
26651            rank: f_rank,
26652            #[cfg(feature = "sml-styling")]
26653            std_dev: f_std_dev,
26654            #[cfg(feature = "sml-styling")]
26655            equal_average: f_equal_average,
26656            #[cfg(feature = "sml-styling")]
26657            formula: f_formula,
26658            #[cfg(feature = "sml-styling")]
26659            color_scale: f_color_scale,
26660            #[cfg(feature = "sml-styling")]
26661            data_bar: f_data_bar,
26662            #[cfg(feature = "sml-styling")]
26663            icon_set: f_icon_set,
26664            #[cfg(feature = "sml-extensions")]
26665            extension_list: f_extension_list,
26666            #[cfg(feature = "extra-attrs")]
26667            extra_attrs,
26668            #[cfg(feature = "extra-children")]
26669            extra_children,
26670        })
26671    }
26672}
26673
26674impl FromXml for Hyperlinks {
26675    fn from_xml<R: BufRead>(
26676        reader: &mut Reader<R>,
26677        start_tag: &BytesStart,
26678        is_empty: bool,
26679    ) -> Result<Self, ParseError> {
26680        let mut f_hyperlink = Vec::new();
26681        #[cfg(feature = "extra-children")]
26682        let mut extra_children = Vec::new();
26683        #[cfg(feature = "extra-children")]
26684        let mut child_idx: usize = 0;
26685
26686        // Parse child elements
26687        if !is_empty {
26688            let mut buf = Vec::new();
26689            loop {
26690                match reader.read_event_into(&mut buf)? {
26691                    Event::Start(e) => {
26692                        match e.local_name().as_ref() {
26693                            b"hyperlink" => {
26694                                f_hyperlink.push(Hyperlink::from_xml(reader, &e, false)?);
26695                                #[cfg(feature = "extra-children")]
26696                                {
26697                                    child_idx += 1;
26698                                }
26699                            }
26700                            #[cfg(feature = "extra-children")]
26701                            _ => {
26702                                // Capture unknown element for roundtrip
26703                                let elem = RawXmlElement::from_reader(reader, &e)?;
26704                                extra_children.push(PositionedNode::new(
26705                                    child_idx,
26706                                    RawXmlNode::Element(elem),
26707                                ));
26708                                child_idx += 1;
26709                            }
26710                            #[cfg(not(feature = "extra-children"))]
26711                            _ => {
26712                                // Skip unknown element
26713                                skip_element(reader)?;
26714                            }
26715                        }
26716                    }
26717                    Event::Empty(e) => {
26718                        match e.local_name().as_ref() {
26719                            b"hyperlink" => {
26720                                f_hyperlink.push(Hyperlink::from_xml(reader, &e, true)?);
26721                                #[cfg(feature = "extra-children")]
26722                                {
26723                                    child_idx += 1;
26724                                }
26725                            }
26726                            #[cfg(feature = "extra-children")]
26727                            _ => {
26728                                // Capture unknown empty element for roundtrip
26729                                let elem = RawXmlElement::from_empty(&e);
26730                                extra_children.push(PositionedNode::new(
26731                                    child_idx,
26732                                    RawXmlNode::Element(elem),
26733                                ));
26734                                child_idx += 1;
26735                            }
26736                            #[cfg(not(feature = "extra-children"))]
26737                            _ => {}
26738                        }
26739                    }
26740                    Event::End(_) => break,
26741                    Event::Eof => break,
26742                    _ => {}
26743                }
26744                buf.clear();
26745            }
26746        }
26747
26748        Ok(Self {
26749            hyperlink: f_hyperlink,
26750            #[cfg(feature = "extra-children")]
26751            extra_children,
26752        })
26753    }
26754}
26755
26756impl FromXml for Hyperlink {
26757    fn from_xml<R: BufRead>(
26758        reader: &mut Reader<R>,
26759        start_tag: &BytesStart,
26760        is_empty: bool,
26761    ) -> Result<Self, ParseError> {
26762        #[cfg(feature = "sml-hyperlinks")]
26763        let mut f_reference: Option<Reference> = None;
26764        let mut f_id = None;
26765        #[cfg(feature = "sml-hyperlinks")]
26766        let mut f_location = None;
26767        #[cfg(feature = "sml-hyperlinks")]
26768        let mut f_tooltip = None;
26769        #[cfg(feature = "sml-hyperlinks")]
26770        let mut f_display = None;
26771        #[cfg(feature = "extra-attrs")]
26772        let mut extra_attrs = std::collections::HashMap::new();
26773
26774        // Parse attributes
26775        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
26776            let val = String::from_utf8_lossy(&attr.value);
26777            match attr.key.local_name().as_ref() {
26778                #[cfg(feature = "sml-hyperlinks")]
26779                b"ref" => {
26780                    f_reference = Some(val.into_owned());
26781                }
26782                b"id" => {
26783                    f_id = Some(val.into_owned());
26784                }
26785                #[cfg(feature = "sml-hyperlinks")]
26786                b"location" => {
26787                    f_location = Some(val.into_owned());
26788                }
26789                #[cfg(feature = "sml-hyperlinks")]
26790                b"tooltip" => {
26791                    f_tooltip = Some(val.into_owned());
26792                }
26793                #[cfg(feature = "sml-hyperlinks")]
26794                b"display" => {
26795                    f_display = Some(val.into_owned());
26796                }
26797                #[cfg(feature = "extra-attrs")]
26798                unknown => {
26799                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
26800                    extra_attrs.insert(key, val.into_owned());
26801                }
26802                #[cfg(not(feature = "extra-attrs"))]
26803                _ => {}
26804            }
26805        }
26806
26807        if !is_empty {
26808            let mut buf = Vec::new();
26809            loop {
26810                match reader.read_event_into(&mut buf)? {
26811                    Event::End(_) => break,
26812                    Event::Eof => break,
26813                    _ => {}
26814                }
26815                buf.clear();
26816            }
26817        }
26818
26819        Ok(Self {
26820            #[cfg(feature = "sml-hyperlinks")]
26821            reference: f_reference
26822                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
26823            id: f_id,
26824            #[cfg(feature = "sml-hyperlinks")]
26825            location: f_location,
26826            #[cfg(feature = "sml-hyperlinks")]
26827            tooltip: f_tooltip,
26828            #[cfg(feature = "sml-hyperlinks")]
26829            display: f_display,
26830            #[cfg(feature = "extra-attrs")]
26831            extra_attrs,
26832        })
26833    }
26834}
26835
26836impl FromXml for CellFormula {
26837    fn from_xml<R: BufRead>(
26838        reader: &mut Reader<R>,
26839        start_tag: &BytesStart,
26840        is_empty: bool,
26841    ) -> Result<Self, ParseError> {
26842        let mut f_text = None;
26843        let mut f_cell_type = None;
26844        #[cfg(feature = "sml-formulas-advanced")]
26845        let mut f_aca = None;
26846        let mut f_reference = None;
26847        #[cfg(feature = "sml-formulas-advanced")]
26848        let mut f_dt2_d = None;
26849        #[cfg(feature = "sml-formulas-advanced")]
26850        let mut f_dtr = None;
26851        #[cfg(feature = "sml-formulas-advanced")]
26852        let mut f_del1 = None;
26853        #[cfg(feature = "sml-formulas-advanced")]
26854        let mut f_del2 = None;
26855        #[cfg(feature = "sml-formulas-advanced")]
26856        let mut f_r1 = None;
26857        #[cfg(feature = "sml-formulas-advanced")]
26858        let mut f_r2 = None;
26859        #[cfg(feature = "sml-formulas-advanced")]
26860        let mut f_ca = None;
26861        let mut f_si = None;
26862        #[cfg(feature = "sml-formulas-advanced")]
26863        let mut f_bx = None;
26864        #[cfg(feature = "extra-attrs")]
26865        let mut extra_attrs = std::collections::HashMap::new();
26866        #[cfg(feature = "extra-children")]
26867        let mut extra_children = Vec::new();
26868        #[cfg(feature = "extra-children")]
26869        let mut child_idx: usize = 0;
26870
26871        // Parse attributes
26872        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
26873            let val = String::from_utf8_lossy(&attr.value);
26874            match attr.key.local_name().as_ref() {
26875                b"t" => {
26876                    f_cell_type = val.parse().ok();
26877                }
26878                #[cfg(feature = "sml-formulas-advanced")]
26879                b"aca" => {
26880                    f_aca = Some(val == "true" || val == "1");
26881                }
26882                b"ref" => {
26883                    f_reference = Some(val.into_owned());
26884                }
26885                #[cfg(feature = "sml-formulas-advanced")]
26886                b"dt2D" => {
26887                    f_dt2_d = Some(val == "true" || val == "1");
26888                }
26889                #[cfg(feature = "sml-formulas-advanced")]
26890                b"dtr" => {
26891                    f_dtr = Some(val == "true" || val == "1");
26892                }
26893                #[cfg(feature = "sml-formulas-advanced")]
26894                b"del1" => {
26895                    f_del1 = Some(val == "true" || val == "1");
26896                }
26897                #[cfg(feature = "sml-formulas-advanced")]
26898                b"del2" => {
26899                    f_del2 = Some(val == "true" || val == "1");
26900                }
26901                #[cfg(feature = "sml-formulas-advanced")]
26902                b"r1" => {
26903                    f_r1 = Some(val.into_owned());
26904                }
26905                #[cfg(feature = "sml-formulas-advanced")]
26906                b"r2" => {
26907                    f_r2 = Some(val.into_owned());
26908                }
26909                #[cfg(feature = "sml-formulas-advanced")]
26910                b"ca" => {
26911                    f_ca = Some(val == "true" || val == "1");
26912                }
26913                b"si" => {
26914                    f_si = val.parse().ok();
26915                }
26916                #[cfg(feature = "sml-formulas-advanced")]
26917                b"bx" => {
26918                    f_bx = Some(val == "true" || val == "1");
26919                }
26920                #[cfg(feature = "extra-attrs")]
26921                unknown => {
26922                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
26923                    extra_attrs.insert(key, val.into_owned());
26924                }
26925                #[cfg(not(feature = "extra-attrs"))]
26926                _ => {}
26927            }
26928        }
26929
26930        // Parse child elements
26931        if !is_empty {
26932            let mut buf = Vec::new();
26933            loop {
26934                match reader.read_event_into(&mut buf)? {
26935                    Event::Start(e) => {
26936                        match e.local_name().as_ref() {
26937                            #[cfg(feature = "extra-children")]
26938                            _ => {
26939                                // Capture unknown element for roundtrip
26940                                let elem = RawXmlElement::from_reader(reader, &e)?;
26941                                extra_children.push(PositionedNode::new(
26942                                    child_idx,
26943                                    RawXmlNode::Element(elem),
26944                                ));
26945                                child_idx += 1;
26946                            }
26947                            #[cfg(not(feature = "extra-children"))]
26948                            _ => {
26949                                // Skip unknown element
26950                                skip_element(reader)?;
26951                            }
26952                        }
26953                    }
26954                    Event::Empty(e) => {
26955                        match e.local_name().as_ref() {
26956                            #[cfg(feature = "extra-children")]
26957                            _ => {
26958                                // Capture unknown empty element for roundtrip
26959                                let elem = RawXmlElement::from_empty(&e);
26960                                extra_children.push(PositionedNode::new(
26961                                    child_idx,
26962                                    RawXmlNode::Element(elem),
26963                                ));
26964                                child_idx += 1;
26965                            }
26966                            #[cfg(not(feature = "extra-children"))]
26967                            _ => {}
26968                        }
26969                    }
26970                    Event::Text(e) => {
26971                        let s = e.decode().unwrap_or_default();
26972                        f_text.get_or_insert_with(String::new).push_str(&s);
26973                    }
26974                    Event::GeneralRef(e) => {
26975                        let name = e.decode().unwrap_or_default();
26976                        if let Some(s) = quick_xml::escape::resolve_xml_entity(&name) {
26977                            f_text.get_or_insert_with(String::new).push_str(s);
26978                        }
26979                    }
26980                    Event::End(_) => break,
26981                    Event::Eof => break,
26982                    _ => {}
26983                }
26984                buf.clear();
26985            }
26986        }
26987
26988        Ok(Self {
26989            text: f_text,
26990            cell_type: f_cell_type,
26991            #[cfg(feature = "sml-formulas-advanced")]
26992            aca: f_aca,
26993            reference: f_reference,
26994            #[cfg(feature = "sml-formulas-advanced")]
26995            dt2_d: f_dt2_d,
26996            #[cfg(feature = "sml-formulas-advanced")]
26997            dtr: f_dtr,
26998            #[cfg(feature = "sml-formulas-advanced")]
26999            del1: f_del1,
27000            #[cfg(feature = "sml-formulas-advanced")]
27001            del2: f_del2,
27002            #[cfg(feature = "sml-formulas-advanced")]
27003            r1: f_r1,
27004            #[cfg(feature = "sml-formulas-advanced")]
27005            r2: f_r2,
27006            #[cfg(feature = "sml-formulas-advanced")]
27007            ca: f_ca,
27008            si: f_si,
27009            #[cfg(feature = "sml-formulas-advanced")]
27010            bx: f_bx,
27011            #[cfg(feature = "extra-attrs")]
27012            extra_attrs,
27013            #[cfg(feature = "extra-children")]
27014            extra_children,
27015        })
27016    }
27017}
27018
27019impl FromXml for ColorScale {
27020    fn from_xml<R: BufRead>(
27021        reader: &mut Reader<R>,
27022        start_tag: &BytesStart,
27023        is_empty: bool,
27024    ) -> Result<Self, ParseError> {
27025        #[cfg(feature = "sml-styling")]
27026        let mut f_cfvo = Vec::new();
27027        #[cfg(feature = "sml-styling")]
27028        let mut f_color = Vec::new();
27029        #[cfg(feature = "extra-children")]
27030        let mut extra_children = Vec::new();
27031        #[cfg(feature = "extra-children")]
27032        let mut child_idx: usize = 0;
27033
27034        // Parse child elements
27035        if !is_empty {
27036            let mut buf = Vec::new();
27037            loop {
27038                match reader.read_event_into(&mut buf)? {
27039                    Event::Start(e) => {
27040                        match e.local_name().as_ref() {
27041                            #[cfg(feature = "sml-styling")]
27042                            b"cfvo" => {
27043                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, false)?);
27044                                #[cfg(feature = "extra-children")]
27045                                {
27046                                    child_idx += 1;
27047                                }
27048                            }
27049                            #[cfg(feature = "sml-styling")]
27050                            b"color" => {
27051                                f_color.push(Color::from_xml(reader, &e, false)?);
27052                                #[cfg(feature = "extra-children")]
27053                                {
27054                                    child_idx += 1;
27055                                }
27056                            }
27057                            #[cfg(feature = "extra-children")]
27058                            _ => {
27059                                // Capture unknown element for roundtrip
27060                                let elem = RawXmlElement::from_reader(reader, &e)?;
27061                                extra_children.push(PositionedNode::new(
27062                                    child_idx,
27063                                    RawXmlNode::Element(elem),
27064                                ));
27065                                child_idx += 1;
27066                            }
27067                            #[cfg(not(feature = "extra-children"))]
27068                            _ => {
27069                                // Skip unknown element
27070                                skip_element(reader)?;
27071                            }
27072                        }
27073                    }
27074                    Event::Empty(e) => {
27075                        match e.local_name().as_ref() {
27076                            #[cfg(feature = "sml-styling")]
27077                            b"cfvo" => {
27078                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, true)?);
27079                                #[cfg(feature = "extra-children")]
27080                                {
27081                                    child_idx += 1;
27082                                }
27083                            }
27084                            #[cfg(feature = "sml-styling")]
27085                            b"color" => {
27086                                f_color.push(Color::from_xml(reader, &e, true)?);
27087                                #[cfg(feature = "extra-children")]
27088                                {
27089                                    child_idx += 1;
27090                                }
27091                            }
27092                            #[cfg(feature = "extra-children")]
27093                            _ => {
27094                                // Capture unknown empty element for roundtrip
27095                                let elem = RawXmlElement::from_empty(&e);
27096                                extra_children.push(PositionedNode::new(
27097                                    child_idx,
27098                                    RawXmlNode::Element(elem),
27099                                ));
27100                                child_idx += 1;
27101                            }
27102                            #[cfg(not(feature = "extra-children"))]
27103                            _ => {}
27104                        }
27105                    }
27106                    Event::End(_) => break,
27107                    Event::Eof => break,
27108                    _ => {}
27109                }
27110                buf.clear();
27111            }
27112        }
27113
27114        Ok(Self {
27115            #[cfg(feature = "sml-styling")]
27116            cfvo: f_cfvo,
27117            #[cfg(feature = "sml-styling")]
27118            color: f_color,
27119            #[cfg(feature = "extra-children")]
27120            extra_children,
27121        })
27122    }
27123}
27124
27125impl FromXml for DataBar {
27126    fn from_xml<R: BufRead>(
27127        reader: &mut Reader<R>,
27128        start_tag: &BytesStart,
27129        is_empty: bool,
27130    ) -> Result<Self, ParseError> {
27131        #[cfg(feature = "sml-styling")]
27132        let mut f_min_length = None;
27133        #[cfg(feature = "sml-styling")]
27134        let mut f_max_length = None;
27135        #[cfg(feature = "sml-styling")]
27136        let mut f_show_value = None;
27137        #[cfg(feature = "sml-styling")]
27138        let mut f_cfvo = Vec::new();
27139        #[cfg(feature = "sml-styling")]
27140        let mut f_color: Option<Box<Color>> = None;
27141        #[cfg(feature = "extra-attrs")]
27142        let mut extra_attrs = std::collections::HashMap::new();
27143        #[cfg(feature = "extra-children")]
27144        let mut extra_children = Vec::new();
27145        #[cfg(feature = "extra-children")]
27146        let mut child_idx: usize = 0;
27147
27148        // Parse attributes
27149        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27150            let val = String::from_utf8_lossy(&attr.value);
27151            match attr.key.local_name().as_ref() {
27152                #[cfg(feature = "sml-styling")]
27153                b"minLength" => {
27154                    f_min_length = val.parse().ok();
27155                }
27156                #[cfg(feature = "sml-styling")]
27157                b"maxLength" => {
27158                    f_max_length = val.parse().ok();
27159                }
27160                #[cfg(feature = "sml-styling")]
27161                b"showValue" => {
27162                    f_show_value = Some(val == "true" || val == "1");
27163                }
27164                #[cfg(feature = "extra-attrs")]
27165                unknown => {
27166                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27167                    extra_attrs.insert(key, val.into_owned());
27168                }
27169                #[cfg(not(feature = "extra-attrs"))]
27170                _ => {}
27171            }
27172        }
27173
27174        // Parse child elements
27175        if !is_empty {
27176            let mut buf = Vec::new();
27177            loop {
27178                match reader.read_event_into(&mut buf)? {
27179                    Event::Start(e) => {
27180                        match e.local_name().as_ref() {
27181                            #[cfg(feature = "sml-styling")]
27182                            b"cfvo" => {
27183                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, false)?);
27184                                #[cfg(feature = "extra-children")]
27185                                {
27186                                    child_idx += 1;
27187                                }
27188                            }
27189                            #[cfg(feature = "sml-styling")]
27190                            b"color" => {
27191                                f_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
27192                                #[cfg(feature = "extra-children")]
27193                                {
27194                                    child_idx += 1;
27195                                }
27196                            }
27197                            #[cfg(feature = "extra-children")]
27198                            _ => {
27199                                // Capture unknown element for roundtrip
27200                                let elem = RawXmlElement::from_reader(reader, &e)?;
27201                                extra_children.push(PositionedNode::new(
27202                                    child_idx,
27203                                    RawXmlNode::Element(elem),
27204                                ));
27205                                child_idx += 1;
27206                            }
27207                            #[cfg(not(feature = "extra-children"))]
27208                            _ => {
27209                                // Skip unknown element
27210                                skip_element(reader)?;
27211                            }
27212                        }
27213                    }
27214                    Event::Empty(e) => {
27215                        match e.local_name().as_ref() {
27216                            #[cfg(feature = "sml-styling")]
27217                            b"cfvo" => {
27218                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, true)?);
27219                                #[cfg(feature = "extra-children")]
27220                                {
27221                                    child_idx += 1;
27222                                }
27223                            }
27224                            #[cfg(feature = "sml-styling")]
27225                            b"color" => {
27226                                f_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
27227                                #[cfg(feature = "extra-children")]
27228                                {
27229                                    child_idx += 1;
27230                                }
27231                            }
27232                            #[cfg(feature = "extra-children")]
27233                            _ => {
27234                                // Capture unknown empty element for roundtrip
27235                                let elem = RawXmlElement::from_empty(&e);
27236                                extra_children.push(PositionedNode::new(
27237                                    child_idx,
27238                                    RawXmlNode::Element(elem),
27239                                ));
27240                                child_idx += 1;
27241                            }
27242                            #[cfg(not(feature = "extra-children"))]
27243                            _ => {}
27244                        }
27245                    }
27246                    Event::End(_) => break,
27247                    Event::Eof => break,
27248                    _ => {}
27249                }
27250                buf.clear();
27251            }
27252        }
27253
27254        Ok(Self {
27255            #[cfg(feature = "sml-styling")]
27256            min_length: f_min_length,
27257            #[cfg(feature = "sml-styling")]
27258            max_length: f_max_length,
27259            #[cfg(feature = "sml-styling")]
27260            show_value: f_show_value,
27261            #[cfg(feature = "sml-styling")]
27262            cfvo: f_cfvo,
27263            #[cfg(feature = "sml-styling")]
27264            color: f_color.ok_or_else(|| ParseError::MissingAttribute("color".to_string()))?,
27265            #[cfg(feature = "extra-attrs")]
27266            extra_attrs,
27267            #[cfg(feature = "extra-children")]
27268            extra_children,
27269        })
27270    }
27271}
27272
27273impl FromXml for IconSet {
27274    fn from_xml<R: BufRead>(
27275        reader: &mut Reader<R>,
27276        start_tag: &BytesStart,
27277        is_empty: bool,
27278    ) -> Result<Self, ParseError> {
27279        #[cfg(feature = "sml-styling")]
27280        let mut f_icon_set = None;
27281        #[cfg(feature = "sml-styling")]
27282        let mut f_show_value = None;
27283        #[cfg(feature = "sml-styling")]
27284        let mut f_percent = None;
27285        #[cfg(feature = "sml-styling")]
27286        let mut f_reverse = None;
27287        #[cfg(feature = "sml-styling")]
27288        let mut f_cfvo = Vec::new();
27289        #[cfg(feature = "extra-attrs")]
27290        let mut extra_attrs = std::collections::HashMap::new();
27291        #[cfg(feature = "extra-children")]
27292        let mut extra_children = Vec::new();
27293        #[cfg(feature = "extra-children")]
27294        let mut child_idx: usize = 0;
27295
27296        // Parse attributes
27297        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27298            let val = String::from_utf8_lossy(&attr.value);
27299            match attr.key.local_name().as_ref() {
27300                #[cfg(feature = "sml-styling")]
27301                b"iconSet" => {
27302                    f_icon_set = val.parse().ok();
27303                }
27304                #[cfg(feature = "sml-styling")]
27305                b"showValue" => {
27306                    f_show_value = Some(val == "true" || val == "1");
27307                }
27308                #[cfg(feature = "sml-styling")]
27309                b"percent" => {
27310                    f_percent = Some(val == "true" || val == "1");
27311                }
27312                #[cfg(feature = "sml-styling")]
27313                b"reverse" => {
27314                    f_reverse = Some(val == "true" || val == "1");
27315                }
27316                #[cfg(feature = "extra-attrs")]
27317                unknown => {
27318                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27319                    extra_attrs.insert(key, val.into_owned());
27320                }
27321                #[cfg(not(feature = "extra-attrs"))]
27322                _ => {}
27323            }
27324        }
27325
27326        // Parse child elements
27327        if !is_empty {
27328            let mut buf = Vec::new();
27329            loop {
27330                match reader.read_event_into(&mut buf)? {
27331                    Event::Start(e) => {
27332                        match e.local_name().as_ref() {
27333                            #[cfg(feature = "sml-styling")]
27334                            b"cfvo" => {
27335                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, false)?);
27336                                #[cfg(feature = "extra-children")]
27337                                {
27338                                    child_idx += 1;
27339                                }
27340                            }
27341                            #[cfg(feature = "extra-children")]
27342                            _ => {
27343                                // Capture unknown element for roundtrip
27344                                let elem = RawXmlElement::from_reader(reader, &e)?;
27345                                extra_children.push(PositionedNode::new(
27346                                    child_idx,
27347                                    RawXmlNode::Element(elem),
27348                                ));
27349                                child_idx += 1;
27350                            }
27351                            #[cfg(not(feature = "extra-children"))]
27352                            _ => {
27353                                // Skip unknown element
27354                                skip_element(reader)?;
27355                            }
27356                        }
27357                    }
27358                    Event::Empty(e) => {
27359                        match e.local_name().as_ref() {
27360                            #[cfg(feature = "sml-styling")]
27361                            b"cfvo" => {
27362                                f_cfvo.push(ConditionalFormatValue::from_xml(reader, &e, true)?);
27363                                #[cfg(feature = "extra-children")]
27364                                {
27365                                    child_idx += 1;
27366                                }
27367                            }
27368                            #[cfg(feature = "extra-children")]
27369                            _ => {
27370                                // Capture unknown empty element for roundtrip
27371                                let elem = RawXmlElement::from_empty(&e);
27372                                extra_children.push(PositionedNode::new(
27373                                    child_idx,
27374                                    RawXmlNode::Element(elem),
27375                                ));
27376                                child_idx += 1;
27377                            }
27378                            #[cfg(not(feature = "extra-children"))]
27379                            _ => {}
27380                        }
27381                    }
27382                    Event::End(_) => break,
27383                    Event::Eof => break,
27384                    _ => {}
27385                }
27386                buf.clear();
27387            }
27388        }
27389
27390        Ok(Self {
27391            #[cfg(feature = "sml-styling")]
27392            icon_set: f_icon_set,
27393            #[cfg(feature = "sml-styling")]
27394            show_value: f_show_value,
27395            #[cfg(feature = "sml-styling")]
27396            percent: f_percent,
27397            #[cfg(feature = "sml-styling")]
27398            reverse: f_reverse,
27399            #[cfg(feature = "sml-styling")]
27400            cfvo: f_cfvo,
27401            #[cfg(feature = "extra-attrs")]
27402            extra_attrs,
27403            #[cfg(feature = "extra-children")]
27404            extra_children,
27405        })
27406    }
27407}
27408
27409impl FromXml for ConditionalFormatValue {
27410    fn from_xml<R: BufRead>(
27411        reader: &mut Reader<R>,
27412        start_tag: &BytesStart,
27413        is_empty: bool,
27414    ) -> Result<Self, ParseError> {
27415        #[cfg(feature = "sml-styling")]
27416        let mut f_type: Option<ConditionalValueType> = None;
27417        #[cfg(feature = "sml-styling")]
27418        let mut f_value = None;
27419        #[cfg(feature = "sml-styling")]
27420        let mut f_gte = None;
27421        let mut f_extension_list = None;
27422        #[cfg(feature = "extra-attrs")]
27423        let mut extra_attrs = std::collections::HashMap::new();
27424        #[cfg(feature = "extra-children")]
27425        let mut extra_children = Vec::new();
27426        #[cfg(feature = "extra-children")]
27427        let mut child_idx: usize = 0;
27428
27429        // Parse attributes
27430        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27431            let val = String::from_utf8_lossy(&attr.value);
27432            match attr.key.local_name().as_ref() {
27433                #[cfg(feature = "sml-styling")]
27434                b"type" => {
27435                    f_type = val.parse().ok();
27436                }
27437                #[cfg(feature = "sml-styling")]
27438                b"val" => {
27439                    f_value = Some(val.into_owned());
27440                }
27441                #[cfg(feature = "sml-styling")]
27442                b"gte" => {
27443                    f_gte = Some(val == "true" || val == "1");
27444                }
27445                #[cfg(feature = "extra-attrs")]
27446                unknown => {
27447                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27448                    extra_attrs.insert(key, val.into_owned());
27449                }
27450                #[cfg(not(feature = "extra-attrs"))]
27451                _ => {}
27452            }
27453        }
27454
27455        // Parse child elements
27456        if !is_empty {
27457            let mut buf = Vec::new();
27458            loop {
27459                match reader.read_event_into(&mut buf)? {
27460                    Event::Start(e) => {
27461                        match e.local_name().as_ref() {
27462                            b"extLst" => {
27463                                f_extension_list =
27464                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
27465                                #[cfg(feature = "extra-children")]
27466                                {
27467                                    child_idx += 1;
27468                                }
27469                            }
27470                            #[cfg(feature = "extra-children")]
27471                            _ => {
27472                                // Capture unknown element for roundtrip
27473                                let elem = RawXmlElement::from_reader(reader, &e)?;
27474                                extra_children.push(PositionedNode::new(
27475                                    child_idx,
27476                                    RawXmlNode::Element(elem),
27477                                ));
27478                                child_idx += 1;
27479                            }
27480                            #[cfg(not(feature = "extra-children"))]
27481                            _ => {
27482                                // Skip unknown element
27483                                skip_element(reader)?;
27484                            }
27485                        }
27486                    }
27487                    Event::Empty(e) => {
27488                        match e.local_name().as_ref() {
27489                            b"extLst" => {
27490                                f_extension_list =
27491                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
27492                                #[cfg(feature = "extra-children")]
27493                                {
27494                                    child_idx += 1;
27495                                }
27496                            }
27497                            #[cfg(feature = "extra-children")]
27498                            _ => {
27499                                // Capture unknown empty element for roundtrip
27500                                let elem = RawXmlElement::from_empty(&e);
27501                                extra_children.push(PositionedNode::new(
27502                                    child_idx,
27503                                    RawXmlNode::Element(elem),
27504                                ));
27505                                child_idx += 1;
27506                            }
27507                            #[cfg(not(feature = "extra-children"))]
27508                            _ => {}
27509                        }
27510                    }
27511                    Event::End(_) => break,
27512                    Event::Eof => break,
27513                    _ => {}
27514                }
27515                buf.clear();
27516            }
27517        }
27518
27519        Ok(Self {
27520            #[cfg(feature = "sml-styling")]
27521            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
27522            #[cfg(feature = "sml-styling")]
27523            value: f_value,
27524            #[cfg(feature = "sml-styling")]
27525            gte: f_gte,
27526            extension_list: f_extension_list,
27527            #[cfg(feature = "extra-attrs")]
27528            extra_attrs,
27529            #[cfg(feature = "extra-children")]
27530            extra_children,
27531        })
27532    }
27533}
27534
27535impl FromXml for PageMargins {
27536    fn from_xml<R: BufRead>(
27537        reader: &mut Reader<R>,
27538        start_tag: &BytesStart,
27539        is_empty: bool,
27540    ) -> Result<Self, ParseError> {
27541        #[cfg(feature = "sml-layout")]
27542        let mut f_left: Option<f64> = None;
27543        #[cfg(feature = "sml-layout")]
27544        let mut f_right: Option<f64> = None;
27545        #[cfg(feature = "sml-layout")]
27546        let mut f_top: Option<f64> = None;
27547        #[cfg(feature = "sml-layout")]
27548        let mut f_bottom: Option<f64> = None;
27549        #[cfg(feature = "sml-layout")]
27550        let mut f_header: Option<f64> = None;
27551        #[cfg(feature = "sml-layout")]
27552        let mut f_footer: Option<f64> = None;
27553        #[cfg(feature = "extra-attrs")]
27554        let mut extra_attrs = std::collections::HashMap::new();
27555
27556        // Parse attributes
27557        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27558            let val = String::from_utf8_lossy(&attr.value);
27559            match attr.key.local_name().as_ref() {
27560                #[cfg(feature = "sml-layout")]
27561                b"left" => {
27562                    f_left = val.parse().ok();
27563                }
27564                #[cfg(feature = "sml-layout")]
27565                b"right" => {
27566                    f_right = val.parse().ok();
27567                }
27568                #[cfg(feature = "sml-layout")]
27569                b"top" => {
27570                    f_top = val.parse().ok();
27571                }
27572                #[cfg(feature = "sml-layout")]
27573                b"bottom" => {
27574                    f_bottom = val.parse().ok();
27575                }
27576                #[cfg(feature = "sml-layout")]
27577                b"header" => {
27578                    f_header = val.parse().ok();
27579                }
27580                #[cfg(feature = "sml-layout")]
27581                b"footer" => {
27582                    f_footer = val.parse().ok();
27583                }
27584                #[cfg(feature = "extra-attrs")]
27585                unknown => {
27586                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27587                    extra_attrs.insert(key, val.into_owned());
27588                }
27589                #[cfg(not(feature = "extra-attrs"))]
27590                _ => {}
27591            }
27592        }
27593
27594        if !is_empty {
27595            let mut buf = Vec::new();
27596            loop {
27597                match reader.read_event_into(&mut buf)? {
27598                    Event::End(_) => break,
27599                    Event::Eof => break,
27600                    _ => {}
27601                }
27602                buf.clear();
27603            }
27604        }
27605
27606        Ok(Self {
27607            #[cfg(feature = "sml-layout")]
27608            left: f_left.ok_or_else(|| ParseError::MissingAttribute("left".to_string()))?,
27609            #[cfg(feature = "sml-layout")]
27610            right: f_right.ok_or_else(|| ParseError::MissingAttribute("right".to_string()))?,
27611            #[cfg(feature = "sml-layout")]
27612            top: f_top.ok_or_else(|| ParseError::MissingAttribute("top".to_string()))?,
27613            #[cfg(feature = "sml-layout")]
27614            bottom: f_bottom.ok_or_else(|| ParseError::MissingAttribute("bottom".to_string()))?,
27615            #[cfg(feature = "sml-layout")]
27616            header: f_header.ok_or_else(|| ParseError::MissingAttribute("header".to_string()))?,
27617            #[cfg(feature = "sml-layout")]
27618            footer: f_footer.ok_or_else(|| ParseError::MissingAttribute("footer".to_string()))?,
27619            #[cfg(feature = "extra-attrs")]
27620            extra_attrs,
27621        })
27622    }
27623}
27624
27625impl FromXml for PrintOptions {
27626    fn from_xml<R: BufRead>(
27627        reader: &mut Reader<R>,
27628        start_tag: &BytesStart,
27629        is_empty: bool,
27630    ) -> Result<Self, ParseError> {
27631        let mut f_horizontal_centered = None;
27632        let mut f_vertical_centered = None;
27633        let mut f_headings = None;
27634        let mut f_grid_lines = None;
27635        let mut f_grid_lines_set = None;
27636        #[cfg(feature = "extra-attrs")]
27637        let mut extra_attrs = std::collections::HashMap::new();
27638
27639        // Parse attributes
27640        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27641            let val = String::from_utf8_lossy(&attr.value);
27642            match attr.key.local_name().as_ref() {
27643                b"horizontalCentered" => {
27644                    f_horizontal_centered = Some(val == "true" || val == "1");
27645                }
27646                b"verticalCentered" => {
27647                    f_vertical_centered = Some(val == "true" || val == "1");
27648                }
27649                b"headings" => {
27650                    f_headings = Some(val == "true" || val == "1");
27651                }
27652                b"gridLines" => {
27653                    f_grid_lines = Some(val == "true" || val == "1");
27654                }
27655                b"gridLinesSet" => {
27656                    f_grid_lines_set = Some(val == "true" || val == "1");
27657                }
27658                #[cfg(feature = "extra-attrs")]
27659                unknown => {
27660                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27661                    extra_attrs.insert(key, val.into_owned());
27662                }
27663                #[cfg(not(feature = "extra-attrs"))]
27664                _ => {}
27665            }
27666        }
27667
27668        if !is_empty {
27669            let mut buf = Vec::new();
27670            loop {
27671                match reader.read_event_into(&mut buf)? {
27672                    Event::End(_) => break,
27673                    Event::Eof => break,
27674                    _ => {}
27675                }
27676                buf.clear();
27677            }
27678        }
27679
27680        Ok(Self {
27681            horizontal_centered: f_horizontal_centered,
27682            vertical_centered: f_vertical_centered,
27683            headings: f_headings,
27684            grid_lines: f_grid_lines,
27685            grid_lines_set: f_grid_lines_set,
27686            #[cfg(feature = "extra-attrs")]
27687            extra_attrs,
27688        })
27689    }
27690}
27691
27692impl FromXml for PageSetup {
27693    fn from_xml<R: BufRead>(
27694        reader: &mut Reader<R>,
27695        start_tag: &BytesStart,
27696        is_empty: bool,
27697    ) -> Result<Self, ParseError> {
27698        #[cfg(feature = "sml-layout")]
27699        let mut f_paper_size = None;
27700        #[cfg(feature = "sml-layout")]
27701        let mut f_paper_height = None;
27702        #[cfg(feature = "sml-layout")]
27703        let mut f_paper_width = None;
27704        #[cfg(feature = "sml-layout")]
27705        let mut f_scale = None;
27706        #[cfg(feature = "sml-layout")]
27707        let mut f_first_page_number = None;
27708        #[cfg(feature = "sml-layout")]
27709        let mut f_fit_to_width = None;
27710        #[cfg(feature = "sml-layout")]
27711        let mut f_fit_to_height = None;
27712        #[cfg(feature = "sml-layout")]
27713        let mut f_page_order = None;
27714        #[cfg(feature = "sml-layout")]
27715        let mut f_orientation = None;
27716        #[cfg(feature = "sml-layout")]
27717        let mut f_use_printer_defaults = None;
27718        #[cfg(feature = "sml-layout")]
27719        let mut f_black_and_white = None;
27720        #[cfg(feature = "sml-layout")]
27721        let mut f_draft = None;
27722        #[cfg(feature = "sml-layout")]
27723        let mut f_cell_comments = None;
27724        #[cfg(feature = "sml-layout")]
27725        let mut f_use_first_page_number = None;
27726        #[cfg(feature = "sml-layout")]
27727        let mut f_errors = None;
27728        #[cfg(feature = "sml-layout")]
27729        let mut f_horizontal_dpi = None;
27730        #[cfg(feature = "sml-layout")]
27731        let mut f_vertical_dpi = None;
27732        #[cfg(feature = "sml-layout")]
27733        let mut f_copies = None;
27734        let mut f_id = None;
27735        #[cfg(feature = "extra-attrs")]
27736        let mut extra_attrs = std::collections::HashMap::new();
27737
27738        // Parse attributes
27739        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27740            let val = String::from_utf8_lossy(&attr.value);
27741            match attr.key.local_name().as_ref() {
27742                #[cfg(feature = "sml-layout")]
27743                b"paperSize" => {
27744                    f_paper_size = val.parse().ok();
27745                }
27746                #[cfg(feature = "sml-layout")]
27747                b"paperHeight" => {
27748                    f_paper_height = Some(val.into_owned());
27749                }
27750                #[cfg(feature = "sml-layout")]
27751                b"paperWidth" => {
27752                    f_paper_width = Some(val.into_owned());
27753                }
27754                #[cfg(feature = "sml-layout")]
27755                b"scale" => {
27756                    f_scale = val.parse().ok();
27757                }
27758                #[cfg(feature = "sml-layout")]
27759                b"firstPageNumber" => {
27760                    f_first_page_number = val.parse().ok();
27761                }
27762                #[cfg(feature = "sml-layout")]
27763                b"fitToWidth" => {
27764                    f_fit_to_width = val.parse().ok();
27765                }
27766                #[cfg(feature = "sml-layout")]
27767                b"fitToHeight" => {
27768                    f_fit_to_height = val.parse().ok();
27769                }
27770                #[cfg(feature = "sml-layout")]
27771                b"pageOrder" => {
27772                    f_page_order = val.parse().ok();
27773                }
27774                #[cfg(feature = "sml-layout")]
27775                b"orientation" => {
27776                    f_orientation = val.parse().ok();
27777                }
27778                #[cfg(feature = "sml-layout")]
27779                b"usePrinterDefaults" => {
27780                    f_use_printer_defaults = Some(val == "true" || val == "1");
27781                }
27782                #[cfg(feature = "sml-layout")]
27783                b"blackAndWhite" => {
27784                    f_black_and_white = Some(val == "true" || val == "1");
27785                }
27786                #[cfg(feature = "sml-layout")]
27787                b"draft" => {
27788                    f_draft = Some(val == "true" || val == "1");
27789                }
27790                #[cfg(feature = "sml-layout")]
27791                b"cellComments" => {
27792                    f_cell_comments = val.parse().ok();
27793                }
27794                #[cfg(feature = "sml-layout")]
27795                b"useFirstPageNumber" => {
27796                    f_use_first_page_number = Some(val == "true" || val == "1");
27797                }
27798                #[cfg(feature = "sml-layout")]
27799                b"errors" => {
27800                    f_errors = val.parse().ok();
27801                }
27802                #[cfg(feature = "sml-layout")]
27803                b"horizontalDpi" => {
27804                    f_horizontal_dpi = val.parse().ok();
27805                }
27806                #[cfg(feature = "sml-layout")]
27807                b"verticalDpi" => {
27808                    f_vertical_dpi = val.parse().ok();
27809                }
27810                #[cfg(feature = "sml-layout")]
27811                b"copies" => {
27812                    f_copies = val.parse().ok();
27813                }
27814                b"id" => {
27815                    f_id = Some(val.into_owned());
27816                }
27817                #[cfg(feature = "extra-attrs")]
27818                unknown => {
27819                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27820                    extra_attrs.insert(key, val.into_owned());
27821                }
27822                #[cfg(not(feature = "extra-attrs"))]
27823                _ => {}
27824            }
27825        }
27826
27827        if !is_empty {
27828            let mut buf = Vec::new();
27829            loop {
27830                match reader.read_event_into(&mut buf)? {
27831                    Event::End(_) => break,
27832                    Event::Eof => break,
27833                    _ => {}
27834                }
27835                buf.clear();
27836            }
27837        }
27838
27839        Ok(Self {
27840            #[cfg(feature = "sml-layout")]
27841            paper_size: f_paper_size,
27842            #[cfg(feature = "sml-layout")]
27843            paper_height: f_paper_height,
27844            #[cfg(feature = "sml-layout")]
27845            paper_width: f_paper_width,
27846            #[cfg(feature = "sml-layout")]
27847            scale: f_scale,
27848            #[cfg(feature = "sml-layout")]
27849            first_page_number: f_first_page_number,
27850            #[cfg(feature = "sml-layout")]
27851            fit_to_width: f_fit_to_width,
27852            #[cfg(feature = "sml-layout")]
27853            fit_to_height: f_fit_to_height,
27854            #[cfg(feature = "sml-layout")]
27855            page_order: f_page_order,
27856            #[cfg(feature = "sml-layout")]
27857            orientation: f_orientation,
27858            #[cfg(feature = "sml-layout")]
27859            use_printer_defaults: f_use_printer_defaults,
27860            #[cfg(feature = "sml-layout")]
27861            black_and_white: f_black_and_white,
27862            #[cfg(feature = "sml-layout")]
27863            draft: f_draft,
27864            #[cfg(feature = "sml-layout")]
27865            cell_comments: f_cell_comments,
27866            #[cfg(feature = "sml-layout")]
27867            use_first_page_number: f_use_first_page_number,
27868            #[cfg(feature = "sml-layout")]
27869            errors: f_errors,
27870            #[cfg(feature = "sml-layout")]
27871            horizontal_dpi: f_horizontal_dpi,
27872            #[cfg(feature = "sml-layout")]
27873            vertical_dpi: f_vertical_dpi,
27874            #[cfg(feature = "sml-layout")]
27875            copies: f_copies,
27876            id: f_id,
27877            #[cfg(feature = "extra-attrs")]
27878            extra_attrs,
27879        })
27880    }
27881}
27882
27883impl FromXml for HeaderFooter {
27884    fn from_xml<R: BufRead>(
27885        reader: &mut Reader<R>,
27886        start_tag: &BytesStart,
27887        is_empty: bool,
27888    ) -> Result<Self, ParseError> {
27889        #[cfg(feature = "sml-layout")]
27890        let mut f_different_odd_even = None;
27891        #[cfg(feature = "sml-layout")]
27892        let mut f_different_first = None;
27893        #[cfg(feature = "sml-layout")]
27894        let mut f_scale_with_doc = None;
27895        #[cfg(feature = "sml-layout")]
27896        let mut f_align_with_margins = None;
27897        #[cfg(feature = "sml-layout")]
27898        let mut f_odd_header = None;
27899        #[cfg(feature = "sml-layout")]
27900        let mut f_odd_footer = None;
27901        #[cfg(feature = "sml-layout")]
27902        let mut f_even_header = None;
27903        #[cfg(feature = "sml-layout")]
27904        let mut f_even_footer = None;
27905        #[cfg(feature = "sml-layout")]
27906        let mut f_first_header = None;
27907        #[cfg(feature = "sml-layout")]
27908        let mut f_first_footer = None;
27909        #[cfg(feature = "extra-attrs")]
27910        let mut extra_attrs = std::collections::HashMap::new();
27911        #[cfg(feature = "extra-children")]
27912        let mut extra_children = Vec::new();
27913        #[cfg(feature = "extra-children")]
27914        let mut child_idx: usize = 0;
27915
27916        // Parse attributes
27917        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
27918            let val = String::from_utf8_lossy(&attr.value);
27919            match attr.key.local_name().as_ref() {
27920                #[cfg(feature = "sml-layout")]
27921                b"differentOddEven" => {
27922                    f_different_odd_even = Some(val == "true" || val == "1");
27923                }
27924                #[cfg(feature = "sml-layout")]
27925                b"differentFirst" => {
27926                    f_different_first = Some(val == "true" || val == "1");
27927                }
27928                #[cfg(feature = "sml-layout")]
27929                b"scaleWithDoc" => {
27930                    f_scale_with_doc = Some(val == "true" || val == "1");
27931                }
27932                #[cfg(feature = "sml-layout")]
27933                b"alignWithMargins" => {
27934                    f_align_with_margins = Some(val == "true" || val == "1");
27935                }
27936                #[cfg(feature = "extra-attrs")]
27937                unknown => {
27938                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
27939                    extra_attrs.insert(key, val.into_owned());
27940                }
27941                #[cfg(not(feature = "extra-attrs"))]
27942                _ => {}
27943            }
27944        }
27945
27946        // Parse child elements
27947        if !is_empty {
27948            let mut buf = Vec::new();
27949            loop {
27950                match reader.read_event_into(&mut buf)? {
27951                    Event::Start(e) => {
27952                        match e.local_name().as_ref() {
27953                            #[cfg(feature = "sml-layout")]
27954                            b"oddHeader" => {
27955                                f_odd_header = Some(read_text_content(reader)?);
27956                                #[cfg(feature = "extra-children")]
27957                                {
27958                                    child_idx += 1;
27959                                }
27960                            }
27961                            #[cfg(feature = "sml-layout")]
27962                            b"oddFooter" => {
27963                                f_odd_footer = Some(read_text_content(reader)?);
27964                                #[cfg(feature = "extra-children")]
27965                                {
27966                                    child_idx += 1;
27967                                }
27968                            }
27969                            #[cfg(feature = "sml-layout")]
27970                            b"evenHeader" => {
27971                                f_even_header = Some(read_text_content(reader)?);
27972                                #[cfg(feature = "extra-children")]
27973                                {
27974                                    child_idx += 1;
27975                                }
27976                            }
27977                            #[cfg(feature = "sml-layout")]
27978                            b"evenFooter" => {
27979                                f_even_footer = Some(read_text_content(reader)?);
27980                                #[cfg(feature = "extra-children")]
27981                                {
27982                                    child_idx += 1;
27983                                }
27984                            }
27985                            #[cfg(feature = "sml-layout")]
27986                            b"firstHeader" => {
27987                                f_first_header = Some(read_text_content(reader)?);
27988                                #[cfg(feature = "extra-children")]
27989                                {
27990                                    child_idx += 1;
27991                                }
27992                            }
27993                            #[cfg(feature = "sml-layout")]
27994                            b"firstFooter" => {
27995                                f_first_footer = Some(read_text_content(reader)?);
27996                                #[cfg(feature = "extra-children")]
27997                                {
27998                                    child_idx += 1;
27999                                }
28000                            }
28001                            #[cfg(feature = "extra-children")]
28002                            _ => {
28003                                // Capture unknown element for roundtrip
28004                                let elem = RawXmlElement::from_reader(reader, &e)?;
28005                                extra_children.push(PositionedNode::new(
28006                                    child_idx,
28007                                    RawXmlNode::Element(elem),
28008                                ));
28009                                child_idx += 1;
28010                            }
28011                            #[cfg(not(feature = "extra-children"))]
28012                            _ => {
28013                                // Skip unknown element
28014                                skip_element(reader)?;
28015                            }
28016                        }
28017                    }
28018                    Event::Empty(e) => {
28019                        match e.local_name().as_ref() {
28020                            #[cfg(feature = "sml-layout")]
28021                            b"oddHeader" => {
28022                                f_odd_header = Some(String::new());
28023                                #[cfg(feature = "extra-children")]
28024                                {
28025                                    child_idx += 1;
28026                                }
28027                            }
28028                            #[cfg(feature = "sml-layout")]
28029                            b"oddFooter" => {
28030                                f_odd_footer = Some(String::new());
28031                                #[cfg(feature = "extra-children")]
28032                                {
28033                                    child_idx += 1;
28034                                }
28035                            }
28036                            #[cfg(feature = "sml-layout")]
28037                            b"evenHeader" => {
28038                                f_even_header = Some(String::new());
28039                                #[cfg(feature = "extra-children")]
28040                                {
28041                                    child_idx += 1;
28042                                }
28043                            }
28044                            #[cfg(feature = "sml-layout")]
28045                            b"evenFooter" => {
28046                                f_even_footer = Some(String::new());
28047                                #[cfg(feature = "extra-children")]
28048                                {
28049                                    child_idx += 1;
28050                                }
28051                            }
28052                            #[cfg(feature = "sml-layout")]
28053                            b"firstHeader" => {
28054                                f_first_header = Some(String::new());
28055                                #[cfg(feature = "extra-children")]
28056                                {
28057                                    child_idx += 1;
28058                                }
28059                            }
28060                            #[cfg(feature = "sml-layout")]
28061                            b"firstFooter" => {
28062                                f_first_footer = Some(String::new());
28063                                #[cfg(feature = "extra-children")]
28064                                {
28065                                    child_idx += 1;
28066                                }
28067                            }
28068                            #[cfg(feature = "extra-children")]
28069                            _ => {
28070                                // Capture unknown empty element for roundtrip
28071                                let elem = RawXmlElement::from_empty(&e);
28072                                extra_children.push(PositionedNode::new(
28073                                    child_idx,
28074                                    RawXmlNode::Element(elem),
28075                                ));
28076                                child_idx += 1;
28077                            }
28078                            #[cfg(not(feature = "extra-children"))]
28079                            _ => {}
28080                        }
28081                    }
28082                    Event::End(_) => break,
28083                    Event::Eof => break,
28084                    _ => {}
28085                }
28086                buf.clear();
28087            }
28088        }
28089
28090        Ok(Self {
28091            #[cfg(feature = "sml-layout")]
28092            different_odd_even: f_different_odd_even,
28093            #[cfg(feature = "sml-layout")]
28094            different_first: f_different_first,
28095            #[cfg(feature = "sml-layout")]
28096            scale_with_doc: f_scale_with_doc,
28097            #[cfg(feature = "sml-layout")]
28098            align_with_margins: f_align_with_margins,
28099            #[cfg(feature = "sml-layout")]
28100            odd_header: f_odd_header,
28101            #[cfg(feature = "sml-layout")]
28102            odd_footer: f_odd_footer,
28103            #[cfg(feature = "sml-layout")]
28104            even_header: f_even_header,
28105            #[cfg(feature = "sml-layout")]
28106            even_footer: f_even_footer,
28107            #[cfg(feature = "sml-layout")]
28108            first_header: f_first_header,
28109            #[cfg(feature = "sml-layout")]
28110            first_footer: f_first_footer,
28111            #[cfg(feature = "extra-attrs")]
28112            extra_attrs,
28113            #[cfg(feature = "extra-children")]
28114            extra_children,
28115        })
28116    }
28117}
28118
28119impl FromXml for Scenarios {
28120    fn from_xml<R: BufRead>(
28121        reader: &mut Reader<R>,
28122        start_tag: &BytesStart,
28123        is_empty: bool,
28124    ) -> Result<Self, ParseError> {
28125        let mut f_current = None;
28126        let mut f_show = None;
28127        let mut f_square_reference = None;
28128        let mut f_scenario = Vec::new();
28129        #[cfg(feature = "extra-attrs")]
28130        let mut extra_attrs = std::collections::HashMap::new();
28131        #[cfg(feature = "extra-children")]
28132        let mut extra_children = Vec::new();
28133        #[cfg(feature = "extra-children")]
28134        let mut child_idx: usize = 0;
28135
28136        // Parse attributes
28137        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28138            let val = String::from_utf8_lossy(&attr.value);
28139            match attr.key.local_name().as_ref() {
28140                b"current" => {
28141                    f_current = val.parse().ok();
28142                }
28143                b"show" => {
28144                    f_show = val.parse().ok();
28145                }
28146                b"sqref" => {
28147                    f_square_reference = Some(val.into_owned());
28148                }
28149                #[cfg(feature = "extra-attrs")]
28150                unknown => {
28151                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28152                    extra_attrs.insert(key, val.into_owned());
28153                }
28154                #[cfg(not(feature = "extra-attrs"))]
28155                _ => {}
28156            }
28157        }
28158
28159        // Parse child elements
28160        if !is_empty {
28161            let mut buf = Vec::new();
28162            loop {
28163                match reader.read_event_into(&mut buf)? {
28164                    Event::Start(e) => {
28165                        match e.local_name().as_ref() {
28166                            b"scenario" => {
28167                                f_scenario.push(Scenario::from_xml(reader, &e, false)?);
28168                                #[cfg(feature = "extra-children")]
28169                                {
28170                                    child_idx += 1;
28171                                }
28172                            }
28173                            #[cfg(feature = "extra-children")]
28174                            _ => {
28175                                // Capture unknown element for roundtrip
28176                                let elem = RawXmlElement::from_reader(reader, &e)?;
28177                                extra_children.push(PositionedNode::new(
28178                                    child_idx,
28179                                    RawXmlNode::Element(elem),
28180                                ));
28181                                child_idx += 1;
28182                            }
28183                            #[cfg(not(feature = "extra-children"))]
28184                            _ => {
28185                                // Skip unknown element
28186                                skip_element(reader)?;
28187                            }
28188                        }
28189                    }
28190                    Event::Empty(e) => {
28191                        match e.local_name().as_ref() {
28192                            b"scenario" => {
28193                                f_scenario.push(Scenario::from_xml(reader, &e, true)?);
28194                                #[cfg(feature = "extra-children")]
28195                                {
28196                                    child_idx += 1;
28197                                }
28198                            }
28199                            #[cfg(feature = "extra-children")]
28200                            _ => {
28201                                // Capture unknown empty element for roundtrip
28202                                let elem = RawXmlElement::from_empty(&e);
28203                                extra_children.push(PositionedNode::new(
28204                                    child_idx,
28205                                    RawXmlNode::Element(elem),
28206                                ));
28207                                child_idx += 1;
28208                            }
28209                            #[cfg(not(feature = "extra-children"))]
28210                            _ => {}
28211                        }
28212                    }
28213                    Event::End(_) => break,
28214                    Event::Eof => break,
28215                    _ => {}
28216                }
28217                buf.clear();
28218            }
28219        }
28220
28221        Ok(Self {
28222            current: f_current,
28223            show: f_show,
28224            square_reference: f_square_reference,
28225            scenario: f_scenario,
28226            #[cfg(feature = "extra-attrs")]
28227            extra_attrs,
28228            #[cfg(feature = "extra-children")]
28229            extra_children,
28230        })
28231    }
28232}
28233
28234impl FromXml for SheetProtection {
28235    fn from_xml<R: BufRead>(
28236        reader: &mut Reader<R>,
28237        start_tag: &BytesStart,
28238        is_empty: bool,
28239    ) -> Result<Self, ParseError> {
28240        let mut f_password = None;
28241        let mut f_algorithm_name = None;
28242        let mut f_hash_value = None;
28243        let mut f_salt_value = None;
28244        let mut f_spin_count = None;
28245        let mut f_sheet = None;
28246        let mut f_objects = None;
28247        let mut f_scenarios = None;
28248        let mut f_format_cells = None;
28249        let mut f_format_columns = None;
28250        let mut f_format_rows = None;
28251        let mut f_insert_columns = None;
28252        let mut f_insert_rows = None;
28253        let mut f_insert_hyperlinks = None;
28254        let mut f_delete_columns = None;
28255        let mut f_delete_rows = None;
28256        let mut f_select_locked_cells = None;
28257        let mut f_sort = None;
28258        let mut f_auto_filter = None;
28259        let mut f_pivot_tables = None;
28260        let mut f_select_unlocked_cells = None;
28261        #[cfg(feature = "extra-attrs")]
28262        let mut extra_attrs = std::collections::HashMap::new();
28263
28264        // Parse attributes
28265        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28266            let val = String::from_utf8_lossy(&attr.value);
28267            match attr.key.local_name().as_ref() {
28268                b"password" => {
28269                    f_password = decode_hex(&val);
28270                }
28271                b"algorithmName" => {
28272                    f_algorithm_name = Some(val.into_owned());
28273                }
28274                b"hashValue" => {
28275                    f_hash_value = decode_base64(&val);
28276                }
28277                b"saltValue" => {
28278                    f_salt_value = decode_base64(&val);
28279                }
28280                b"spinCount" => {
28281                    f_spin_count = val.parse().ok();
28282                }
28283                b"sheet" => {
28284                    f_sheet = Some(val == "true" || val == "1");
28285                }
28286                b"objects" => {
28287                    f_objects = Some(val == "true" || val == "1");
28288                }
28289                b"scenarios" => {
28290                    f_scenarios = Some(val == "true" || val == "1");
28291                }
28292                b"formatCells" => {
28293                    f_format_cells = Some(val == "true" || val == "1");
28294                }
28295                b"formatColumns" => {
28296                    f_format_columns = Some(val == "true" || val == "1");
28297                }
28298                b"formatRows" => {
28299                    f_format_rows = Some(val == "true" || val == "1");
28300                }
28301                b"insertColumns" => {
28302                    f_insert_columns = Some(val == "true" || val == "1");
28303                }
28304                b"insertRows" => {
28305                    f_insert_rows = Some(val == "true" || val == "1");
28306                }
28307                b"insertHyperlinks" => {
28308                    f_insert_hyperlinks = Some(val == "true" || val == "1");
28309                }
28310                b"deleteColumns" => {
28311                    f_delete_columns = Some(val == "true" || val == "1");
28312                }
28313                b"deleteRows" => {
28314                    f_delete_rows = Some(val == "true" || val == "1");
28315                }
28316                b"selectLockedCells" => {
28317                    f_select_locked_cells = Some(val == "true" || val == "1");
28318                }
28319                b"sort" => {
28320                    f_sort = Some(val == "true" || val == "1");
28321                }
28322                b"autoFilter" => {
28323                    f_auto_filter = Some(val == "true" || val == "1");
28324                }
28325                b"pivotTables" => {
28326                    f_pivot_tables = Some(val == "true" || val == "1");
28327                }
28328                b"selectUnlockedCells" => {
28329                    f_select_unlocked_cells = Some(val == "true" || val == "1");
28330                }
28331                #[cfg(feature = "extra-attrs")]
28332                unknown => {
28333                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28334                    extra_attrs.insert(key, val.into_owned());
28335                }
28336                #[cfg(not(feature = "extra-attrs"))]
28337                _ => {}
28338            }
28339        }
28340
28341        if !is_empty {
28342            let mut buf = Vec::new();
28343            loop {
28344                match reader.read_event_into(&mut buf)? {
28345                    Event::End(_) => break,
28346                    Event::Eof => break,
28347                    _ => {}
28348                }
28349                buf.clear();
28350            }
28351        }
28352
28353        Ok(Self {
28354            password: f_password,
28355            algorithm_name: f_algorithm_name,
28356            hash_value: f_hash_value,
28357            salt_value: f_salt_value,
28358            spin_count: f_spin_count,
28359            sheet: f_sheet,
28360            objects: f_objects,
28361            scenarios: f_scenarios,
28362            format_cells: f_format_cells,
28363            format_columns: f_format_columns,
28364            format_rows: f_format_rows,
28365            insert_columns: f_insert_columns,
28366            insert_rows: f_insert_rows,
28367            insert_hyperlinks: f_insert_hyperlinks,
28368            delete_columns: f_delete_columns,
28369            delete_rows: f_delete_rows,
28370            select_locked_cells: f_select_locked_cells,
28371            sort: f_sort,
28372            auto_filter: f_auto_filter,
28373            pivot_tables: f_pivot_tables,
28374            select_unlocked_cells: f_select_unlocked_cells,
28375            #[cfg(feature = "extra-attrs")]
28376            extra_attrs,
28377        })
28378    }
28379}
28380
28381impl FromXml for ProtectedRanges {
28382    fn from_xml<R: BufRead>(
28383        reader: &mut Reader<R>,
28384        start_tag: &BytesStart,
28385        is_empty: bool,
28386    ) -> Result<Self, ParseError> {
28387        let mut f_protected_range = Vec::new();
28388        #[cfg(feature = "extra-children")]
28389        let mut extra_children = Vec::new();
28390        #[cfg(feature = "extra-children")]
28391        let mut child_idx: usize = 0;
28392
28393        // Parse child elements
28394        if !is_empty {
28395            let mut buf = Vec::new();
28396            loop {
28397                match reader.read_event_into(&mut buf)? {
28398                    Event::Start(e) => {
28399                        match e.local_name().as_ref() {
28400                            b"protectedRange" => {
28401                                f_protected_range
28402                                    .push(ProtectedRange::from_xml(reader, &e, false)?);
28403                                #[cfg(feature = "extra-children")]
28404                                {
28405                                    child_idx += 1;
28406                                }
28407                            }
28408                            #[cfg(feature = "extra-children")]
28409                            _ => {
28410                                // Capture unknown element for roundtrip
28411                                let elem = RawXmlElement::from_reader(reader, &e)?;
28412                                extra_children.push(PositionedNode::new(
28413                                    child_idx,
28414                                    RawXmlNode::Element(elem),
28415                                ));
28416                                child_idx += 1;
28417                            }
28418                            #[cfg(not(feature = "extra-children"))]
28419                            _ => {
28420                                // Skip unknown element
28421                                skip_element(reader)?;
28422                            }
28423                        }
28424                    }
28425                    Event::Empty(e) => {
28426                        match e.local_name().as_ref() {
28427                            b"protectedRange" => {
28428                                f_protected_range.push(ProtectedRange::from_xml(reader, &e, true)?);
28429                                #[cfg(feature = "extra-children")]
28430                                {
28431                                    child_idx += 1;
28432                                }
28433                            }
28434                            #[cfg(feature = "extra-children")]
28435                            _ => {
28436                                // Capture unknown empty element for roundtrip
28437                                let elem = RawXmlElement::from_empty(&e);
28438                                extra_children.push(PositionedNode::new(
28439                                    child_idx,
28440                                    RawXmlNode::Element(elem),
28441                                ));
28442                                child_idx += 1;
28443                            }
28444                            #[cfg(not(feature = "extra-children"))]
28445                            _ => {}
28446                        }
28447                    }
28448                    Event::End(_) => break,
28449                    Event::Eof => break,
28450                    _ => {}
28451                }
28452                buf.clear();
28453            }
28454        }
28455
28456        Ok(Self {
28457            protected_range: f_protected_range,
28458            #[cfg(feature = "extra-children")]
28459            extra_children,
28460        })
28461    }
28462}
28463
28464impl FromXml for ProtectedRange {
28465    fn from_xml<R: BufRead>(
28466        reader: &mut Reader<R>,
28467        start_tag: &BytesStart,
28468        is_empty: bool,
28469    ) -> Result<Self, ParseError> {
28470        let mut f_password = None;
28471        let mut f_square_reference: Option<SquareRef> = None;
28472        let mut f_name: Option<XmlString> = None;
28473        let mut f_security_descriptor = None;
28474        let mut f_algorithm_name = None;
28475        let mut f_hash_value = None;
28476        let mut f_salt_value = None;
28477        let mut f_spin_count = None;
28478        #[cfg(feature = "extra-attrs")]
28479        let mut extra_attrs = std::collections::HashMap::new();
28480
28481        // Parse attributes
28482        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28483            let val = String::from_utf8_lossy(&attr.value);
28484            match attr.key.local_name().as_ref() {
28485                b"password" => {
28486                    f_password = decode_hex(&val);
28487                }
28488                b"sqref" => {
28489                    f_square_reference = Some(val.into_owned());
28490                }
28491                b"name" => {
28492                    f_name = Some(val.into_owned());
28493                }
28494                b"securityDescriptor" => {
28495                    f_security_descriptor = Some(val.into_owned());
28496                }
28497                b"algorithmName" => {
28498                    f_algorithm_name = Some(val.into_owned());
28499                }
28500                b"hashValue" => {
28501                    f_hash_value = decode_base64(&val);
28502                }
28503                b"saltValue" => {
28504                    f_salt_value = decode_base64(&val);
28505                }
28506                b"spinCount" => {
28507                    f_spin_count = val.parse().ok();
28508                }
28509                #[cfg(feature = "extra-attrs")]
28510                unknown => {
28511                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28512                    extra_attrs.insert(key, val.into_owned());
28513                }
28514                #[cfg(not(feature = "extra-attrs"))]
28515                _ => {}
28516            }
28517        }
28518
28519        if !is_empty {
28520            let mut buf = Vec::new();
28521            loop {
28522                match reader.read_event_into(&mut buf)? {
28523                    Event::End(_) => break,
28524                    Event::Eof => break,
28525                    _ => {}
28526                }
28527                buf.clear();
28528            }
28529        }
28530
28531        Ok(Self {
28532            password: f_password,
28533            square_reference: f_square_reference
28534                .ok_or_else(|| ParseError::MissingAttribute("sqref".to_string()))?,
28535            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
28536            security_descriptor: f_security_descriptor,
28537            algorithm_name: f_algorithm_name,
28538            hash_value: f_hash_value,
28539            salt_value: f_salt_value,
28540            spin_count: f_spin_count,
28541            #[cfg(feature = "extra-attrs")]
28542            extra_attrs,
28543        })
28544    }
28545}
28546
28547impl FromXml for Scenario {
28548    fn from_xml<R: BufRead>(
28549        reader: &mut Reader<R>,
28550        start_tag: &BytesStart,
28551        is_empty: bool,
28552    ) -> Result<Self, ParseError> {
28553        let mut f_name: Option<XmlString> = None;
28554        let mut f_locked = None;
28555        let mut f_hidden = None;
28556        let mut f_count = None;
28557        let mut f_user = None;
28558        let mut f_comment = None;
28559        let mut f_input_cells = Vec::new();
28560        #[cfg(feature = "extra-attrs")]
28561        let mut extra_attrs = std::collections::HashMap::new();
28562        #[cfg(feature = "extra-children")]
28563        let mut extra_children = Vec::new();
28564        #[cfg(feature = "extra-children")]
28565        let mut child_idx: usize = 0;
28566
28567        // Parse attributes
28568        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28569            let val = String::from_utf8_lossy(&attr.value);
28570            match attr.key.local_name().as_ref() {
28571                b"name" => {
28572                    f_name = Some(val.into_owned());
28573                }
28574                b"locked" => {
28575                    f_locked = Some(val == "true" || val == "1");
28576                }
28577                b"hidden" => {
28578                    f_hidden = Some(val == "true" || val == "1");
28579                }
28580                b"count" => {
28581                    f_count = val.parse().ok();
28582                }
28583                b"user" => {
28584                    f_user = Some(val.into_owned());
28585                }
28586                b"comment" => {
28587                    f_comment = Some(val.into_owned());
28588                }
28589                #[cfg(feature = "extra-attrs")]
28590                unknown => {
28591                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28592                    extra_attrs.insert(key, val.into_owned());
28593                }
28594                #[cfg(not(feature = "extra-attrs"))]
28595                _ => {}
28596            }
28597        }
28598
28599        // Parse child elements
28600        if !is_empty {
28601            let mut buf = Vec::new();
28602            loop {
28603                match reader.read_event_into(&mut buf)? {
28604                    Event::Start(e) => {
28605                        match e.local_name().as_ref() {
28606                            b"inputCells" => {
28607                                f_input_cells.push(InputCells::from_xml(reader, &e, false)?);
28608                                #[cfg(feature = "extra-children")]
28609                                {
28610                                    child_idx += 1;
28611                                }
28612                            }
28613                            #[cfg(feature = "extra-children")]
28614                            _ => {
28615                                // Capture unknown element for roundtrip
28616                                let elem = RawXmlElement::from_reader(reader, &e)?;
28617                                extra_children.push(PositionedNode::new(
28618                                    child_idx,
28619                                    RawXmlNode::Element(elem),
28620                                ));
28621                                child_idx += 1;
28622                            }
28623                            #[cfg(not(feature = "extra-children"))]
28624                            _ => {
28625                                // Skip unknown element
28626                                skip_element(reader)?;
28627                            }
28628                        }
28629                    }
28630                    Event::Empty(e) => {
28631                        match e.local_name().as_ref() {
28632                            b"inputCells" => {
28633                                f_input_cells.push(InputCells::from_xml(reader, &e, true)?);
28634                                #[cfg(feature = "extra-children")]
28635                                {
28636                                    child_idx += 1;
28637                                }
28638                            }
28639                            #[cfg(feature = "extra-children")]
28640                            _ => {
28641                                // Capture unknown empty element for roundtrip
28642                                let elem = RawXmlElement::from_empty(&e);
28643                                extra_children.push(PositionedNode::new(
28644                                    child_idx,
28645                                    RawXmlNode::Element(elem),
28646                                ));
28647                                child_idx += 1;
28648                            }
28649                            #[cfg(not(feature = "extra-children"))]
28650                            _ => {}
28651                        }
28652                    }
28653                    Event::End(_) => break,
28654                    Event::Eof => break,
28655                    _ => {}
28656                }
28657                buf.clear();
28658            }
28659        }
28660
28661        Ok(Self {
28662            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
28663            locked: f_locked,
28664            hidden: f_hidden,
28665            count: f_count,
28666            user: f_user,
28667            comment: f_comment,
28668            input_cells: f_input_cells,
28669            #[cfg(feature = "extra-attrs")]
28670            extra_attrs,
28671            #[cfg(feature = "extra-children")]
28672            extra_children,
28673        })
28674    }
28675}
28676
28677impl FromXml for InputCells {
28678    fn from_xml<R: BufRead>(
28679        reader: &mut Reader<R>,
28680        start_tag: &BytesStart,
28681        is_empty: bool,
28682    ) -> Result<Self, ParseError> {
28683        let mut f_reference: Option<CellRef> = None;
28684        let mut f_deleted = None;
28685        let mut f_undone = None;
28686        let mut f_value: Option<XmlString> = None;
28687        let mut f_number_format_id = None;
28688        #[cfg(feature = "extra-attrs")]
28689        let mut extra_attrs = std::collections::HashMap::new();
28690
28691        // Parse attributes
28692        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28693            let val = String::from_utf8_lossy(&attr.value);
28694            match attr.key.local_name().as_ref() {
28695                b"r" => {
28696                    f_reference = Some(val.into_owned());
28697                }
28698                b"deleted" => {
28699                    f_deleted = Some(val == "true" || val == "1");
28700                }
28701                b"undone" => {
28702                    f_undone = Some(val == "true" || val == "1");
28703                }
28704                b"val" => {
28705                    f_value = Some(val.into_owned());
28706                }
28707                b"numFmtId" => {
28708                    f_number_format_id = val.parse().ok();
28709                }
28710                #[cfg(feature = "extra-attrs")]
28711                unknown => {
28712                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28713                    extra_attrs.insert(key, val.into_owned());
28714                }
28715                #[cfg(not(feature = "extra-attrs"))]
28716                _ => {}
28717            }
28718        }
28719
28720        if !is_empty {
28721            let mut buf = Vec::new();
28722            loop {
28723                match reader.read_event_into(&mut buf)? {
28724                    Event::End(_) => break,
28725                    Event::Eof => break,
28726                    _ => {}
28727                }
28728                buf.clear();
28729            }
28730        }
28731
28732        Ok(Self {
28733            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
28734            deleted: f_deleted,
28735            undone: f_undone,
28736            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
28737            number_format_id: f_number_format_id,
28738            #[cfg(feature = "extra-attrs")]
28739            extra_attrs,
28740        })
28741    }
28742}
28743
28744impl FromXml for CellWatches {
28745    fn from_xml<R: BufRead>(
28746        reader: &mut Reader<R>,
28747        start_tag: &BytesStart,
28748        is_empty: bool,
28749    ) -> Result<Self, ParseError> {
28750        let mut f_cell_watch = Vec::new();
28751        #[cfg(feature = "extra-children")]
28752        let mut extra_children = Vec::new();
28753        #[cfg(feature = "extra-children")]
28754        let mut child_idx: usize = 0;
28755
28756        // Parse child elements
28757        if !is_empty {
28758            let mut buf = Vec::new();
28759            loop {
28760                match reader.read_event_into(&mut buf)? {
28761                    Event::Start(e) => {
28762                        match e.local_name().as_ref() {
28763                            b"cellWatch" => {
28764                                f_cell_watch.push(CellWatch::from_xml(reader, &e, false)?);
28765                                #[cfg(feature = "extra-children")]
28766                                {
28767                                    child_idx += 1;
28768                                }
28769                            }
28770                            #[cfg(feature = "extra-children")]
28771                            _ => {
28772                                // Capture unknown element for roundtrip
28773                                let elem = RawXmlElement::from_reader(reader, &e)?;
28774                                extra_children.push(PositionedNode::new(
28775                                    child_idx,
28776                                    RawXmlNode::Element(elem),
28777                                ));
28778                                child_idx += 1;
28779                            }
28780                            #[cfg(not(feature = "extra-children"))]
28781                            _ => {
28782                                // Skip unknown element
28783                                skip_element(reader)?;
28784                            }
28785                        }
28786                    }
28787                    Event::Empty(e) => {
28788                        match e.local_name().as_ref() {
28789                            b"cellWatch" => {
28790                                f_cell_watch.push(CellWatch::from_xml(reader, &e, true)?);
28791                                #[cfg(feature = "extra-children")]
28792                                {
28793                                    child_idx += 1;
28794                                }
28795                            }
28796                            #[cfg(feature = "extra-children")]
28797                            _ => {
28798                                // Capture unknown empty element for roundtrip
28799                                let elem = RawXmlElement::from_empty(&e);
28800                                extra_children.push(PositionedNode::new(
28801                                    child_idx,
28802                                    RawXmlNode::Element(elem),
28803                                ));
28804                                child_idx += 1;
28805                            }
28806                            #[cfg(not(feature = "extra-children"))]
28807                            _ => {}
28808                        }
28809                    }
28810                    Event::End(_) => break,
28811                    Event::Eof => break,
28812                    _ => {}
28813                }
28814                buf.clear();
28815            }
28816        }
28817
28818        Ok(Self {
28819            cell_watch: f_cell_watch,
28820            #[cfg(feature = "extra-children")]
28821            extra_children,
28822        })
28823    }
28824}
28825
28826impl FromXml for CellWatch {
28827    fn from_xml<R: BufRead>(
28828        reader: &mut Reader<R>,
28829        start_tag: &BytesStart,
28830        is_empty: bool,
28831    ) -> Result<Self, ParseError> {
28832        let mut f_reference: Option<CellRef> = None;
28833        #[cfg(feature = "extra-attrs")]
28834        let mut extra_attrs = std::collections::HashMap::new();
28835
28836        // Parse attributes
28837        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
28838            let val = String::from_utf8_lossy(&attr.value);
28839            match attr.key.local_name().as_ref() {
28840                b"r" => {
28841                    f_reference = Some(val.into_owned());
28842                }
28843                #[cfg(feature = "extra-attrs")]
28844                unknown => {
28845                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
28846                    extra_attrs.insert(key, val.into_owned());
28847                }
28848                #[cfg(not(feature = "extra-attrs"))]
28849                _ => {}
28850            }
28851        }
28852
28853        if !is_empty {
28854            let mut buf = Vec::new();
28855            loop {
28856                match reader.read_event_into(&mut buf)? {
28857                    Event::End(_) => break,
28858                    Event::Eof => break,
28859                    _ => {}
28860                }
28861                buf.clear();
28862            }
28863        }
28864
28865        Ok(Self {
28866            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
28867            #[cfg(feature = "extra-attrs")]
28868            extra_attrs,
28869        })
28870    }
28871}
28872
28873impl FromXml for Chartsheet {
28874    fn from_xml<R: BufRead>(
28875        reader: &mut Reader<R>,
28876        start_tag: &BytesStart,
28877        is_empty: bool,
28878    ) -> Result<Self, ParseError> {
28879        let mut f_sheet_properties = None;
28880        let mut f_sheet_views: Option<Box<ChartsheetViews>> = None;
28881        let mut f_sheet_protection = None;
28882        let mut f_custom_sheet_views = None;
28883        let mut f_page_margins = None;
28884        let mut f_page_setup = None;
28885        let mut f_header_footer = None;
28886        let mut f_drawing: Option<Box<Drawing>> = None;
28887        let mut f_legacy_drawing = None;
28888        let mut f_legacy_drawing_h_f = None;
28889        let mut f_drawing_h_f = None;
28890        let mut f_picture = None;
28891        let mut f_web_publish_items = None;
28892        let mut f_extension_list = None;
28893        #[cfg(feature = "extra-children")]
28894        let mut extra_children = Vec::new();
28895        #[cfg(feature = "extra-children")]
28896        let mut child_idx: usize = 0;
28897
28898        // Parse child elements
28899        if !is_empty {
28900            let mut buf = Vec::new();
28901            loop {
28902                match reader.read_event_into(&mut buf)? {
28903                    Event::Start(e) => {
28904                        match e.local_name().as_ref() {
28905                            b"sheetPr" => {
28906                                f_sheet_properties = Some(Box::new(
28907                                    ChartsheetProperties::from_xml(reader, &e, false)?,
28908                                ));
28909                                #[cfg(feature = "extra-children")]
28910                                {
28911                                    child_idx += 1;
28912                                }
28913                            }
28914                            b"sheetViews" => {
28915                                f_sheet_views =
28916                                    Some(Box::new(ChartsheetViews::from_xml(reader, &e, false)?));
28917                                #[cfg(feature = "extra-children")]
28918                                {
28919                                    child_idx += 1;
28920                                }
28921                            }
28922                            b"sheetProtection" => {
28923                                f_sheet_protection = Some(Box::new(
28924                                    ChartsheetProtection::from_xml(reader, &e, false)?,
28925                                ));
28926                                #[cfg(feature = "extra-children")]
28927                                {
28928                                    child_idx += 1;
28929                                }
28930                            }
28931                            b"customSheetViews" => {
28932                                f_custom_sheet_views = Some(Box::new(
28933                                    CustomChartsheetViews::from_xml(reader, &e, false)?,
28934                                ));
28935                                #[cfg(feature = "extra-children")]
28936                                {
28937                                    child_idx += 1;
28938                                }
28939                            }
28940                            b"pageMargins" => {
28941                                f_page_margins =
28942                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
28943                                #[cfg(feature = "extra-children")]
28944                                {
28945                                    child_idx += 1;
28946                                }
28947                            }
28948                            b"pageSetup" => {
28949                                f_page_setup = Some(Box::new(ChartsheetPageSetup::from_xml(
28950                                    reader, &e, false,
28951                                )?));
28952                                #[cfg(feature = "extra-children")]
28953                                {
28954                                    child_idx += 1;
28955                                }
28956                            }
28957                            b"headerFooter" => {
28958                                f_header_footer =
28959                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
28960                                #[cfg(feature = "extra-children")]
28961                                {
28962                                    child_idx += 1;
28963                                }
28964                            }
28965                            b"drawing" => {
28966                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, false)?));
28967                                #[cfg(feature = "extra-children")]
28968                                {
28969                                    child_idx += 1;
28970                                }
28971                            }
28972                            b"legacyDrawing" => {
28973                                f_legacy_drawing =
28974                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
28975                                #[cfg(feature = "extra-children")]
28976                                {
28977                                    child_idx += 1;
28978                                }
28979                            }
28980                            b"legacyDrawingHF" => {
28981                                f_legacy_drawing_h_f =
28982                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, false)?));
28983                                #[cfg(feature = "extra-children")]
28984                                {
28985                                    child_idx += 1;
28986                                }
28987                            }
28988                            b"drawingHF" => {
28989                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
28990                                    reader, &e, false,
28991                                )?));
28992                                #[cfg(feature = "extra-children")]
28993                                {
28994                                    child_idx += 1;
28995                                }
28996                            }
28997                            b"picture" => {
28998                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
28999                                    reader, &e, false,
29000                                )?));
29001                                #[cfg(feature = "extra-children")]
29002                                {
29003                                    child_idx += 1;
29004                                }
29005                            }
29006                            b"webPublishItems" => {
29007                                f_web_publish_items =
29008                                    Some(Box::new(WebPublishItems::from_xml(reader, &e, false)?));
29009                                #[cfg(feature = "extra-children")]
29010                                {
29011                                    child_idx += 1;
29012                                }
29013                            }
29014                            b"extLst" => {
29015                                f_extension_list =
29016                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
29017                                #[cfg(feature = "extra-children")]
29018                                {
29019                                    child_idx += 1;
29020                                }
29021                            }
29022                            #[cfg(feature = "extra-children")]
29023                            _ => {
29024                                // Capture unknown element for roundtrip
29025                                let elem = RawXmlElement::from_reader(reader, &e)?;
29026                                extra_children.push(PositionedNode::new(
29027                                    child_idx,
29028                                    RawXmlNode::Element(elem),
29029                                ));
29030                                child_idx += 1;
29031                            }
29032                            #[cfg(not(feature = "extra-children"))]
29033                            _ => {
29034                                // Skip unknown element
29035                                skip_element(reader)?;
29036                            }
29037                        }
29038                    }
29039                    Event::Empty(e) => {
29040                        match e.local_name().as_ref() {
29041                            b"sheetPr" => {
29042                                f_sheet_properties = Some(Box::new(
29043                                    ChartsheetProperties::from_xml(reader, &e, true)?,
29044                                ));
29045                                #[cfg(feature = "extra-children")]
29046                                {
29047                                    child_idx += 1;
29048                                }
29049                            }
29050                            b"sheetViews" => {
29051                                f_sheet_views =
29052                                    Some(Box::new(ChartsheetViews::from_xml(reader, &e, true)?));
29053                                #[cfg(feature = "extra-children")]
29054                                {
29055                                    child_idx += 1;
29056                                }
29057                            }
29058                            b"sheetProtection" => {
29059                                f_sheet_protection = Some(Box::new(
29060                                    ChartsheetProtection::from_xml(reader, &e, true)?,
29061                                ));
29062                                #[cfg(feature = "extra-children")]
29063                                {
29064                                    child_idx += 1;
29065                                }
29066                            }
29067                            b"customSheetViews" => {
29068                                f_custom_sheet_views = Some(Box::new(
29069                                    CustomChartsheetViews::from_xml(reader, &e, true)?,
29070                                ));
29071                                #[cfg(feature = "extra-children")]
29072                                {
29073                                    child_idx += 1;
29074                                }
29075                            }
29076                            b"pageMargins" => {
29077                                f_page_margins =
29078                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
29079                                #[cfg(feature = "extra-children")]
29080                                {
29081                                    child_idx += 1;
29082                                }
29083                            }
29084                            b"pageSetup" => {
29085                                f_page_setup = Some(Box::new(ChartsheetPageSetup::from_xml(
29086                                    reader, &e, true,
29087                                )?));
29088                                #[cfg(feature = "extra-children")]
29089                                {
29090                                    child_idx += 1;
29091                                }
29092                            }
29093                            b"headerFooter" => {
29094                                f_header_footer =
29095                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
29096                                #[cfg(feature = "extra-children")]
29097                                {
29098                                    child_idx += 1;
29099                                }
29100                            }
29101                            b"drawing" => {
29102                                f_drawing = Some(Box::new(Drawing::from_xml(reader, &e, true)?));
29103                                #[cfg(feature = "extra-children")]
29104                                {
29105                                    child_idx += 1;
29106                                }
29107                            }
29108                            b"legacyDrawing" => {
29109                                f_legacy_drawing =
29110                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
29111                                #[cfg(feature = "extra-children")]
29112                                {
29113                                    child_idx += 1;
29114                                }
29115                            }
29116                            b"legacyDrawingHF" => {
29117                                f_legacy_drawing_h_f =
29118                                    Some(Box::new(LegacyDrawing::from_xml(reader, &e, true)?));
29119                                #[cfg(feature = "extra-children")]
29120                                {
29121                                    child_idx += 1;
29122                                }
29123                            }
29124                            b"drawingHF" => {
29125                                f_drawing_h_f = Some(Box::new(DrawingHeaderFooter::from_xml(
29126                                    reader, &e, true,
29127                                )?));
29128                                #[cfg(feature = "extra-children")]
29129                                {
29130                                    child_idx += 1;
29131                                }
29132                            }
29133                            b"picture" => {
29134                                f_picture = Some(Box::new(SheetBackgroundPicture::from_xml(
29135                                    reader, &e, true,
29136                                )?));
29137                                #[cfg(feature = "extra-children")]
29138                                {
29139                                    child_idx += 1;
29140                                }
29141                            }
29142                            b"webPublishItems" => {
29143                                f_web_publish_items =
29144                                    Some(Box::new(WebPublishItems::from_xml(reader, &e, true)?));
29145                                #[cfg(feature = "extra-children")]
29146                                {
29147                                    child_idx += 1;
29148                                }
29149                            }
29150                            b"extLst" => {
29151                                f_extension_list =
29152                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
29153                                #[cfg(feature = "extra-children")]
29154                                {
29155                                    child_idx += 1;
29156                                }
29157                            }
29158                            #[cfg(feature = "extra-children")]
29159                            _ => {
29160                                // Capture unknown empty element for roundtrip
29161                                let elem = RawXmlElement::from_empty(&e);
29162                                extra_children.push(PositionedNode::new(
29163                                    child_idx,
29164                                    RawXmlNode::Element(elem),
29165                                ));
29166                                child_idx += 1;
29167                            }
29168                            #[cfg(not(feature = "extra-children"))]
29169                            _ => {}
29170                        }
29171                    }
29172                    Event::End(_) => break,
29173                    Event::Eof => break,
29174                    _ => {}
29175                }
29176                buf.clear();
29177            }
29178        }
29179
29180        Ok(Self {
29181            sheet_properties: f_sheet_properties,
29182            sheet_views: f_sheet_views
29183                .ok_or_else(|| ParseError::MissingAttribute("sheetViews".to_string()))?,
29184            sheet_protection: f_sheet_protection,
29185            custom_sheet_views: f_custom_sheet_views,
29186            page_margins: f_page_margins,
29187            page_setup: f_page_setup,
29188            header_footer: f_header_footer,
29189            drawing: f_drawing
29190                .ok_or_else(|| ParseError::MissingAttribute("drawing".to_string()))?,
29191            legacy_drawing: f_legacy_drawing,
29192            legacy_drawing_h_f: f_legacy_drawing_h_f,
29193            drawing_h_f: f_drawing_h_f,
29194            picture: f_picture,
29195            web_publish_items: f_web_publish_items,
29196            extension_list: f_extension_list,
29197            #[cfg(feature = "extra-children")]
29198            extra_children,
29199        })
29200    }
29201}
29202
29203impl FromXml for ChartsheetProperties {
29204    fn from_xml<R: BufRead>(
29205        reader: &mut Reader<R>,
29206        start_tag: &BytesStart,
29207        is_empty: bool,
29208    ) -> Result<Self, ParseError> {
29209        let mut f_published = None;
29210        let mut f_code_name = None;
29211        let mut f_tab_color = None;
29212        #[cfg(feature = "extra-attrs")]
29213        let mut extra_attrs = std::collections::HashMap::new();
29214        #[cfg(feature = "extra-children")]
29215        let mut extra_children = Vec::new();
29216        #[cfg(feature = "extra-children")]
29217        let mut child_idx: usize = 0;
29218
29219        // Parse attributes
29220        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
29221            let val = String::from_utf8_lossy(&attr.value);
29222            match attr.key.local_name().as_ref() {
29223                b"published" => {
29224                    f_published = Some(val == "true" || val == "1");
29225                }
29226                b"codeName" => {
29227                    f_code_name = Some(val.into_owned());
29228                }
29229                #[cfg(feature = "extra-attrs")]
29230                unknown => {
29231                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
29232                    extra_attrs.insert(key, val.into_owned());
29233                }
29234                #[cfg(not(feature = "extra-attrs"))]
29235                _ => {}
29236            }
29237        }
29238
29239        // Parse child elements
29240        if !is_empty {
29241            let mut buf = Vec::new();
29242            loop {
29243                match reader.read_event_into(&mut buf)? {
29244                    Event::Start(e) => {
29245                        match e.local_name().as_ref() {
29246                            b"tabColor" => {
29247                                f_tab_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
29248                                #[cfg(feature = "extra-children")]
29249                                {
29250                                    child_idx += 1;
29251                                }
29252                            }
29253                            #[cfg(feature = "extra-children")]
29254                            _ => {
29255                                // Capture unknown element for roundtrip
29256                                let elem = RawXmlElement::from_reader(reader, &e)?;
29257                                extra_children.push(PositionedNode::new(
29258                                    child_idx,
29259                                    RawXmlNode::Element(elem),
29260                                ));
29261                                child_idx += 1;
29262                            }
29263                            #[cfg(not(feature = "extra-children"))]
29264                            _ => {
29265                                // Skip unknown element
29266                                skip_element(reader)?;
29267                            }
29268                        }
29269                    }
29270                    Event::Empty(e) => {
29271                        match e.local_name().as_ref() {
29272                            b"tabColor" => {
29273                                f_tab_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
29274                                #[cfg(feature = "extra-children")]
29275                                {
29276                                    child_idx += 1;
29277                                }
29278                            }
29279                            #[cfg(feature = "extra-children")]
29280                            _ => {
29281                                // Capture unknown empty element for roundtrip
29282                                let elem = RawXmlElement::from_empty(&e);
29283                                extra_children.push(PositionedNode::new(
29284                                    child_idx,
29285                                    RawXmlNode::Element(elem),
29286                                ));
29287                                child_idx += 1;
29288                            }
29289                            #[cfg(not(feature = "extra-children"))]
29290                            _ => {}
29291                        }
29292                    }
29293                    Event::End(_) => break,
29294                    Event::Eof => break,
29295                    _ => {}
29296                }
29297                buf.clear();
29298            }
29299        }
29300
29301        Ok(Self {
29302            published: f_published,
29303            code_name: f_code_name,
29304            tab_color: f_tab_color,
29305            #[cfg(feature = "extra-attrs")]
29306            extra_attrs,
29307            #[cfg(feature = "extra-children")]
29308            extra_children,
29309        })
29310    }
29311}
29312
29313impl FromXml for ChartsheetViews {
29314    fn from_xml<R: BufRead>(
29315        reader: &mut Reader<R>,
29316        start_tag: &BytesStart,
29317        is_empty: bool,
29318    ) -> Result<Self, ParseError> {
29319        let mut f_sheet_view = Vec::new();
29320        let mut f_extension_list = None;
29321        #[cfg(feature = "extra-children")]
29322        let mut extra_children = Vec::new();
29323        #[cfg(feature = "extra-children")]
29324        let mut child_idx: usize = 0;
29325
29326        // Parse child elements
29327        if !is_empty {
29328            let mut buf = Vec::new();
29329            loop {
29330                match reader.read_event_into(&mut buf)? {
29331                    Event::Start(e) => {
29332                        match e.local_name().as_ref() {
29333                            b"sheetView" => {
29334                                f_sheet_view.push(ChartsheetView::from_xml(reader, &e, false)?);
29335                                #[cfg(feature = "extra-children")]
29336                                {
29337                                    child_idx += 1;
29338                                }
29339                            }
29340                            b"extLst" => {
29341                                f_extension_list =
29342                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
29343                                #[cfg(feature = "extra-children")]
29344                                {
29345                                    child_idx += 1;
29346                                }
29347                            }
29348                            #[cfg(feature = "extra-children")]
29349                            _ => {
29350                                // Capture unknown element for roundtrip
29351                                let elem = RawXmlElement::from_reader(reader, &e)?;
29352                                extra_children.push(PositionedNode::new(
29353                                    child_idx,
29354                                    RawXmlNode::Element(elem),
29355                                ));
29356                                child_idx += 1;
29357                            }
29358                            #[cfg(not(feature = "extra-children"))]
29359                            _ => {
29360                                // Skip unknown element
29361                                skip_element(reader)?;
29362                            }
29363                        }
29364                    }
29365                    Event::Empty(e) => {
29366                        match e.local_name().as_ref() {
29367                            b"sheetView" => {
29368                                f_sheet_view.push(ChartsheetView::from_xml(reader, &e, true)?);
29369                                #[cfg(feature = "extra-children")]
29370                                {
29371                                    child_idx += 1;
29372                                }
29373                            }
29374                            b"extLst" => {
29375                                f_extension_list =
29376                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
29377                                #[cfg(feature = "extra-children")]
29378                                {
29379                                    child_idx += 1;
29380                                }
29381                            }
29382                            #[cfg(feature = "extra-children")]
29383                            _ => {
29384                                // Capture unknown empty element for roundtrip
29385                                let elem = RawXmlElement::from_empty(&e);
29386                                extra_children.push(PositionedNode::new(
29387                                    child_idx,
29388                                    RawXmlNode::Element(elem),
29389                                ));
29390                                child_idx += 1;
29391                            }
29392                            #[cfg(not(feature = "extra-children"))]
29393                            _ => {}
29394                        }
29395                    }
29396                    Event::End(_) => break,
29397                    Event::Eof => break,
29398                    _ => {}
29399                }
29400                buf.clear();
29401            }
29402        }
29403
29404        Ok(Self {
29405            sheet_view: f_sheet_view,
29406            extension_list: f_extension_list,
29407            #[cfg(feature = "extra-children")]
29408            extra_children,
29409        })
29410    }
29411}
29412
29413impl FromXml for ChartsheetView {
29414    fn from_xml<R: BufRead>(
29415        reader: &mut Reader<R>,
29416        start_tag: &BytesStart,
29417        is_empty: bool,
29418    ) -> Result<Self, ParseError> {
29419        let mut f_tab_selected = None;
29420        let mut f_zoom_scale = None;
29421        let mut f_workbook_view_id: Option<u32> = None;
29422        let mut f_zoom_to_fit = None;
29423        let mut f_extension_list = None;
29424        #[cfg(feature = "extra-attrs")]
29425        let mut extra_attrs = std::collections::HashMap::new();
29426        #[cfg(feature = "extra-children")]
29427        let mut extra_children = Vec::new();
29428        #[cfg(feature = "extra-children")]
29429        let mut child_idx: usize = 0;
29430
29431        // Parse attributes
29432        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
29433            let val = String::from_utf8_lossy(&attr.value);
29434            match attr.key.local_name().as_ref() {
29435                b"tabSelected" => {
29436                    f_tab_selected = Some(val == "true" || val == "1");
29437                }
29438                b"zoomScale" => {
29439                    f_zoom_scale = val.parse().ok();
29440                }
29441                b"workbookViewId" => {
29442                    f_workbook_view_id = val.parse().ok();
29443                }
29444                b"zoomToFit" => {
29445                    f_zoom_to_fit = Some(val == "true" || val == "1");
29446                }
29447                #[cfg(feature = "extra-attrs")]
29448                unknown => {
29449                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
29450                    extra_attrs.insert(key, val.into_owned());
29451                }
29452                #[cfg(not(feature = "extra-attrs"))]
29453                _ => {}
29454            }
29455        }
29456
29457        // Parse child elements
29458        if !is_empty {
29459            let mut buf = Vec::new();
29460            loop {
29461                match reader.read_event_into(&mut buf)? {
29462                    Event::Start(e) => {
29463                        match e.local_name().as_ref() {
29464                            b"extLst" => {
29465                                f_extension_list =
29466                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
29467                                #[cfg(feature = "extra-children")]
29468                                {
29469                                    child_idx += 1;
29470                                }
29471                            }
29472                            #[cfg(feature = "extra-children")]
29473                            _ => {
29474                                // Capture unknown element for roundtrip
29475                                let elem = RawXmlElement::from_reader(reader, &e)?;
29476                                extra_children.push(PositionedNode::new(
29477                                    child_idx,
29478                                    RawXmlNode::Element(elem),
29479                                ));
29480                                child_idx += 1;
29481                            }
29482                            #[cfg(not(feature = "extra-children"))]
29483                            _ => {
29484                                // Skip unknown element
29485                                skip_element(reader)?;
29486                            }
29487                        }
29488                    }
29489                    Event::Empty(e) => {
29490                        match e.local_name().as_ref() {
29491                            b"extLst" => {
29492                                f_extension_list =
29493                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
29494                                #[cfg(feature = "extra-children")]
29495                                {
29496                                    child_idx += 1;
29497                                }
29498                            }
29499                            #[cfg(feature = "extra-children")]
29500                            _ => {
29501                                // Capture unknown empty element for roundtrip
29502                                let elem = RawXmlElement::from_empty(&e);
29503                                extra_children.push(PositionedNode::new(
29504                                    child_idx,
29505                                    RawXmlNode::Element(elem),
29506                                ));
29507                                child_idx += 1;
29508                            }
29509                            #[cfg(not(feature = "extra-children"))]
29510                            _ => {}
29511                        }
29512                    }
29513                    Event::End(_) => break,
29514                    Event::Eof => break,
29515                    _ => {}
29516                }
29517                buf.clear();
29518            }
29519        }
29520
29521        Ok(Self {
29522            tab_selected: f_tab_selected,
29523            zoom_scale: f_zoom_scale,
29524            workbook_view_id: f_workbook_view_id
29525                .ok_or_else(|| ParseError::MissingAttribute("workbookViewId".to_string()))?,
29526            zoom_to_fit: f_zoom_to_fit,
29527            extension_list: f_extension_list,
29528            #[cfg(feature = "extra-attrs")]
29529            extra_attrs,
29530            #[cfg(feature = "extra-children")]
29531            extra_children,
29532        })
29533    }
29534}
29535
29536impl FromXml for ChartsheetProtection {
29537    fn from_xml<R: BufRead>(
29538        reader: &mut Reader<R>,
29539        start_tag: &BytesStart,
29540        is_empty: bool,
29541    ) -> Result<Self, ParseError> {
29542        let mut f_password = None;
29543        let mut f_algorithm_name = None;
29544        let mut f_hash_value = None;
29545        let mut f_salt_value = None;
29546        let mut f_spin_count = None;
29547        let mut f_content = None;
29548        let mut f_objects = None;
29549        #[cfg(feature = "extra-attrs")]
29550        let mut extra_attrs = std::collections::HashMap::new();
29551
29552        // Parse attributes
29553        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
29554            let val = String::from_utf8_lossy(&attr.value);
29555            match attr.key.local_name().as_ref() {
29556                b"password" => {
29557                    f_password = decode_hex(&val);
29558                }
29559                b"algorithmName" => {
29560                    f_algorithm_name = Some(val.into_owned());
29561                }
29562                b"hashValue" => {
29563                    f_hash_value = decode_base64(&val);
29564                }
29565                b"saltValue" => {
29566                    f_salt_value = decode_base64(&val);
29567                }
29568                b"spinCount" => {
29569                    f_spin_count = val.parse().ok();
29570                }
29571                b"content" => {
29572                    f_content = Some(val == "true" || val == "1");
29573                }
29574                b"objects" => {
29575                    f_objects = Some(val == "true" || val == "1");
29576                }
29577                #[cfg(feature = "extra-attrs")]
29578                unknown => {
29579                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
29580                    extra_attrs.insert(key, val.into_owned());
29581                }
29582                #[cfg(not(feature = "extra-attrs"))]
29583                _ => {}
29584            }
29585        }
29586
29587        if !is_empty {
29588            let mut buf = Vec::new();
29589            loop {
29590                match reader.read_event_into(&mut buf)? {
29591                    Event::End(_) => break,
29592                    Event::Eof => break,
29593                    _ => {}
29594                }
29595                buf.clear();
29596            }
29597        }
29598
29599        Ok(Self {
29600            password: f_password,
29601            algorithm_name: f_algorithm_name,
29602            hash_value: f_hash_value,
29603            salt_value: f_salt_value,
29604            spin_count: f_spin_count,
29605            content: f_content,
29606            objects: f_objects,
29607            #[cfg(feature = "extra-attrs")]
29608            extra_attrs,
29609        })
29610    }
29611}
29612
29613impl FromXml for ChartsheetPageSetup {
29614    fn from_xml<R: BufRead>(
29615        reader: &mut Reader<R>,
29616        start_tag: &BytesStart,
29617        is_empty: bool,
29618    ) -> Result<Self, ParseError> {
29619        let mut f_paper_size = None;
29620        let mut f_paper_height = None;
29621        let mut f_paper_width = None;
29622        let mut f_first_page_number = None;
29623        let mut f_orientation = None;
29624        let mut f_use_printer_defaults = None;
29625        let mut f_black_and_white = None;
29626        let mut f_draft = None;
29627        let mut f_use_first_page_number = None;
29628        let mut f_horizontal_dpi = None;
29629        let mut f_vertical_dpi = None;
29630        let mut f_copies = None;
29631        let mut f_id = None;
29632        #[cfg(feature = "extra-attrs")]
29633        let mut extra_attrs = std::collections::HashMap::new();
29634
29635        // Parse attributes
29636        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
29637            let val = String::from_utf8_lossy(&attr.value);
29638            match attr.key.local_name().as_ref() {
29639                b"paperSize" => {
29640                    f_paper_size = val.parse().ok();
29641                }
29642                b"paperHeight" => {
29643                    f_paper_height = Some(val.into_owned());
29644                }
29645                b"paperWidth" => {
29646                    f_paper_width = Some(val.into_owned());
29647                }
29648                b"firstPageNumber" => {
29649                    f_first_page_number = val.parse().ok();
29650                }
29651                b"orientation" => {
29652                    f_orientation = val.parse().ok();
29653                }
29654                b"usePrinterDefaults" => {
29655                    f_use_printer_defaults = Some(val == "true" || val == "1");
29656                }
29657                b"blackAndWhite" => {
29658                    f_black_and_white = Some(val == "true" || val == "1");
29659                }
29660                b"draft" => {
29661                    f_draft = Some(val == "true" || val == "1");
29662                }
29663                b"useFirstPageNumber" => {
29664                    f_use_first_page_number = Some(val == "true" || val == "1");
29665                }
29666                b"horizontalDpi" => {
29667                    f_horizontal_dpi = val.parse().ok();
29668                }
29669                b"verticalDpi" => {
29670                    f_vertical_dpi = val.parse().ok();
29671                }
29672                b"copies" => {
29673                    f_copies = val.parse().ok();
29674                }
29675                b"id" => {
29676                    f_id = Some(val.into_owned());
29677                }
29678                #[cfg(feature = "extra-attrs")]
29679                unknown => {
29680                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
29681                    extra_attrs.insert(key, val.into_owned());
29682                }
29683                #[cfg(not(feature = "extra-attrs"))]
29684                _ => {}
29685            }
29686        }
29687
29688        if !is_empty {
29689            let mut buf = Vec::new();
29690            loop {
29691                match reader.read_event_into(&mut buf)? {
29692                    Event::End(_) => break,
29693                    Event::Eof => break,
29694                    _ => {}
29695                }
29696                buf.clear();
29697            }
29698        }
29699
29700        Ok(Self {
29701            paper_size: f_paper_size,
29702            paper_height: f_paper_height,
29703            paper_width: f_paper_width,
29704            first_page_number: f_first_page_number,
29705            orientation: f_orientation,
29706            use_printer_defaults: f_use_printer_defaults,
29707            black_and_white: f_black_and_white,
29708            draft: f_draft,
29709            use_first_page_number: f_use_first_page_number,
29710            horizontal_dpi: f_horizontal_dpi,
29711            vertical_dpi: f_vertical_dpi,
29712            copies: f_copies,
29713            id: f_id,
29714            #[cfg(feature = "extra-attrs")]
29715            extra_attrs,
29716        })
29717    }
29718}
29719
29720impl FromXml for CustomChartsheetViews {
29721    fn from_xml<R: BufRead>(
29722        reader: &mut Reader<R>,
29723        start_tag: &BytesStart,
29724        is_empty: bool,
29725    ) -> Result<Self, ParseError> {
29726        let mut f_custom_sheet_view = Vec::new();
29727        #[cfg(feature = "extra-children")]
29728        let mut extra_children = Vec::new();
29729        #[cfg(feature = "extra-children")]
29730        let mut child_idx: usize = 0;
29731
29732        // Parse child elements
29733        if !is_empty {
29734            let mut buf = Vec::new();
29735            loop {
29736                match reader.read_event_into(&mut buf)? {
29737                    Event::Start(e) => {
29738                        match e.local_name().as_ref() {
29739                            b"customSheetView" => {
29740                                f_custom_sheet_view
29741                                    .push(CustomChartsheetView::from_xml(reader, &e, false)?);
29742                                #[cfg(feature = "extra-children")]
29743                                {
29744                                    child_idx += 1;
29745                                }
29746                            }
29747                            #[cfg(feature = "extra-children")]
29748                            _ => {
29749                                // Capture unknown element for roundtrip
29750                                let elem = RawXmlElement::from_reader(reader, &e)?;
29751                                extra_children.push(PositionedNode::new(
29752                                    child_idx,
29753                                    RawXmlNode::Element(elem),
29754                                ));
29755                                child_idx += 1;
29756                            }
29757                            #[cfg(not(feature = "extra-children"))]
29758                            _ => {
29759                                // Skip unknown element
29760                                skip_element(reader)?;
29761                            }
29762                        }
29763                    }
29764                    Event::Empty(e) => {
29765                        match e.local_name().as_ref() {
29766                            b"customSheetView" => {
29767                                f_custom_sheet_view
29768                                    .push(CustomChartsheetView::from_xml(reader, &e, true)?);
29769                                #[cfg(feature = "extra-children")]
29770                                {
29771                                    child_idx += 1;
29772                                }
29773                            }
29774                            #[cfg(feature = "extra-children")]
29775                            _ => {
29776                                // Capture unknown empty element for roundtrip
29777                                let elem = RawXmlElement::from_empty(&e);
29778                                extra_children.push(PositionedNode::new(
29779                                    child_idx,
29780                                    RawXmlNode::Element(elem),
29781                                ));
29782                                child_idx += 1;
29783                            }
29784                            #[cfg(not(feature = "extra-children"))]
29785                            _ => {}
29786                        }
29787                    }
29788                    Event::End(_) => break,
29789                    Event::Eof => break,
29790                    _ => {}
29791                }
29792                buf.clear();
29793            }
29794        }
29795
29796        Ok(Self {
29797            custom_sheet_view: f_custom_sheet_view,
29798            #[cfg(feature = "extra-children")]
29799            extra_children,
29800        })
29801    }
29802}
29803
29804impl FromXml for CustomChartsheetView {
29805    fn from_xml<R: BufRead>(
29806        reader: &mut Reader<R>,
29807        start_tag: &BytesStart,
29808        is_empty: bool,
29809    ) -> Result<Self, ParseError> {
29810        let mut f_guid: Option<Guid> = None;
29811        let mut f_scale = None;
29812        let mut f_state = None;
29813        let mut f_zoom_to_fit = None;
29814        let mut f_page_margins = None;
29815        let mut f_page_setup = None;
29816        let mut f_header_footer = None;
29817        #[cfg(feature = "extra-attrs")]
29818        let mut extra_attrs = std::collections::HashMap::new();
29819        #[cfg(feature = "extra-children")]
29820        let mut extra_children = Vec::new();
29821        #[cfg(feature = "extra-children")]
29822        let mut child_idx: usize = 0;
29823
29824        // Parse attributes
29825        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
29826            let val = String::from_utf8_lossy(&attr.value);
29827            match attr.key.local_name().as_ref() {
29828                b"guid" => {
29829                    f_guid = Some(val.into_owned());
29830                }
29831                b"scale" => {
29832                    f_scale = val.parse().ok();
29833                }
29834                b"state" => {
29835                    f_state = val.parse().ok();
29836                }
29837                b"zoomToFit" => {
29838                    f_zoom_to_fit = Some(val == "true" || val == "1");
29839                }
29840                #[cfg(feature = "extra-attrs")]
29841                unknown => {
29842                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
29843                    extra_attrs.insert(key, val.into_owned());
29844                }
29845                #[cfg(not(feature = "extra-attrs"))]
29846                _ => {}
29847            }
29848        }
29849
29850        // Parse child elements
29851        if !is_empty {
29852            let mut buf = Vec::new();
29853            loop {
29854                match reader.read_event_into(&mut buf)? {
29855                    Event::Start(e) => {
29856                        match e.local_name().as_ref() {
29857                            b"pageMargins" => {
29858                                f_page_margins =
29859                                    Some(Box::new(PageMargins::from_xml(reader, &e, false)?));
29860                                #[cfg(feature = "extra-children")]
29861                                {
29862                                    child_idx += 1;
29863                                }
29864                            }
29865                            b"pageSetup" => {
29866                                f_page_setup = Some(Box::new(ChartsheetPageSetup::from_xml(
29867                                    reader, &e, false,
29868                                )?));
29869                                #[cfg(feature = "extra-children")]
29870                                {
29871                                    child_idx += 1;
29872                                }
29873                            }
29874                            b"headerFooter" => {
29875                                f_header_footer =
29876                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, false)?));
29877                                #[cfg(feature = "extra-children")]
29878                                {
29879                                    child_idx += 1;
29880                                }
29881                            }
29882                            #[cfg(feature = "extra-children")]
29883                            _ => {
29884                                // Capture unknown element for roundtrip
29885                                let elem = RawXmlElement::from_reader(reader, &e)?;
29886                                extra_children.push(PositionedNode::new(
29887                                    child_idx,
29888                                    RawXmlNode::Element(elem),
29889                                ));
29890                                child_idx += 1;
29891                            }
29892                            #[cfg(not(feature = "extra-children"))]
29893                            _ => {
29894                                // Skip unknown element
29895                                skip_element(reader)?;
29896                            }
29897                        }
29898                    }
29899                    Event::Empty(e) => {
29900                        match e.local_name().as_ref() {
29901                            b"pageMargins" => {
29902                                f_page_margins =
29903                                    Some(Box::new(PageMargins::from_xml(reader, &e, true)?));
29904                                #[cfg(feature = "extra-children")]
29905                                {
29906                                    child_idx += 1;
29907                                }
29908                            }
29909                            b"pageSetup" => {
29910                                f_page_setup = Some(Box::new(ChartsheetPageSetup::from_xml(
29911                                    reader, &e, true,
29912                                )?));
29913                                #[cfg(feature = "extra-children")]
29914                                {
29915                                    child_idx += 1;
29916                                }
29917                            }
29918                            b"headerFooter" => {
29919                                f_header_footer =
29920                                    Some(Box::new(HeaderFooter::from_xml(reader, &e, true)?));
29921                                #[cfg(feature = "extra-children")]
29922                                {
29923                                    child_idx += 1;
29924                                }
29925                            }
29926                            #[cfg(feature = "extra-children")]
29927                            _ => {
29928                                // Capture unknown empty element for roundtrip
29929                                let elem = RawXmlElement::from_empty(&e);
29930                                extra_children.push(PositionedNode::new(
29931                                    child_idx,
29932                                    RawXmlNode::Element(elem),
29933                                ));
29934                                child_idx += 1;
29935                            }
29936                            #[cfg(not(feature = "extra-children"))]
29937                            _ => {}
29938                        }
29939                    }
29940                    Event::End(_) => break,
29941                    Event::Eof => break,
29942                    _ => {}
29943                }
29944                buf.clear();
29945            }
29946        }
29947
29948        Ok(Self {
29949            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
29950            scale: f_scale,
29951            state: f_state,
29952            zoom_to_fit: f_zoom_to_fit,
29953            page_margins: f_page_margins,
29954            page_setup: f_page_setup,
29955            header_footer: f_header_footer,
29956            #[cfg(feature = "extra-attrs")]
29957            extra_attrs,
29958            #[cfg(feature = "extra-children")]
29959            extra_children,
29960        })
29961    }
29962}
29963
29964impl FromXml for CTCustomProperties {
29965    fn from_xml<R: BufRead>(
29966        reader: &mut Reader<R>,
29967        start_tag: &BytesStart,
29968        is_empty: bool,
29969    ) -> Result<Self, ParseError> {
29970        let mut f_custom_pr = Vec::new();
29971        #[cfg(feature = "extra-children")]
29972        let mut extra_children = Vec::new();
29973        #[cfg(feature = "extra-children")]
29974        let mut child_idx: usize = 0;
29975
29976        // Parse child elements
29977        if !is_empty {
29978            let mut buf = Vec::new();
29979            loop {
29980                match reader.read_event_into(&mut buf)? {
29981                    Event::Start(e) => {
29982                        match e.local_name().as_ref() {
29983                            b"customPr" => {
29984                                f_custom_pr.push(CTCustomProperty::from_xml(reader, &e, false)?);
29985                                #[cfg(feature = "extra-children")]
29986                                {
29987                                    child_idx += 1;
29988                                }
29989                            }
29990                            #[cfg(feature = "extra-children")]
29991                            _ => {
29992                                // Capture unknown element for roundtrip
29993                                let elem = RawXmlElement::from_reader(reader, &e)?;
29994                                extra_children.push(PositionedNode::new(
29995                                    child_idx,
29996                                    RawXmlNode::Element(elem),
29997                                ));
29998                                child_idx += 1;
29999                            }
30000                            #[cfg(not(feature = "extra-children"))]
30001                            _ => {
30002                                // Skip unknown element
30003                                skip_element(reader)?;
30004                            }
30005                        }
30006                    }
30007                    Event::Empty(e) => {
30008                        match e.local_name().as_ref() {
30009                            b"customPr" => {
30010                                f_custom_pr.push(CTCustomProperty::from_xml(reader, &e, true)?);
30011                                #[cfg(feature = "extra-children")]
30012                                {
30013                                    child_idx += 1;
30014                                }
30015                            }
30016                            #[cfg(feature = "extra-children")]
30017                            _ => {
30018                                // Capture unknown empty element for roundtrip
30019                                let elem = RawXmlElement::from_empty(&e);
30020                                extra_children.push(PositionedNode::new(
30021                                    child_idx,
30022                                    RawXmlNode::Element(elem),
30023                                ));
30024                                child_idx += 1;
30025                            }
30026                            #[cfg(not(feature = "extra-children"))]
30027                            _ => {}
30028                        }
30029                    }
30030                    Event::End(_) => break,
30031                    Event::Eof => break,
30032                    _ => {}
30033                }
30034                buf.clear();
30035            }
30036        }
30037
30038        Ok(Self {
30039            custom_pr: f_custom_pr,
30040            #[cfg(feature = "extra-children")]
30041            extra_children,
30042        })
30043    }
30044}
30045
30046impl FromXml for CTCustomProperty {
30047    fn from_xml<R: BufRead>(
30048        reader: &mut Reader<R>,
30049        start_tag: &BytesStart,
30050        is_empty: bool,
30051    ) -> Result<Self, ParseError> {
30052        let mut f_name: Option<XmlString> = None;
30053        let mut f_id: Option<STRelationshipId> = None;
30054        #[cfg(feature = "extra-attrs")]
30055        let mut extra_attrs = std::collections::HashMap::new();
30056
30057        // Parse attributes
30058        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30059            let val = String::from_utf8_lossy(&attr.value);
30060            match attr.key.local_name().as_ref() {
30061                b"name" => {
30062                    f_name = Some(val.into_owned());
30063                }
30064                b"id" => {
30065                    f_id = Some(val.into_owned());
30066                }
30067                #[cfg(feature = "extra-attrs")]
30068                unknown => {
30069                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30070                    extra_attrs.insert(key, val.into_owned());
30071                }
30072                #[cfg(not(feature = "extra-attrs"))]
30073                _ => {}
30074            }
30075        }
30076
30077        if !is_empty {
30078            let mut buf = Vec::new();
30079            loop {
30080                match reader.read_event_into(&mut buf)? {
30081                    Event::End(_) => break,
30082                    Event::Eof => break,
30083                    _ => {}
30084                }
30085                buf.clear();
30086            }
30087        }
30088
30089        Ok(Self {
30090            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
30091            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
30092            #[cfg(feature = "extra-attrs")]
30093            extra_attrs,
30094        })
30095    }
30096}
30097
30098impl FromXml for OleObjects {
30099    fn from_xml<R: BufRead>(
30100        reader: &mut Reader<R>,
30101        start_tag: &BytesStart,
30102        is_empty: bool,
30103    ) -> Result<Self, ParseError> {
30104        let mut f_ole_object = Vec::new();
30105        #[cfg(feature = "extra-children")]
30106        let mut extra_children = Vec::new();
30107        #[cfg(feature = "extra-children")]
30108        let mut child_idx: usize = 0;
30109
30110        // Parse child elements
30111        if !is_empty {
30112            let mut buf = Vec::new();
30113            loop {
30114                match reader.read_event_into(&mut buf)? {
30115                    Event::Start(e) => {
30116                        match e.local_name().as_ref() {
30117                            b"oleObject" => {
30118                                f_ole_object.push(OleObject::from_xml(reader, &e, false)?);
30119                                #[cfg(feature = "extra-children")]
30120                                {
30121                                    child_idx += 1;
30122                                }
30123                            }
30124                            #[cfg(feature = "extra-children")]
30125                            _ => {
30126                                // Capture unknown element for roundtrip
30127                                let elem = RawXmlElement::from_reader(reader, &e)?;
30128                                extra_children.push(PositionedNode::new(
30129                                    child_idx,
30130                                    RawXmlNode::Element(elem),
30131                                ));
30132                                child_idx += 1;
30133                            }
30134                            #[cfg(not(feature = "extra-children"))]
30135                            _ => {
30136                                // Skip unknown element
30137                                skip_element(reader)?;
30138                            }
30139                        }
30140                    }
30141                    Event::Empty(e) => {
30142                        match e.local_name().as_ref() {
30143                            b"oleObject" => {
30144                                f_ole_object.push(OleObject::from_xml(reader, &e, true)?);
30145                                #[cfg(feature = "extra-children")]
30146                                {
30147                                    child_idx += 1;
30148                                }
30149                            }
30150                            #[cfg(feature = "extra-children")]
30151                            _ => {
30152                                // Capture unknown empty element for roundtrip
30153                                let elem = RawXmlElement::from_empty(&e);
30154                                extra_children.push(PositionedNode::new(
30155                                    child_idx,
30156                                    RawXmlNode::Element(elem),
30157                                ));
30158                                child_idx += 1;
30159                            }
30160                            #[cfg(not(feature = "extra-children"))]
30161                            _ => {}
30162                        }
30163                    }
30164                    Event::End(_) => break,
30165                    Event::Eof => break,
30166                    _ => {}
30167                }
30168                buf.clear();
30169            }
30170        }
30171
30172        Ok(Self {
30173            ole_object: f_ole_object,
30174            #[cfg(feature = "extra-children")]
30175            extra_children,
30176        })
30177    }
30178}
30179
30180impl FromXml for OleObject {
30181    fn from_xml<R: BufRead>(
30182        reader: &mut Reader<R>,
30183        start_tag: &BytesStart,
30184        is_empty: bool,
30185    ) -> Result<Self, ParseError> {
30186        let mut f_prog_id = None;
30187        let mut f_dv_aspect = None;
30188        let mut f_link = None;
30189        let mut f_ole_update = None;
30190        let mut f_auto_load = None;
30191        let mut f_shape_id: Option<u32> = None;
30192        let mut f_id = None;
30193        let mut f_object_pr = None;
30194        #[cfg(feature = "extra-attrs")]
30195        let mut extra_attrs = std::collections::HashMap::new();
30196        #[cfg(feature = "extra-children")]
30197        let mut extra_children = Vec::new();
30198        #[cfg(feature = "extra-children")]
30199        let mut child_idx: usize = 0;
30200
30201        // Parse attributes
30202        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30203            let val = String::from_utf8_lossy(&attr.value);
30204            match attr.key.local_name().as_ref() {
30205                b"progId" => {
30206                    f_prog_id = Some(val.into_owned());
30207                }
30208                b"dvAspect" => {
30209                    f_dv_aspect = val.parse().ok();
30210                }
30211                b"link" => {
30212                    f_link = Some(val.into_owned());
30213                }
30214                b"oleUpdate" => {
30215                    f_ole_update = val.parse().ok();
30216                }
30217                b"autoLoad" => {
30218                    f_auto_load = Some(val == "true" || val == "1");
30219                }
30220                b"shapeId" => {
30221                    f_shape_id = val.parse().ok();
30222                }
30223                b"id" => {
30224                    f_id = Some(val.into_owned());
30225                }
30226                #[cfg(feature = "extra-attrs")]
30227                unknown => {
30228                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30229                    extra_attrs.insert(key, val.into_owned());
30230                }
30231                #[cfg(not(feature = "extra-attrs"))]
30232                _ => {}
30233            }
30234        }
30235
30236        // Parse child elements
30237        if !is_empty {
30238            let mut buf = Vec::new();
30239            loop {
30240                match reader.read_event_into(&mut buf)? {
30241                    Event::Start(e) => {
30242                        match e.local_name().as_ref() {
30243                            b"objectPr" => {
30244                                f_object_pr =
30245                                    Some(Box::new(ObjectProperties::from_xml(reader, &e, false)?));
30246                                #[cfg(feature = "extra-children")]
30247                                {
30248                                    child_idx += 1;
30249                                }
30250                            }
30251                            #[cfg(feature = "extra-children")]
30252                            _ => {
30253                                // Capture unknown element for roundtrip
30254                                let elem = RawXmlElement::from_reader(reader, &e)?;
30255                                extra_children.push(PositionedNode::new(
30256                                    child_idx,
30257                                    RawXmlNode::Element(elem),
30258                                ));
30259                                child_idx += 1;
30260                            }
30261                            #[cfg(not(feature = "extra-children"))]
30262                            _ => {
30263                                // Skip unknown element
30264                                skip_element(reader)?;
30265                            }
30266                        }
30267                    }
30268                    Event::Empty(e) => {
30269                        match e.local_name().as_ref() {
30270                            b"objectPr" => {
30271                                f_object_pr =
30272                                    Some(Box::new(ObjectProperties::from_xml(reader, &e, true)?));
30273                                #[cfg(feature = "extra-children")]
30274                                {
30275                                    child_idx += 1;
30276                                }
30277                            }
30278                            #[cfg(feature = "extra-children")]
30279                            _ => {
30280                                // Capture unknown empty element for roundtrip
30281                                let elem = RawXmlElement::from_empty(&e);
30282                                extra_children.push(PositionedNode::new(
30283                                    child_idx,
30284                                    RawXmlNode::Element(elem),
30285                                ));
30286                                child_idx += 1;
30287                            }
30288                            #[cfg(not(feature = "extra-children"))]
30289                            _ => {}
30290                        }
30291                    }
30292                    Event::End(_) => break,
30293                    Event::Eof => break,
30294                    _ => {}
30295                }
30296                buf.clear();
30297            }
30298        }
30299
30300        Ok(Self {
30301            prog_id: f_prog_id,
30302            dv_aspect: f_dv_aspect,
30303            link: f_link,
30304            ole_update: f_ole_update,
30305            auto_load: f_auto_load,
30306            shape_id: f_shape_id
30307                .ok_or_else(|| ParseError::MissingAttribute("shapeId".to_string()))?,
30308            id: f_id,
30309            object_pr: f_object_pr,
30310            #[cfg(feature = "extra-attrs")]
30311            extra_attrs,
30312            #[cfg(feature = "extra-children")]
30313            extra_children,
30314        })
30315    }
30316}
30317
30318impl FromXml for ObjectProperties {
30319    fn from_xml<R: BufRead>(
30320        reader: &mut Reader<R>,
30321        start_tag: &BytesStart,
30322        is_empty: bool,
30323    ) -> Result<Self, ParseError> {
30324        let mut f_locked = None;
30325        let mut f_default_size = None;
30326        let mut f_print = None;
30327        let mut f_disabled = None;
30328        let mut f_ui_object = None;
30329        let mut f_auto_fill = None;
30330        let mut f_auto_line = None;
30331        let mut f_auto_pict = None;
30332        let mut f_macro = None;
30333        let mut f_alt_text = None;
30334        let mut f_dde = None;
30335        let mut f_id = None;
30336        let mut f_anchor: Option<Box<ObjectAnchor>> = None;
30337        #[cfg(feature = "extra-attrs")]
30338        let mut extra_attrs = std::collections::HashMap::new();
30339        #[cfg(feature = "extra-children")]
30340        let mut extra_children = Vec::new();
30341        #[cfg(feature = "extra-children")]
30342        let mut child_idx: usize = 0;
30343
30344        // Parse attributes
30345        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30346            let val = String::from_utf8_lossy(&attr.value);
30347            match attr.key.local_name().as_ref() {
30348                b"locked" => {
30349                    f_locked = Some(val == "true" || val == "1");
30350                }
30351                b"defaultSize" => {
30352                    f_default_size = Some(val == "true" || val == "1");
30353                }
30354                b"print" => {
30355                    f_print = Some(val == "true" || val == "1");
30356                }
30357                b"disabled" => {
30358                    f_disabled = Some(val == "true" || val == "1");
30359                }
30360                b"uiObject" => {
30361                    f_ui_object = Some(val == "true" || val == "1");
30362                }
30363                b"autoFill" => {
30364                    f_auto_fill = Some(val == "true" || val == "1");
30365                }
30366                b"autoLine" => {
30367                    f_auto_line = Some(val == "true" || val == "1");
30368                }
30369                b"autoPict" => {
30370                    f_auto_pict = Some(val == "true" || val == "1");
30371                }
30372                b"macro" => {
30373                    f_macro = Some(val.into_owned());
30374                }
30375                b"altText" => {
30376                    f_alt_text = Some(val.into_owned());
30377                }
30378                b"dde" => {
30379                    f_dde = Some(val == "true" || val == "1");
30380                }
30381                b"id" => {
30382                    f_id = Some(val.into_owned());
30383                }
30384                #[cfg(feature = "extra-attrs")]
30385                unknown => {
30386                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30387                    extra_attrs.insert(key, val.into_owned());
30388                }
30389                #[cfg(not(feature = "extra-attrs"))]
30390                _ => {}
30391            }
30392        }
30393
30394        // Parse child elements
30395        if !is_empty {
30396            let mut buf = Vec::new();
30397            loop {
30398                match reader.read_event_into(&mut buf)? {
30399                    Event::Start(e) => {
30400                        match e.local_name().as_ref() {
30401                            b"anchor" => {
30402                                f_anchor =
30403                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, false)?));
30404                                #[cfg(feature = "extra-children")]
30405                                {
30406                                    child_idx += 1;
30407                                }
30408                            }
30409                            #[cfg(feature = "extra-children")]
30410                            _ => {
30411                                // Capture unknown element for roundtrip
30412                                let elem = RawXmlElement::from_reader(reader, &e)?;
30413                                extra_children.push(PositionedNode::new(
30414                                    child_idx,
30415                                    RawXmlNode::Element(elem),
30416                                ));
30417                                child_idx += 1;
30418                            }
30419                            #[cfg(not(feature = "extra-children"))]
30420                            _ => {
30421                                // Skip unknown element
30422                                skip_element(reader)?;
30423                            }
30424                        }
30425                    }
30426                    Event::Empty(e) => {
30427                        match e.local_name().as_ref() {
30428                            b"anchor" => {
30429                                f_anchor =
30430                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, true)?));
30431                                #[cfg(feature = "extra-children")]
30432                                {
30433                                    child_idx += 1;
30434                                }
30435                            }
30436                            #[cfg(feature = "extra-children")]
30437                            _ => {
30438                                // Capture unknown empty element for roundtrip
30439                                let elem = RawXmlElement::from_empty(&e);
30440                                extra_children.push(PositionedNode::new(
30441                                    child_idx,
30442                                    RawXmlNode::Element(elem),
30443                                ));
30444                                child_idx += 1;
30445                            }
30446                            #[cfg(not(feature = "extra-children"))]
30447                            _ => {}
30448                        }
30449                    }
30450                    Event::End(_) => break,
30451                    Event::Eof => break,
30452                    _ => {}
30453                }
30454                buf.clear();
30455            }
30456        }
30457
30458        Ok(Self {
30459            locked: f_locked,
30460            default_size: f_default_size,
30461            print: f_print,
30462            disabled: f_disabled,
30463            ui_object: f_ui_object,
30464            auto_fill: f_auto_fill,
30465            auto_line: f_auto_line,
30466            auto_pict: f_auto_pict,
30467            r#macro: f_macro,
30468            alt_text: f_alt_text,
30469            dde: f_dde,
30470            id: f_id,
30471            anchor: f_anchor.ok_or_else(|| ParseError::MissingAttribute("anchor".to_string()))?,
30472            #[cfg(feature = "extra-attrs")]
30473            extra_attrs,
30474            #[cfg(feature = "extra-children")]
30475            extra_children,
30476        })
30477    }
30478}
30479
30480impl FromXml for WebPublishItems {
30481    fn from_xml<R: BufRead>(
30482        reader: &mut Reader<R>,
30483        start_tag: &BytesStart,
30484        is_empty: bool,
30485    ) -> Result<Self, ParseError> {
30486        let mut f_count = None;
30487        let mut f_web_publish_item = Vec::new();
30488        #[cfg(feature = "extra-attrs")]
30489        let mut extra_attrs = std::collections::HashMap::new();
30490        #[cfg(feature = "extra-children")]
30491        let mut extra_children = Vec::new();
30492        #[cfg(feature = "extra-children")]
30493        let mut child_idx: usize = 0;
30494
30495        // Parse attributes
30496        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30497            let val = String::from_utf8_lossy(&attr.value);
30498            match attr.key.local_name().as_ref() {
30499                b"count" => {
30500                    f_count = val.parse().ok();
30501                }
30502                #[cfg(feature = "extra-attrs")]
30503                unknown => {
30504                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30505                    extra_attrs.insert(key, val.into_owned());
30506                }
30507                #[cfg(not(feature = "extra-attrs"))]
30508                _ => {}
30509            }
30510        }
30511
30512        // Parse child elements
30513        if !is_empty {
30514            let mut buf = Vec::new();
30515            loop {
30516                match reader.read_event_into(&mut buf)? {
30517                    Event::Start(e) => {
30518                        match e.local_name().as_ref() {
30519                            b"webPublishItem" => {
30520                                f_web_publish_item
30521                                    .push(WebPublishItem::from_xml(reader, &e, false)?);
30522                                #[cfg(feature = "extra-children")]
30523                                {
30524                                    child_idx += 1;
30525                                }
30526                            }
30527                            #[cfg(feature = "extra-children")]
30528                            _ => {
30529                                // Capture unknown element for roundtrip
30530                                let elem = RawXmlElement::from_reader(reader, &e)?;
30531                                extra_children.push(PositionedNode::new(
30532                                    child_idx,
30533                                    RawXmlNode::Element(elem),
30534                                ));
30535                                child_idx += 1;
30536                            }
30537                            #[cfg(not(feature = "extra-children"))]
30538                            _ => {
30539                                // Skip unknown element
30540                                skip_element(reader)?;
30541                            }
30542                        }
30543                    }
30544                    Event::Empty(e) => {
30545                        match e.local_name().as_ref() {
30546                            b"webPublishItem" => {
30547                                f_web_publish_item
30548                                    .push(WebPublishItem::from_xml(reader, &e, true)?);
30549                                #[cfg(feature = "extra-children")]
30550                                {
30551                                    child_idx += 1;
30552                                }
30553                            }
30554                            #[cfg(feature = "extra-children")]
30555                            _ => {
30556                                // Capture unknown empty element for roundtrip
30557                                let elem = RawXmlElement::from_empty(&e);
30558                                extra_children.push(PositionedNode::new(
30559                                    child_idx,
30560                                    RawXmlNode::Element(elem),
30561                                ));
30562                                child_idx += 1;
30563                            }
30564                            #[cfg(not(feature = "extra-children"))]
30565                            _ => {}
30566                        }
30567                    }
30568                    Event::End(_) => break,
30569                    Event::Eof => break,
30570                    _ => {}
30571                }
30572                buf.clear();
30573            }
30574        }
30575
30576        Ok(Self {
30577            count: f_count,
30578            web_publish_item: f_web_publish_item,
30579            #[cfg(feature = "extra-attrs")]
30580            extra_attrs,
30581            #[cfg(feature = "extra-children")]
30582            extra_children,
30583        })
30584    }
30585}
30586
30587impl FromXml for WebPublishItem {
30588    fn from_xml<R: BufRead>(
30589        reader: &mut Reader<R>,
30590        start_tag: &BytesStart,
30591        is_empty: bool,
30592    ) -> Result<Self, ParseError> {
30593        let mut f_id: Option<u32> = None;
30594        let mut f_div_id: Option<XmlString> = None;
30595        let mut f_source_type: Option<STWebSourceType> = None;
30596        let mut f_source_ref = None;
30597        let mut f_source_object = None;
30598        let mut f_destination_file: Option<XmlString> = None;
30599        let mut f_title = None;
30600        let mut f_auto_republish = None;
30601        #[cfg(feature = "extra-attrs")]
30602        let mut extra_attrs = std::collections::HashMap::new();
30603
30604        // Parse attributes
30605        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30606            let val = String::from_utf8_lossy(&attr.value);
30607            match attr.key.local_name().as_ref() {
30608                b"id" => {
30609                    f_id = val.parse().ok();
30610                }
30611                b"divId" => {
30612                    f_div_id = Some(val.into_owned());
30613                }
30614                b"sourceType" => {
30615                    f_source_type = val.parse().ok();
30616                }
30617                b"sourceRef" => {
30618                    f_source_ref = Some(val.into_owned());
30619                }
30620                b"sourceObject" => {
30621                    f_source_object = Some(val.into_owned());
30622                }
30623                b"destinationFile" => {
30624                    f_destination_file = Some(val.into_owned());
30625                }
30626                b"title" => {
30627                    f_title = Some(val.into_owned());
30628                }
30629                b"autoRepublish" => {
30630                    f_auto_republish = Some(val == "true" || val == "1");
30631                }
30632                #[cfg(feature = "extra-attrs")]
30633                unknown => {
30634                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30635                    extra_attrs.insert(key, val.into_owned());
30636                }
30637                #[cfg(not(feature = "extra-attrs"))]
30638                _ => {}
30639            }
30640        }
30641
30642        if !is_empty {
30643            let mut buf = Vec::new();
30644            loop {
30645                match reader.read_event_into(&mut buf)? {
30646                    Event::End(_) => break,
30647                    Event::Eof => break,
30648                    _ => {}
30649                }
30650                buf.clear();
30651            }
30652        }
30653
30654        Ok(Self {
30655            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
30656            div_id: f_div_id.ok_or_else(|| ParseError::MissingAttribute("divId".to_string()))?,
30657            source_type: f_source_type
30658                .ok_or_else(|| ParseError::MissingAttribute("sourceType".to_string()))?,
30659            source_ref: f_source_ref,
30660            source_object: f_source_object,
30661            destination_file: f_destination_file
30662                .ok_or_else(|| ParseError::MissingAttribute("destinationFile".to_string()))?,
30663            title: f_title,
30664            auto_republish: f_auto_republish,
30665            #[cfg(feature = "extra-attrs")]
30666            extra_attrs,
30667        })
30668    }
30669}
30670
30671impl FromXml for Controls {
30672    fn from_xml<R: BufRead>(
30673        reader: &mut Reader<R>,
30674        start_tag: &BytesStart,
30675        is_empty: bool,
30676    ) -> Result<Self, ParseError> {
30677        let mut f_control = Vec::new();
30678        #[cfg(feature = "extra-children")]
30679        let mut extra_children = Vec::new();
30680        #[cfg(feature = "extra-children")]
30681        let mut child_idx: usize = 0;
30682
30683        // Parse child elements
30684        if !is_empty {
30685            let mut buf = Vec::new();
30686            loop {
30687                match reader.read_event_into(&mut buf)? {
30688                    Event::Start(e) => {
30689                        match e.local_name().as_ref() {
30690                            b"control" => {
30691                                f_control.push(Control::from_xml(reader, &e, false)?);
30692                                #[cfg(feature = "extra-children")]
30693                                {
30694                                    child_idx += 1;
30695                                }
30696                            }
30697                            #[cfg(feature = "extra-children")]
30698                            _ => {
30699                                // Capture unknown element for roundtrip
30700                                let elem = RawXmlElement::from_reader(reader, &e)?;
30701                                extra_children.push(PositionedNode::new(
30702                                    child_idx,
30703                                    RawXmlNode::Element(elem),
30704                                ));
30705                                child_idx += 1;
30706                            }
30707                            #[cfg(not(feature = "extra-children"))]
30708                            _ => {
30709                                // Skip unknown element
30710                                skip_element(reader)?;
30711                            }
30712                        }
30713                    }
30714                    Event::Empty(e) => {
30715                        match e.local_name().as_ref() {
30716                            b"control" => {
30717                                f_control.push(Control::from_xml(reader, &e, true)?);
30718                                #[cfg(feature = "extra-children")]
30719                                {
30720                                    child_idx += 1;
30721                                }
30722                            }
30723                            #[cfg(feature = "extra-children")]
30724                            _ => {
30725                                // Capture unknown empty element for roundtrip
30726                                let elem = RawXmlElement::from_empty(&e);
30727                                extra_children.push(PositionedNode::new(
30728                                    child_idx,
30729                                    RawXmlNode::Element(elem),
30730                                ));
30731                                child_idx += 1;
30732                            }
30733                            #[cfg(not(feature = "extra-children"))]
30734                            _ => {}
30735                        }
30736                    }
30737                    Event::End(_) => break,
30738                    Event::Eof => break,
30739                    _ => {}
30740                }
30741                buf.clear();
30742            }
30743        }
30744
30745        Ok(Self {
30746            control: f_control,
30747            #[cfg(feature = "extra-children")]
30748            extra_children,
30749        })
30750    }
30751}
30752
30753impl FromXml for Control {
30754    fn from_xml<R: BufRead>(
30755        reader: &mut Reader<R>,
30756        start_tag: &BytesStart,
30757        is_empty: bool,
30758    ) -> Result<Self, ParseError> {
30759        let mut f_shape_id: Option<u32> = None;
30760        let mut f_id: Option<STRelationshipId> = None;
30761        let mut f_name = None;
30762        let mut f_control_pr = None;
30763        #[cfg(feature = "extra-attrs")]
30764        let mut extra_attrs = std::collections::HashMap::new();
30765        #[cfg(feature = "extra-children")]
30766        let mut extra_children = Vec::new();
30767        #[cfg(feature = "extra-children")]
30768        let mut child_idx: usize = 0;
30769
30770        // Parse attributes
30771        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30772            let val = String::from_utf8_lossy(&attr.value);
30773            match attr.key.local_name().as_ref() {
30774                b"shapeId" => {
30775                    f_shape_id = val.parse().ok();
30776                }
30777                b"id" => {
30778                    f_id = Some(val.into_owned());
30779                }
30780                b"name" => {
30781                    f_name = Some(val.into_owned());
30782                }
30783                #[cfg(feature = "extra-attrs")]
30784                unknown => {
30785                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30786                    extra_attrs.insert(key, val.into_owned());
30787                }
30788                #[cfg(not(feature = "extra-attrs"))]
30789                _ => {}
30790            }
30791        }
30792
30793        // Parse child elements
30794        if !is_empty {
30795            let mut buf = Vec::new();
30796            loop {
30797                match reader.read_event_into(&mut buf)? {
30798                    Event::Start(e) => {
30799                        match e.local_name().as_ref() {
30800                            b"controlPr" => {
30801                                f_control_pr =
30802                                    Some(Box::new(CTControlPr::from_xml(reader, &e, false)?));
30803                                #[cfg(feature = "extra-children")]
30804                                {
30805                                    child_idx += 1;
30806                                }
30807                            }
30808                            #[cfg(feature = "extra-children")]
30809                            _ => {
30810                                // Capture unknown element for roundtrip
30811                                let elem = RawXmlElement::from_reader(reader, &e)?;
30812                                extra_children.push(PositionedNode::new(
30813                                    child_idx,
30814                                    RawXmlNode::Element(elem),
30815                                ));
30816                                child_idx += 1;
30817                            }
30818                            #[cfg(not(feature = "extra-children"))]
30819                            _ => {
30820                                // Skip unknown element
30821                                skip_element(reader)?;
30822                            }
30823                        }
30824                    }
30825                    Event::Empty(e) => {
30826                        match e.local_name().as_ref() {
30827                            b"controlPr" => {
30828                                f_control_pr =
30829                                    Some(Box::new(CTControlPr::from_xml(reader, &e, true)?));
30830                                #[cfg(feature = "extra-children")]
30831                                {
30832                                    child_idx += 1;
30833                                }
30834                            }
30835                            #[cfg(feature = "extra-children")]
30836                            _ => {
30837                                // Capture unknown empty element for roundtrip
30838                                let elem = RawXmlElement::from_empty(&e);
30839                                extra_children.push(PositionedNode::new(
30840                                    child_idx,
30841                                    RawXmlNode::Element(elem),
30842                                ));
30843                                child_idx += 1;
30844                            }
30845                            #[cfg(not(feature = "extra-children"))]
30846                            _ => {}
30847                        }
30848                    }
30849                    Event::End(_) => break,
30850                    Event::Eof => break,
30851                    _ => {}
30852                }
30853                buf.clear();
30854            }
30855        }
30856
30857        Ok(Self {
30858            shape_id: f_shape_id
30859                .ok_or_else(|| ParseError::MissingAttribute("shapeId".to_string()))?,
30860            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
30861            name: f_name,
30862            control_pr: f_control_pr,
30863            #[cfg(feature = "extra-attrs")]
30864            extra_attrs,
30865            #[cfg(feature = "extra-children")]
30866            extra_children,
30867        })
30868    }
30869}
30870
30871impl FromXml for CTControlPr {
30872    fn from_xml<R: BufRead>(
30873        reader: &mut Reader<R>,
30874        start_tag: &BytesStart,
30875        is_empty: bool,
30876    ) -> Result<Self, ParseError> {
30877        let mut f_locked = None;
30878        let mut f_default_size = None;
30879        let mut f_print = None;
30880        let mut f_disabled = None;
30881        let mut f_recalc_always = None;
30882        let mut f_ui_object = None;
30883        let mut f_auto_fill = None;
30884        let mut f_auto_line = None;
30885        let mut f_auto_pict = None;
30886        let mut f_macro = None;
30887        let mut f_alt_text = None;
30888        let mut f_linked_cell = None;
30889        let mut f_list_fill_range = None;
30890        let mut f_cf = None;
30891        let mut f_id = None;
30892        let mut f_anchor: Option<Box<ObjectAnchor>> = None;
30893        #[cfg(feature = "extra-attrs")]
30894        let mut extra_attrs = std::collections::HashMap::new();
30895        #[cfg(feature = "extra-children")]
30896        let mut extra_children = Vec::new();
30897        #[cfg(feature = "extra-children")]
30898        let mut child_idx: usize = 0;
30899
30900        // Parse attributes
30901        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
30902            let val = String::from_utf8_lossy(&attr.value);
30903            match attr.key.local_name().as_ref() {
30904                b"locked" => {
30905                    f_locked = Some(val == "true" || val == "1");
30906                }
30907                b"defaultSize" => {
30908                    f_default_size = Some(val == "true" || val == "1");
30909                }
30910                b"print" => {
30911                    f_print = Some(val == "true" || val == "1");
30912                }
30913                b"disabled" => {
30914                    f_disabled = Some(val == "true" || val == "1");
30915                }
30916                b"recalcAlways" => {
30917                    f_recalc_always = Some(val == "true" || val == "1");
30918                }
30919                b"uiObject" => {
30920                    f_ui_object = Some(val == "true" || val == "1");
30921                }
30922                b"autoFill" => {
30923                    f_auto_fill = Some(val == "true" || val == "1");
30924                }
30925                b"autoLine" => {
30926                    f_auto_line = Some(val == "true" || val == "1");
30927                }
30928                b"autoPict" => {
30929                    f_auto_pict = Some(val == "true" || val == "1");
30930                }
30931                b"macro" => {
30932                    f_macro = Some(val.into_owned());
30933                }
30934                b"altText" => {
30935                    f_alt_text = Some(val.into_owned());
30936                }
30937                b"linkedCell" => {
30938                    f_linked_cell = Some(val.into_owned());
30939                }
30940                b"listFillRange" => {
30941                    f_list_fill_range = Some(val.into_owned());
30942                }
30943                b"cf" => {
30944                    f_cf = Some(val.into_owned());
30945                }
30946                b"id" => {
30947                    f_id = Some(val.into_owned());
30948                }
30949                #[cfg(feature = "extra-attrs")]
30950                unknown => {
30951                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
30952                    extra_attrs.insert(key, val.into_owned());
30953                }
30954                #[cfg(not(feature = "extra-attrs"))]
30955                _ => {}
30956            }
30957        }
30958
30959        // Parse child elements
30960        if !is_empty {
30961            let mut buf = Vec::new();
30962            loop {
30963                match reader.read_event_into(&mut buf)? {
30964                    Event::Start(e) => {
30965                        match e.local_name().as_ref() {
30966                            b"anchor" => {
30967                                f_anchor =
30968                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, false)?));
30969                                #[cfg(feature = "extra-children")]
30970                                {
30971                                    child_idx += 1;
30972                                }
30973                            }
30974                            #[cfg(feature = "extra-children")]
30975                            _ => {
30976                                // Capture unknown element for roundtrip
30977                                let elem = RawXmlElement::from_reader(reader, &e)?;
30978                                extra_children.push(PositionedNode::new(
30979                                    child_idx,
30980                                    RawXmlNode::Element(elem),
30981                                ));
30982                                child_idx += 1;
30983                            }
30984                            #[cfg(not(feature = "extra-children"))]
30985                            _ => {
30986                                // Skip unknown element
30987                                skip_element(reader)?;
30988                            }
30989                        }
30990                    }
30991                    Event::Empty(e) => {
30992                        match e.local_name().as_ref() {
30993                            b"anchor" => {
30994                                f_anchor =
30995                                    Some(Box::new(ObjectAnchor::from_xml(reader, &e, true)?));
30996                                #[cfg(feature = "extra-children")]
30997                                {
30998                                    child_idx += 1;
30999                                }
31000                            }
31001                            #[cfg(feature = "extra-children")]
31002                            _ => {
31003                                // Capture unknown empty element for roundtrip
31004                                let elem = RawXmlElement::from_empty(&e);
31005                                extra_children.push(PositionedNode::new(
31006                                    child_idx,
31007                                    RawXmlNode::Element(elem),
31008                                ));
31009                                child_idx += 1;
31010                            }
31011                            #[cfg(not(feature = "extra-children"))]
31012                            _ => {}
31013                        }
31014                    }
31015                    Event::End(_) => break,
31016                    Event::Eof => break,
31017                    _ => {}
31018                }
31019                buf.clear();
31020            }
31021        }
31022
31023        Ok(Self {
31024            locked: f_locked,
31025            default_size: f_default_size,
31026            print: f_print,
31027            disabled: f_disabled,
31028            recalc_always: f_recalc_always,
31029            ui_object: f_ui_object,
31030            auto_fill: f_auto_fill,
31031            auto_line: f_auto_line,
31032            auto_pict: f_auto_pict,
31033            r#macro: f_macro,
31034            alt_text: f_alt_text,
31035            linked_cell: f_linked_cell,
31036            list_fill_range: f_list_fill_range,
31037            cf: f_cf,
31038            id: f_id,
31039            anchor: f_anchor.ok_or_else(|| ParseError::MissingAttribute("anchor".to_string()))?,
31040            #[cfg(feature = "extra-attrs")]
31041            extra_attrs,
31042            #[cfg(feature = "extra-children")]
31043            extra_children,
31044        })
31045    }
31046}
31047
31048impl FromXml for IgnoredErrors {
31049    fn from_xml<R: BufRead>(
31050        reader: &mut Reader<R>,
31051        start_tag: &BytesStart,
31052        is_empty: bool,
31053    ) -> Result<Self, ParseError> {
31054        let mut f_ignored_error = Vec::new();
31055        let mut f_extension_list = None;
31056        #[cfg(feature = "extra-children")]
31057        let mut extra_children = Vec::new();
31058        #[cfg(feature = "extra-children")]
31059        let mut child_idx: usize = 0;
31060
31061        // Parse child elements
31062        if !is_empty {
31063            let mut buf = Vec::new();
31064            loop {
31065                match reader.read_event_into(&mut buf)? {
31066                    Event::Start(e) => {
31067                        match e.local_name().as_ref() {
31068                            b"ignoredError" => {
31069                                f_ignored_error.push(IgnoredError::from_xml(reader, &e, false)?);
31070                                #[cfg(feature = "extra-children")]
31071                                {
31072                                    child_idx += 1;
31073                                }
31074                            }
31075                            b"extLst" => {
31076                                f_extension_list =
31077                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
31078                                #[cfg(feature = "extra-children")]
31079                                {
31080                                    child_idx += 1;
31081                                }
31082                            }
31083                            #[cfg(feature = "extra-children")]
31084                            _ => {
31085                                // Capture unknown element for roundtrip
31086                                let elem = RawXmlElement::from_reader(reader, &e)?;
31087                                extra_children.push(PositionedNode::new(
31088                                    child_idx,
31089                                    RawXmlNode::Element(elem),
31090                                ));
31091                                child_idx += 1;
31092                            }
31093                            #[cfg(not(feature = "extra-children"))]
31094                            _ => {
31095                                // Skip unknown element
31096                                skip_element(reader)?;
31097                            }
31098                        }
31099                    }
31100                    Event::Empty(e) => {
31101                        match e.local_name().as_ref() {
31102                            b"ignoredError" => {
31103                                f_ignored_error.push(IgnoredError::from_xml(reader, &e, true)?);
31104                                #[cfg(feature = "extra-children")]
31105                                {
31106                                    child_idx += 1;
31107                                }
31108                            }
31109                            b"extLst" => {
31110                                f_extension_list =
31111                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
31112                                #[cfg(feature = "extra-children")]
31113                                {
31114                                    child_idx += 1;
31115                                }
31116                            }
31117                            #[cfg(feature = "extra-children")]
31118                            _ => {
31119                                // Capture unknown empty element for roundtrip
31120                                let elem = RawXmlElement::from_empty(&e);
31121                                extra_children.push(PositionedNode::new(
31122                                    child_idx,
31123                                    RawXmlNode::Element(elem),
31124                                ));
31125                                child_idx += 1;
31126                            }
31127                            #[cfg(not(feature = "extra-children"))]
31128                            _ => {}
31129                        }
31130                    }
31131                    Event::End(_) => break,
31132                    Event::Eof => break,
31133                    _ => {}
31134                }
31135                buf.clear();
31136            }
31137        }
31138
31139        Ok(Self {
31140            ignored_error: f_ignored_error,
31141            extension_list: f_extension_list,
31142            #[cfg(feature = "extra-children")]
31143            extra_children,
31144        })
31145    }
31146}
31147
31148impl FromXml for IgnoredError {
31149    fn from_xml<R: BufRead>(
31150        reader: &mut Reader<R>,
31151        start_tag: &BytesStart,
31152        is_empty: bool,
31153    ) -> Result<Self, ParseError> {
31154        let mut f_square_reference: Option<SquareRef> = None;
31155        let mut f_eval_error = None;
31156        let mut f_two_digit_text_year = None;
31157        let mut f_number_stored_as_text = None;
31158        let mut f_formula = None;
31159        let mut f_formula_range = None;
31160        let mut f_unlocked_formula = None;
31161        let mut f_empty_cell_reference = None;
31162        let mut f_list_data_validation = None;
31163        let mut f_calculated_column = None;
31164        #[cfg(feature = "extra-attrs")]
31165        let mut extra_attrs = std::collections::HashMap::new();
31166
31167        // Parse attributes
31168        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31169            let val = String::from_utf8_lossy(&attr.value);
31170            match attr.key.local_name().as_ref() {
31171                b"sqref" => {
31172                    f_square_reference = Some(val.into_owned());
31173                }
31174                b"evalError" => {
31175                    f_eval_error = Some(val == "true" || val == "1");
31176                }
31177                b"twoDigitTextYear" => {
31178                    f_two_digit_text_year = Some(val == "true" || val == "1");
31179                }
31180                b"numberStoredAsText" => {
31181                    f_number_stored_as_text = Some(val == "true" || val == "1");
31182                }
31183                b"formula" => {
31184                    f_formula = Some(val == "true" || val == "1");
31185                }
31186                b"formulaRange" => {
31187                    f_formula_range = Some(val == "true" || val == "1");
31188                }
31189                b"unlockedFormula" => {
31190                    f_unlocked_formula = Some(val == "true" || val == "1");
31191                }
31192                b"emptyCellReference" => {
31193                    f_empty_cell_reference = Some(val == "true" || val == "1");
31194                }
31195                b"listDataValidation" => {
31196                    f_list_data_validation = Some(val == "true" || val == "1");
31197                }
31198                b"calculatedColumn" => {
31199                    f_calculated_column = Some(val == "true" || val == "1");
31200                }
31201                #[cfg(feature = "extra-attrs")]
31202                unknown => {
31203                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31204                    extra_attrs.insert(key, val.into_owned());
31205                }
31206                #[cfg(not(feature = "extra-attrs"))]
31207                _ => {}
31208            }
31209        }
31210
31211        if !is_empty {
31212            let mut buf = Vec::new();
31213            loop {
31214                match reader.read_event_into(&mut buf)? {
31215                    Event::End(_) => break,
31216                    Event::Eof => break,
31217                    _ => {}
31218                }
31219                buf.clear();
31220            }
31221        }
31222
31223        Ok(Self {
31224            square_reference: f_square_reference
31225                .ok_or_else(|| ParseError::MissingAttribute("sqref".to_string()))?,
31226            eval_error: f_eval_error,
31227            two_digit_text_year: f_two_digit_text_year,
31228            number_stored_as_text: f_number_stored_as_text,
31229            formula: f_formula,
31230            formula_range: f_formula_range,
31231            unlocked_formula: f_unlocked_formula,
31232            empty_cell_reference: f_empty_cell_reference,
31233            list_data_validation: f_list_data_validation,
31234            calculated_column: f_calculated_column,
31235            #[cfg(feature = "extra-attrs")]
31236            extra_attrs,
31237        })
31238    }
31239}
31240
31241impl FromXml for TableParts {
31242    fn from_xml<R: BufRead>(
31243        reader: &mut Reader<R>,
31244        start_tag: &BytesStart,
31245        is_empty: bool,
31246    ) -> Result<Self, ParseError> {
31247        let mut f_count = None;
31248        let mut f_table_part = Vec::new();
31249        #[cfg(feature = "extra-attrs")]
31250        let mut extra_attrs = std::collections::HashMap::new();
31251        #[cfg(feature = "extra-children")]
31252        let mut extra_children = Vec::new();
31253        #[cfg(feature = "extra-children")]
31254        let mut child_idx: usize = 0;
31255
31256        // Parse attributes
31257        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31258            let val = String::from_utf8_lossy(&attr.value);
31259            match attr.key.local_name().as_ref() {
31260                b"count" => {
31261                    f_count = val.parse().ok();
31262                }
31263                #[cfg(feature = "extra-attrs")]
31264                unknown => {
31265                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31266                    extra_attrs.insert(key, val.into_owned());
31267                }
31268                #[cfg(not(feature = "extra-attrs"))]
31269                _ => {}
31270            }
31271        }
31272
31273        // Parse child elements
31274        if !is_empty {
31275            let mut buf = Vec::new();
31276            loop {
31277                match reader.read_event_into(&mut buf)? {
31278                    Event::Start(e) => {
31279                        match e.local_name().as_ref() {
31280                            b"tablePart" => {
31281                                f_table_part.push(TablePart::from_xml(reader, &e, false)?);
31282                                #[cfg(feature = "extra-children")]
31283                                {
31284                                    child_idx += 1;
31285                                }
31286                            }
31287                            #[cfg(feature = "extra-children")]
31288                            _ => {
31289                                // Capture unknown element for roundtrip
31290                                let elem = RawXmlElement::from_reader(reader, &e)?;
31291                                extra_children.push(PositionedNode::new(
31292                                    child_idx,
31293                                    RawXmlNode::Element(elem),
31294                                ));
31295                                child_idx += 1;
31296                            }
31297                            #[cfg(not(feature = "extra-children"))]
31298                            _ => {
31299                                // Skip unknown element
31300                                skip_element(reader)?;
31301                            }
31302                        }
31303                    }
31304                    Event::Empty(e) => {
31305                        match e.local_name().as_ref() {
31306                            b"tablePart" => {
31307                                f_table_part.push(TablePart::from_xml(reader, &e, true)?);
31308                                #[cfg(feature = "extra-children")]
31309                                {
31310                                    child_idx += 1;
31311                                }
31312                            }
31313                            #[cfg(feature = "extra-children")]
31314                            _ => {
31315                                // Capture unknown empty element for roundtrip
31316                                let elem = RawXmlElement::from_empty(&e);
31317                                extra_children.push(PositionedNode::new(
31318                                    child_idx,
31319                                    RawXmlNode::Element(elem),
31320                                ));
31321                                child_idx += 1;
31322                            }
31323                            #[cfg(not(feature = "extra-children"))]
31324                            _ => {}
31325                        }
31326                    }
31327                    Event::End(_) => break,
31328                    Event::Eof => break,
31329                    _ => {}
31330                }
31331                buf.clear();
31332            }
31333        }
31334
31335        Ok(Self {
31336            count: f_count,
31337            table_part: f_table_part,
31338            #[cfg(feature = "extra-attrs")]
31339            extra_attrs,
31340            #[cfg(feature = "extra-children")]
31341            extra_children,
31342        })
31343    }
31344}
31345
31346impl FromXml for TablePart {
31347    fn from_xml<R: BufRead>(
31348        reader: &mut Reader<R>,
31349        start_tag: &BytesStart,
31350        is_empty: bool,
31351    ) -> Result<Self, ParseError> {
31352        let mut f_id: Option<STRelationshipId> = None;
31353        #[cfg(feature = "extra-attrs")]
31354        let mut extra_attrs = std::collections::HashMap::new();
31355
31356        // Parse attributes
31357        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31358            let val = String::from_utf8_lossy(&attr.value);
31359            match attr.key.local_name().as_ref() {
31360                b"id" => {
31361                    f_id = Some(val.into_owned());
31362                }
31363                #[cfg(feature = "extra-attrs")]
31364                unknown => {
31365                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31366                    extra_attrs.insert(key, val.into_owned());
31367                }
31368                #[cfg(not(feature = "extra-attrs"))]
31369                _ => {}
31370            }
31371        }
31372
31373        if !is_empty {
31374            let mut buf = Vec::new();
31375            loop {
31376                match reader.read_event_into(&mut buf)? {
31377                    Event::End(_) => break,
31378                    Event::Eof => break,
31379                    _ => {}
31380                }
31381                buf.clear();
31382            }
31383        }
31384
31385        Ok(Self {
31386            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
31387            #[cfg(feature = "extra-attrs")]
31388            extra_attrs,
31389        })
31390    }
31391}
31392
31393impl FromXml for Metadata {
31394    fn from_xml<R: BufRead>(
31395        reader: &mut Reader<R>,
31396        start_tag: &BytesStart,
31397        is_empty: bool,
31398    ) -> Result<Self, ParseError> {
31399        let mut f_metadata_types = None;
31400        let mut f_metadata_strings = None;
31401        let mut f_mdx_metadata = None;
31402        let mut f_future_metadata = Vec::new();
31403        let mut f_cell_metadata = None;
31404        let mut f_value_metadata = None;
31405        let mut f_extension_list = None;
31406        #[cfg(feature = "extra-children")]
31407        let mut extra_children = Vec::new();
31408        #[cfg(feature = "extra-children")]
31409        let mut child_idx: usize = 0;
31410
31411        // Parse child elements
31412        if !is_empty {
31413            let mut buf = Vec::new();
31414            loop {
31415                match reader.read_event_into(&mut buf)? {
31416                    Event::Start(e) => {
31417                        match e.local_name().as_ref() {
31418                            b"metadataTypes" => {
31419                                f_metadata_types =
31420                                    Some(Box::new(MetadataTypes::from_xml(reader, &e, false)?));
31421                                #[cfg(feature = "extra-children")]
31422                                {
31423                                    child_idx += 1;
31424                                }
31425                            }
31426                            b"metadataStrings" => {
31427                                f_metadata_strings =
31428                                    Some(Box::new(MetadataStrings::from_xml(reader, &e, false)?));
31429                                #[cfg(feature = "extra-children")]
31430                                {
31431                                    child_idx += 1;
31432                                }
31433                            }
31434                            b"mdxMetadata" => {
31435                                f_mdx_metadata =
31436                                    Some(Box::new(CTMdxMetadata::from_xml(reader, &e, false)?));
31437                                #[cfg(feature = "extra-children")]
31438                                {
31439                                    child_idx += 1;
31440                                }
31441                            }
31442                            b"futureMetadata" => {
31443                                f_future_metadata
31444                                    .push(CTFutureMetadata::from_xml(reader, &e, false)?);
31445                                #[cfg(feature = "extra-children")]
31446                                {
31447                                    child_idx += 1;
31448                                }
31449                            }
31450                            b"cellMetadata" => {
31451                                f_cell_metadata =
31452                                    Some(Box::new(MetadataBlocks::from_xml(reader, &e, false)?));
31453                                #[cfg(feature = "extra-children")]
31454                                {
31455                                    child_idx += 1;
31456                                }
31457                            }
31458                            b"valueMetadata" => {
31459                                f_value_metadata =
31460                                    Some(Box::new(MetadataBlocks::from_xml(reader, &e, false)?));
31461                                #[cfg(feature = "extra-children")]
31462                                {
31463                                    child_idx += 1;
31464                                }
31465                            }
31466                            b"extLst" => {
31467                                f_extension_list =
31468                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
31469                                #[cfg(feature = "extra-children")]
31470                                {
31471                                    child_idx += 1;
31472                                }
31473                            }
31474                            #[cfg(feature = "extra-children")]
31475                            _ => {
31476                                // Capture unknown element for roundtrip
31477                                let elem = RawXmlElement::from_reader(reader, &e)?;
31478                                extra_children.push(PositionedNode::new(
31479                                    child_idx,
31480                                    RawXmlNode::Element(elem),
31481                                ));
31482                                child_idx += 1;
31483                            }
31484                            #[cfg(not(feature = "extra-children"))]
31485                            _ => {
31486                                // Skip unknown element
31487                                skip_element(reader)?;
31488                            }
31489                        }
31490                    }
31491                    Event::Empty(e) => {
31492                        match e.local_name().as_ref() {
31493                            b"metadataTypes" => {
31494                                f_metadata_types =
31495                                    Some(Box::new(MetadataTypes::from_xml(reader, &e, true)?));
31496                                #[cfg(feature = "extra-children")]
31497                                {
31498                                    child_idx += 1;
31499                                }
31500                            }
31501                            b"metadataStrings" => {
31502                                f_metadata_strings =
31503                                    Some(Box::new(MetadataStrings::from_xml(reader, &e, true)?));
31504                                #[cfg(feature = "extra-children")]
31505                                {
31506                                    child_idx += 1;
31507                                }
31508                            }
31509                            b"mdxMetadata" => {
31510                                f_mdx_metadata =
31511                                    Some(Box::new(CTMdxMetadata::from_xml(reader, &e, true)?));
31512                                #[cfg(feature = "extra-children")]
31513                                {
31514                                    child_idx += 1;
31515                                }
31516                            }
31517                            b"futureMetadata" => {
31518                                f_future_metadata
31519                                    .push(CTFutureMetadata::from_xml(reader, &e, true)?);
31520                                #[cfg(feature = "extra-children")]
31521                                {
31522                                    child_idx += 1;
31523                                }
31524                            }
31525                            b"cellMetadata" => {
31526                                f_cell_metadata =
31527                                    Some(Box::new(MetadataBlocks::from_xml(reader, &e, true)?));
31528                                #[cfg(feature = "extra-children")]
31529                                {
31530                                    child_idx += 1;
31531                                }
31532                            }
31533                            b"valueMetadata" => {
31534                                f_value_metadata =
31535                                    Some(Box::new(MetadataBlocks::from_xml(reader, &e, true)?));
31536                                #[cfg(feature = "extra-children")]
31537                                {
31538                                    child_idx += 1;
31539                                }
31540                            }
31541                            b"extLst" => {
31542                                f_extension_list =
31543                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
31544                                #[cfg(feature = "extra-children")]
31545                                {
31546                                    child_idx += 1;
31547                                }
31548                            }
31549                            #[cfg(feature = "extra-children")]
31550                            _ => {
31551                                // Capture unknown empty element for roundtrip
31552                                let elem = RawXmlElement::from_empty(&e);
31553                                extra_children.push(PositionedNode::new(
31554                                    child_idx,
31555                                    RawXmlNode::Element(elem),
31556                                ));
31557                                child_idx += 1;
31558                            }
31559                            #[cfg(not(feature = "extra-children"))]
31560                            _ => {}
31561                        }
31562                    }
31563                    Event::End(_) => break,
31564                    Event::Eof => break,
31565                    _ => {}
31566                }
31567                buf.clear();
31568            }
31569        }
31570
31571        Ok(Self {
31572            metadata_types: f_metadata_types,
31573            metadata_strings: f_metadata_strings,
31574            mdx_metadata: f_mdx_metadata,
31575            future_metadata: f_future_metadata,
31576            cell_metadata: f_cell_metadata,
31577            value_metadata: f_value_metadata,
31578            extension_list: f_extension_list,
31579            #[cfg(feature = "extra-children")]
31580            extra_children,
31581        })
31582    }
31583}
31584
31585impl FromXml for MetadataTypes {
31586    fn from_xml<R: BufRead>(
31587        reader: &mut Reader<R>,
31588        start_tag: &BytesStart,
31589        is_empty: bool,
31590    ) -> Result<Self, ParseError> {
31591        let mut f_count = None;
31592        let mut f_metadata_type = Vec::new();
31593        #[cfg(feature = "extra-attrs")]
31594        let mut extra_attrs = std::collections::HashMap::new();
31595        #[cfg(feature = "extra-children")]
31596        let mut extra_children = Vec::new();
31597        #[cfg(feature = "extra-children")]
31598        let mut child_idx: usize = 0;
31599
31600        // Parse attributes
31601        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31602            let val = String::from_utf8_lossy(&attr.value);
31603            match attr.key.local_name().as_ref() {
31604                b"count" => {
31605                    f_count = val.parse().ok();
31606                }
31607                #[cfg(feature = "extra-attrs")]
31608                unknown => {
31609                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31610                    extra_attrs.insert(key, val.into_owned());
31611                }
31612                #[cfg(not(feature = "extra-attrs"))]
31613                _ => {}
31614            }
31615        }
31616
31617        // Parse child elements
31618        if !is_empty {
31619            let mut buf = Vec::new();
31620            loop {
31621                match reader.read_event_into(&mut buf)? {
31622                    Event::Start(e) => {
31623                        match e.local_name().as_ref() {
31624                            b"metadataType" => {
31625                                f_metadata_type.push(MetadataType::from_xml(reader, &e, false)?);
31626                                #[cfg(feature = "extra-children")]
31627                                {
31628                                    child_idx += 1;
31629                                }
31630                            }
31631                            #[cfg(feature = "extra-children")]
31632                            _ => {
31633                                // Capture unknown element for roundtrip
31634                                let elem = RawXmlElement::from_reader(reader, &e)?;
31635                                extra_children.push(PositionedNode::new(
31636                                    child_idx,
31637                                    RawXmlNode::Element(elem),
31638                                ));
31639                                child_idx += 1;
31640                            }
31641                            #[cfg(not(feature = "extra-children"))]
31642                            _ => {
31643                                // Skip unknown element
31644                                skip_element(reader)?;
31645                            }
31646                        }
31647                    }
31648                    Event::Empty(e) => {
31649                        match e.local_name().as_ref() {
31650                            b"metadataType" => {
31651                                f_metadata_type.push(MetadataType::from_xml(reader, &e, true)?);
31652                                #[cfg(feature = "extra-children")]
31653                                {
31654                                    child_idx += 1;
31655                                }
31656                            }
31657                            #[cfg(feature = "extra-children")]
31658                            _ => {
31659                                // Capture unknown empty element for roundtrip
31660                                let elem = RawXmlElement::from_empty(&e);
31661                                extra_children.push(PositionedNode::new(
31662                                    child_idx,
31663                                    RawXmlNode::Element(elem),
31664                                ));
31665                                child_idx += 1;
31666                            }
31667                            #[cfg(not(feature = "extra-children"))]
31668                            _ => {}
31669                        }
31670                    }
31671                    Event::End(_) => break,
31672                    Event::Eof => break,
31673                    _ => {}
31674                }
31675                buf.clear();
31676            }
31677        }
31678
31679        Ok(Self {
31680            count: f_count,
31681            metadata_type: f_metadata_type,
31682            #[cfg(feature = "extra-attrs")]
31683            extra_attrs,
31684            #[cfg(feature = "extra-children")]
31685            extra_children,
31686        })
31687    }
31688}
31689
31690impl FromXml for MetadataType {
31691    fn from_xml<R: BufRead>(
31692        reader: &mut Reader<R>,
31693        start_tag: &BytesStart,
31694        is_empty: bool,
31695    ) -> Result<Self, ParseError> {
31696        let mut f_name: Option<XmlString> = None;
31697        let mut f_min_supported_version: Option<u32> = None;
31698        let mut f_ghost_row = None;
31699        let mut f_ghost_col = None;
31700        let mut f_edit = None;
31701        let mut f_delete = None;
31702        let mut f_copy = None;
31703        let mut f_paste_all = None;
31704        let mut f_paste_formulas = None;
31705        let mut f_paste_values = None;
31706        let mut f_paste_formats = None;
31707        let mut f_paste_comments = None;
31708        let mut f_paste_data_validation = None;
31709        let mut f_paste_borders = None;
31710        let mut f_paste_col_widths = None;
31711        let mut f_paste_number_formats = None;
31712        let mut f_merge = None;
31713        let mut f_split_first = None;
31714        let mut f_split_all = None;
31715        let mut f_row_col_shift = None;
31716        let mut f_clear_all = None;
31717        let mut f_clear_formats = None;
31718        let mut f_clear_contents = None;
31719        let mut f_clear_comments = None;
31720        let mut f_assign = None;
31721        let mut f_coerce = None;
31722        let mut f_adjust = None;
31723        let mut f_cell_meta = None;
31724        #[cfg(feature = "extra-attrs")]
31725        let mut extra_attrs = std::collections::HashMap::new();
31726
31727        // Parse attributes
31728        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31729            let val = String::from_utf8_lossy(&attr.value);
31730            match attr.key.local_name().as_ref() {
31731                b"name" => {
31732                    f_name = Some(val.into_owned());
31733                }
31734                b"minSupportedVersion" => {
31735                    f_min_supported_version = val.parse().ok();
31736                }
31737                b"ghostRow" => {
31738                    f_ghost_row = Some(val == "true" || val == "1");
31739                }
31740                b"ghostCol" => {
31741                    f_ghost_col = Some(val == "true" || val == "1");
31742                }
31743                b"edit" => {
31744                    f_edit = Some(val == "true" || val == "1");
31745                }
31746                b"delete" => {
31747                    f_delete = Some(val == "true" || val == "1");
31748                }
31749                b"copy" => {
31750                    f_copy = Some(val == "true" || val == "1");
31751                }
31752                b"pasteAll" => {
31753                    f_paste_all = Some(val == "true" || val == "1");
31754                }
31755                b"pasteFormulas" => {
31756                    f_paste_formulas = Some(val == "true" || val == "1");
31757                }
31758                b"pasteValues" => {
31759                    f_paste_values = Some(val == "true" || val == "1");
31760                }
31761                b"pasteFormats" => {
31762                    f_paste_formats = Some(val == "true" || val == "1");
31763                }
31764                b"pasteComments" => {
31765                    f_paste_comments = Some(val == "true" || val == "1");
31766                }
31767                b"pasteDataValidation" => {
31768                    f_paste_data_validation = Some(val == "true" || val == "1");
31769                }
31770                b"pasteBorders" => {
31771                    f_paste_borders = Some(val == "true" || val == "1");
31772                }
31773                b"pasteColWidths" => {
31774                    f_paste_col_widths = Some(val == "true" || val == "1");
31775                }
31776                b"pasteNumberFormats" => {
31777                    f_paste_number_formats = Some(val == "true" || val == "1");
31778                }
31779                b"merge" => {
31780                    f_merge = Some(val == "true" || val == "1");
31781                }
31782                b"splitFirst" => {
31783                    f_split_first = Some(val == "true" || val == "1");
31784                }
31785                b"splitAll" => {
31786                    f_split_all = Some(val == "true" || val == "1");
31787                }
31788                b"rowColShift" => {
31789                    f_row_col_shift = Some(val == "true" || val == "1");
31790                }
31791                b"clearAll" => {
31792                    f_clear_all = Some(val == "true" || val == "1");
31793                }
31794                b"clearFormats" => {
31795                    f_clear_formats = Some(val == "true" || val == "1");
31796                }
31797                b"clearContents" => {
31798                    f_clear_contents = Some(val == "true" || val == "1");
31799                }
31800                b"clearComments" => {
31801                    f_clear_comments = Some(val == "true" || val == "1");
31802                }
31803                b"assign" => {
31804                    f_assign = Some(val == "true" || val == "1");
31805                }
31806                b"coerce" => {
31807                    f_coerce = Some(val == "true" || val == "1");
31808                }
31809                b"adjust" => {
31810                    f_adjust = Some(val == "true" || val == "1");
31811                }
31812                b"cellMeta" => {
31813                    f_cell_meta = Some(val == "true" || val == "1");
31814                }
31815                #[cfg(feature = "extra-attrs")]
31816                unknown => {
31817                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31818                    extra_attrs.insert(key, val.into_owned());
31819                }
31820                #[cfg(not(feature = "extra-attrs"))]
31821                _ => {}
31822            }
31823        }
31824
31825        if !is_empty {
31826            let mut buf = Vec::new();
31827            loop {
31828                match reader.read_event_into(&mut buf)? {
31829                    Event::End(_) => break,
31830                    Event::Eof => break,
31831                    _ => {}
31832                }
31833                buf.clear();
31834            }
31835        }
31836
31837        Ok(Self {
31838            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
31839            min_supported_version: f_min_supported_version
31840                .ok_or_else(|| ParseError::MissingAttribute("minSupportedVersion".to_string()))?,
31841            ghost_row: f_ghost_row,
31842            ghost_col: f_ghost_col,
31843            edit: f_edit,
31844            delete: f_delete,
31845            copy: f_copy,
31846            paste_all: f_paste_all,
31847            paste_formulas: f_paste_formulas,
31848            paste_values: f_paste_values,
31849            paste_formats: f_paste_formats,
31850            paste_comments: f_paste_comments,
31851            paste_data_validation: f_paste_data_validation,
31852            paste_borders: f_paste_borders,
31853            paste_col_widths: f_paste_col_widths,
31854            paste_number_formats: f_paste_number_formats,
31855            merge: f_merge,
31856            split_first: f_split_first,
31857            split_all: f_split_all,
31858            row_col_shift: f_row_col_shift,
31859            clear_all: f_clear_all,
31860            clear_formats: f_clear_formats,
31861            clear_contents: f_clear_contents,
31862            clear_comments: f_clear_comments,
31863            assign: f_assign,
31864            coerce: f_coerce,
31865            adjust: f_adjust,
31866            cell_meta: f_cell_meta,
31867            #[cfg(feature = "extra-attrs")]
31868            extra_attrs,
31869        })
31870    }
31871}
31872
31873impl FromXml for MetadataBlocks {
31874    fn from_xml<R: BufRead>(
31875        reader: &mut Reader<R>,
31876        start_tag: &BytesStart,
31877        is_empty: bool,
31878    ) -> Result<Self, ParseError> {
31879        let mut f_count = None;
31880        let mut f_bk = Vec::new();
31881        #[cfg(feature = "extra-attrs")]
31882        let mut extra_attrs = std::collections::HashMap::new();
31883        #[cfg(feature = "extra-children")]
31884        let mut extra_children = Vec::new();
31885        #[cfg(feature = "extra-children")]
31886        let mut child_idx: usize = 0;
31887
31888        // Parse attributes
31889        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
31890            let val = String::from_utf8_lossy(&attr.value);
31891            match attr.key.local_name().as_ref() {
31892                b"count" => {
31893                    f_count = val.parse().ok();
31894                }
31895                #[cfg(feature = "extra-attrs")]
31896                unknown => {
31897                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
31898                    extra_attrs.insert(key, val.into_owned());
31899                }
31900                #[cfg(not(feature = "extra-attrs"))]
31901                _ => {}
31902            }
31903        }
31904
31905        // Parse child elements
31906        if !is_empty {
31907            let mut buf = Vec::new();
31908            loop {
31909                match reader.read_event_into(&mut buf)? {
31910                    Event::Start(e) => {
31911                        match e.local_name().as_ref() {
31912                            b"bk" => {
31913                                f_bk.push(MetadataBlock::from_xml(reader, &e, false)?);
31914                                #[cfg(feature = "extra-children")]
31915                                {
31916                                    child_idx += 1;
31917                                }
31918                            }
31919                            #[cfg(feature = "extra-children")]
31920                            _ => {
31921                                // Capture unknown element for roundtrip
31922                                let elem = RawXmlElement::from_reader(reader, &e)?;
31923                                extra_children.push(PositionedNode::new(
31924                                    child_idx,
31925                                    RawXmlNode::Element(elem),
31926                                ));
31927                                child_idx += 1;
31928                            }
31929                            #[cfg(not(feature = "extra-children"))]
31930                            _ => {
31931                                // Skip unknown element
31932                                skip_element(reader)?;
31933                            }
31934                        }
31935                    }
31936                    Event::Empty(e) => {
31937                        match e.local_name().as_ref() {
31938                            b"bk" => {
31939                                f_bk.push(MetadataBlock::from_xml(reader, &e, true)?);
31940                                #[cfg(feature = "extra-children")]
31941                                {
31942                                    child_idx += 1;
31943                                }
31944                            }
31945                            #[cfg(feature = "extra-children")]
31946                            _ => {
31947                                // Capture unknown empty element for roundtrip
31948                                let elem = RawXmlElement::from_empty(&e);
31949                                extra_children.push(PositionedNode::new(
31950                                    child_idx,
31951                                    RawXmlNode::Element(elem),
31952                                ));
31953                                child_idx += 1;
31954                            }
31955                            #[cfg(not(feature = "extra-children"))]
31956                            _ => {}
31957                        }
31958                    }
31959                    Event::End(_) => break,
31960                    Event::Eof => break,
31961                    _ => {}
31962                }
31963                buf.clear();
31964            }
31965        }
31966
31967        Ok(Self {
31968            count: f_count,
31969            bk: f_bk,
31970            #[cfg(feature = "extra-attrs")]
31971            extra_attrs,
31972            #[cfg(feature = "extra-children")]
31973            extra_children,
31974        })
31975    }
31976}
31977
31978impl FromXml for MetadataBlock {
31979    fn from_xml<R: BufRead>(
31980        reader: &mut Reader<R>,
31981        start_tag: &BytesStart,
31982        is_empty: bool,
31983    ) -> Result<Self, ParseError> {
31984        let mut f_rc = Vec::new();
31985        #[cfg(feature = "extra-children")]
31986        let mut extra_children = Vec::new();
31987        #[cfg(feature = "extra-children")]
31988        let mut child_idx: usize = 0;
31989
31990        // Parse child elements
31991        if !is_empty {
31992            let mut buf = Vec::new();
31993            loop {
31994                match reader.read_event_into(&mut buf)? {
31995                    Event::Start(e) => {
31996                        match e.local_name().as_ref() {
31997                            b"rc" => {
31998                                f_rc.push(MetadataRecord::from_xml(reader, &e, false)?);
31999                                #[cfg(feature = "extra-children")]
32000                                {
32001                                    child_idx += 1;
32002                                }
32003                            }
32004                            #[cfg(feature = "extra-children")]
32005                            _ => {
32006                                // Capture unknown element for roundtrip
32007                                let elem = RawXmlElement::from_reader(reader, &e)?;
32008                                extra_children.push(PositionedNode::new(
32009                                    child_idx,
32010                                    RawXmlNode::Element(elem),
32011                                ));
32012                                child_idx += 1;
32013                            }
32014                            #[cfg(not(feature = "extra-children"))]
32015                            _ => {
32016                                // Skip unknown element
32017                                skip_element(reader)?;
32018                            }
32019                        }
32020                    }
32021                    Event::Empty(e) => {
32022                        match e.local_name().as_ref() {
32023                            b"rc" => {
32024                                f_rc.push(MetadataRecord::from_xml(reader, &e, true)?);
32025                                #[cfg(feature = "extra-children")]
32026                                {
32027                                    child_idx += 1;
32028                                }
32029                            }
32030                            #[cfg(feature = "extra-children")]
32031                            _ => {
32032                                // Capture unknown empty element for roundtrip
32033                                let elem = RawXmlElement::from_empty(&e);
32034                                extra_children.push(PositionedNode::new(
32035                                    child_idx,
32036                                    RawXmlNode::Element(elem),
32037                                ));
32038                                child_idx += 1;
32039                            }
32040                            #[cfg(not(feature = "extra-children"))]
32041                            _ => {}
32042                        }
32043                    }
32044                    Event::End(_) => break,
32045                    Event::Eof => break,
32046                    _ => {}
32047                }
32048                buf.clear();
32049            }
32050        }
32051
32052        Ok(Self {
32053            rc: f_rc,
32054            #[cfg(feature = "extra-children")]
32055            extra_children,
32056        })
32057    }
32058}
32059
32060impl FromXml for MetadataRecord {
32061    fn from_xml<R: BufRead>(
32062        reader: &mut Reader<R>,
32063        start_tag: &BytesStart,
32064        is_empty: bool,
32065    ) -> Result<Self, ParseError> {
32066        let mut f_cell_type: Option<u32> = None;
32067        let mut f_value: Option<u32> = None;
32068        #[cfg(feature = "extra-attrs")]
32069        let mut extra_attrs = std::collections::HashMap::new();
32070
32071        // Parse attributes
32072        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32073            let val = String::from_utf8_lossy(&attr.value);
32074            match attr.key.local_name().as_ref() {
32075                b"t" => {
32076                    f_cell_type = val.parse().ok();
32077                }
32078                b"v" => {
32079                    f_value = val.parse().ok();
32080                }
32081                #[cfg(feature = "extra-attrs")]
32082                unknown => {
32083                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32084                    extra_attrs.insert(key, val.into_owned());
32085                }
32086                #[cfg(not(feature = "extra-attrs"))]
32087                _ => {}
32088            }
32089        }
32090
32091        if !is_empty {
32092            let mut buf = Vec::new();
32093            loop {
32094                match reader.read_event_into(&mut buf)? {
32095                    Event::End(_) => break,
32096                    Event::Eof => break,
32097                    _ => {}
32098                }
32099                buf.clear();
32100            }
32101        }
32102
32103        Ok(Self {
32104            cell_type: f_cell_type.ok_or_else(|| ParseError::MissingAttribute("t".to_string()))?,
32105            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
32106            #[cfg(feature = "extra-attrs")]
32107            extra_attrs,
32108        })
32109    }
32110}
32111
32112impl FromXml for CTFutureMetadata {
32113    fn from_xml<R: BufRead>(
32114        reader: &mut Reader<R>,
32115        start_tag: &BytesStart,
32116        is_empty: bool,
32117    ) -> Result<Self, ParseError> {
32118        let mut f_name: Option<XmlString> = None;
32119        let mut f_count = None;
32120        let mut f_bk = Vec::new();
32121        let mut f_extension_list = None;
32122        #[cfg(feature = "extra-attrs")]
32123        let mut extra_attrs = std::collections::HashMap::new();
32124        #[cfg(feature = "extra-children")]
32125        let mut extra_children = Vec::new();
32126        #[cfg(feature = "extra-children")]
32127        let mut child_idx: usize = 0;
32128
32129        // Parse attributes
32130        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32131            let val = String::from_utf8_lossy(&attr.value);
32132            match attr.key.local_name().as_ref() {
32133                b"name" => {
32134                    f_name = Some(val.into_owned());
32135                }
32136                b"count" => {
32137                    f_count = val.parse().ok();
32138                }
32139                #[cfg(feature = "extra-attrs")]
32140                unknown => {
32141                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32142                    extra_attrs.insert(key, val.into_owned());
32143                }
32144                #[cfg(not(feature = "extra-attrs"))]
32145                _ => {}
32146            }
32147        }
32148
32149        // Parse child elements
32150        if !is_empty {
32151            let mut buf = Vec::new();
32152            loop {
32153                match reader.read_event_into(&mut buf)? {
32154                    Event::Start(e) => {
32155                        match e.local_name().as_ref() {
32156                            b"bk" => {
32157                                f_bk.push(CTFutureMetadataBlock::from_xml(reader, &e, false)?);
32158                                #[cfg(feature = "extra-children")]
32159                                {
32160                                    child_idx += 1;
32161                                }
32162                            }
32163                            b"extLst" => {
32164                                f_extension_list =
32165                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
32166                                #[cfg(feature = "extra-children")]
32167                                {
32168                                    child_idx += 1;
32169                                }
32170                            }
32171                            #[cfg(feature = "extra-children")]
32172                            _ => {
32173                                // Capture unknown element for roundtrip
32174                                let elem = RawXmlElement::from_reader(reader, &e)?;
32175                                extra_children.push(PositionedNode::new(
32176                                    child_idx,
32177                                    RawXmlNode::Element(elem),
32178                                ));
32179                                child_idx += 1;
32180                            }
32181                            #[cfg(not(feature = "extra-children"))]
32182                            _ => {
32183                                // Skip unknown element
32184                                skip_element(reader)?;
32185                            }
32186                        }
32187                    }
32188                    Event::Empty(e) => {
32189                        match e.local_name().as_ref() {
32190                            b"bk" => {
32191                                f_bk.push(CTFutureMetadataBlock::from_xml(reader, &e, true)?);
32192                                #[cfg(feature = "extra-children")]
32193                                {
32194                                    child_idx += 1;
32195                                }
32196                            }
32197                            b"extLst" => {
32198                                f_extension_list =
32199                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
32200                                #[cfg(feature = "extra-children")]
32201                                {
32202                                    child_idx += 1;
32203                                }
32204                            }
32205                            #[cfg(feature = "extra-children")]
32206                            _ => {
32207                                // Capture unknown empty element for roundtrip
32208                                let elem = RawXmlElement::from_empty(&e);
32209                                extra_children.push(PositionedNode::new(
32210                                    child_idx,
32211                                    RawXmlNode::Element(elem),
32212                                ));
32213                                child_idx += 1;
32214                            }
32215                            #[cfg(not(feature = "extra-children"))]
32216                            _ => {}
32217                        }
32218                    }
32219                    Event::End(_) => break,
32220                    Event::Eof => break,
32221                    _ => {}
32222                }
32223                buf.clear();
32224            }
32225        }
32226
32227        Ok(Self {
32228            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
32229            count: f_count,
32230            bk: f_bk,
32231            extension_list: f_extension_list,
32232            #[cfg(feature = "extra-attrs")]
32233            extra_attrs,
32234            #[cfg(feature = "extra-children")]
32235            extra_children,
32236        })
32237    }
32238}
32239
32240impl FromXml for CTFutureMetadataBlock {
32241    fn from_xml<R: BufRead>(
32242        reader: &mut Reader<R>,
32243        start_tag: &BytesStart,
32244        is_empty: bool,
32245    ) -> Result<Self, ParseError> {
32246        let mut f_extension_list = None;
32247        #[cfg(feature = "extra-children")]
32248        let mut extra_children = Vec::new();
32249        #[cfg(feature = "extra-children")]
32250        let mut child_idx: usize = 0;
32251
32252        // Parse child elements
32253        if !is_empty {
32254            let mut buf = Vec::new();
32255            loop {
32256                match reader.read_event_into(&mut buf)? {
32257                    Event::Start(e) => {
32258                        match e.local_name().as_ref() {
32259                            b"extLst" => {
32260                                f_extension_list =
32261                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
32262                                #[cfg(feature = "extra-children")]
32263                                {
32264                                    child_idx += 1;
32265                                }
32266                            }
32267                            #[cfg(feature = "extra-children")]
32268                            _ => {
32269                                // Capture unknown element for roundtrip
32270                                let elem = RawXmlElement::from_reader(reader, &e)?;
32271                                extra_children.push(PositionedNode::new(
32272                                    child_idx,
32273                                    RawXmlNode::Element(elem),
32274                                ));
32275                                child_idx += 1;
32276                            }
32277                            #[cfg(not(feature = "extra-children"))]
32278                            _ => {
32279                                // Skip unknown element
32280                                skip_element(reader)?;
32281                            }
32282                        }
32283                    }
32284                    Event::Empty(e) => {
32285                        match e.local_name().as_ref() {
32286                            b"extLst" => {
32287                                f_extension_list =
32288                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
32289                                #[cfg(feature = "extra-children")]
32290                                {
32291                                    child_idx += 1;
32292                                }
32293                            }
32294                            #[cfg(feature = "extra-children")]
32295                            _ => {
32296                                // Capture unknown empty element for roundtrip
32297                                let elem = RawXmlElement::from_empty(&e);
32298                                extra_children.push(PositionedNode::new(
32299                                    child_idx,
32300                                    RawXmlNode::Element(elem),
32301                                ));
32302                                child_idx += 1;
32303                            }
32304                            #[cfg(not(feature = "extra-children"))]
32305                            _ => {}
32306                        }
32307                    }
32308                    Event::End(_) => break,
32309                    Event::Eof => break,
32310                    _ => {}
32311                }
32312                buf.clear();
32313            }
32314        }
32315
32316        Ok(Self {
32317            extension_list: f_extension_list,
32318            #[cfg(feature = "extra-children")]
32319            extra_children,
32320        })
32321    }
32322}
32323
32324impl FromXml for CTMdxMetadata {
32325    fn from_xml<R: BufRead>(
32326        reader: &mut Reader<R>,
32327        start_tag: &BytesStart,
32328        is_empty: bool,
32329    ) -> Result<Self, ParseError> {
32330        let mut f_count = None;
32331        let mut f_mdx = Vec::new();
32332        #[cfg(feature = "extra-attrs")]
32333        let mut extra_attrs = std::collections::HashMap::new();
32334        #[cfg(feature = "extra-children")]
32335        let mut extra_children = Vec::new();
32336        #[cfg(feature = "extra-children")]
32337        let mut child_idx: usize = 0;
32338
32339        // Parse attributes
32340        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32341            let val = String::from_utf8_lossy(&attr.value);
32342            match attr.key.local_name().as_ref() {
32343                b"count" => {
32344                    f_count = val.parse().ok();
32345                }
32346                #[cfg(feature = "extra-attrs")]
32347                unknown => {
32348                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32349                    extra_attrs.insert(key, val.into_owned());
32350                }
32351                #[cfg(not(feature = "extra-attrs"))]
32352                _ => {}
32353            }
32354        }
32355
32356        // Parse child elements
32357        if !is_empty {
32358            let mut buf = Vec::new();
32359            loop {
32360                match reader.read_event_into(&mut buf)? {
32361                    Event::Start(e) => {
32362                        match e.local_name().as_ref() {
32363                            b"mdx" => {
32364                                f_mdx.push(CTMdx::from_xml(reader, &e, false)?);
32365                                #[cfg(feature = "extra-children")]
32366                                {
32367                                    child_idx += 1;
32368                                }
32369                            }
32370                            #[cfg(feature = "extra-children")]
32371                            _ => {
32372                                // Capture unknown element for roundtrip
32373                                let elem = RawXmlElement::from_reader(reader, &e)?;
32374                                extra_children.push(PositionedNode::new(
32375                                    child_idx,
32376                                    RawXmlNode::Element(elem),
32377                                ));
32378                                child_idx += 1;
32379                            }
32380                            #[cfg(not(feature = "extra-children"))]
32381                            _ => {
32382                                // Skip unknown element
32383                                skip_element(reader)?;
32384                            }
32385                        }
32386                    }
32387                    Event::Empty(e) => {
32388                        match e.local_name().as_ref() {
32389                            b"mdx" => {
32390                                f_mdx.push(CTMdx::from_xml(reader, &e, true)?);
32391                                #[cfg(feature = "extra-children")]
32392                                {
32393                                    child_idx += 1;
32394                                }
32395                            }
32396                            #[cfg(feature = "extra-children")]
32397                            _ => {
32398                                // Capture unknown empty element for roundtrip
32399                                let elem = RawXmlElement::from_empty(&e);
32400                                extra_children.push(PositionedNode::new(
32401                                    child_idx,
32402                                    RawXmlNode::Element(elem),
32403                                ));
32404                                child_idx += 1;
32405                            }
32406                            #[cfg(not(feature = "extra-children"))]
32407                            _ => {}
32408                        }
32409                    }
32410                    Event::End(_) => break,
32411                    Event::Eof => break,
32412                    _ => {}
32413                }
32414                buf.clear();
32415            }
32416        }
32417
32418        Ok(Self {
32419            count: f_count,
32420            mdx: f_mdx,
32421            #[cfg(feature = "extra-attrs")]
32422            extra_attrs,
32423            #[cfg(feature = "extra-children")]
32424            extra_children,
32425        })
32426    }
32427}
32428
32429impl FromXml for CTMdx {
32430    fn from_xml<R: BufRead>(
32431        reader: &mut Reader<R>,
32432        start_tag: &BytesStart,
32433        is_empty: bool,
32434    ) -> Result<Self, ParseError> {
32435        let mut f_n: Option<u32> = None;
32436        let mut f_formula: Option<STMdxFunctionType> = None;
32437        let mut f_cell_type = None;
32438        let mut f_ms = None;
32439        let mut f_p = None;
32440        let mut f_k = None;
32441        #[cfg(feature = "extra-attrs")]
32442        let mut extra_attrs = std::collections::HashMap::new();
32443        #[cfg(feature = "extra-children")]
32444        let mut extra_children = Vec::new();
32445        #[cfg(feature = "extra-children")]
32446        let mut child_idx: usize = 0;
32447
32448        // Parse attributes
32449        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32450            let val = String::from_utf8_lossy(&attr.value);
32451            match attr.key.local_name().as_ref() {
32452                b"n" => {
32453                    f_n = val.parse().ok();
32454                }
32455                b"f" => {
32456                    f_formula = val.parse().ok();
32457                }
32458                #[cfg(feature = "extra-attrs")]
32459                unknown => {
32460                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32461                    extra_attrs.insert(key, val.into_owned());
32462                }
32463                #[cfg(not(feature = "extra-attrs"))]
32464                _ => {}
32465            }
32466        }
32467
32468        // Parse child elements
32469        if !is_empty {
32470            let mut buf = Vec::new();
32471            loop {
32472                match reader.read_event_into(&mut buf)? {
32473                    Event::Start(e) => {
32474                        match e.local_name().as_ref() {
32475                            b"t" => {
32476                                f_cell_type =
32477                                    Some(Box::new(CTMdxTuple::from_xml(reader, &e, false)?));
32478                                #[cfg(feature = "extra-children")]
32479                                {
32480                                    child_idx += 1;
32481                                }
32482                            }
32483                            b"ms" => {
32484                                f_ms = Some(Box::new(CTMdxSet::from_xml(reader, &e, false)?));
32485                                #[cfg(feature = "extra-children")]
32486                                {
32487                                    child_idx += 1;
32488                                }
32489                            }
32490                            b"p" => {
32491                                f_p =
32492                                    Some(Box::new(CTMdxMemeberProp::from_xml(reader, &e, false)?));
32493                                #[cfg(feature = "extra-children")]
32494                                {
32495                                    child_idx += 1;
32496                                }
32497                            }
32498                            b"k" => {
32499                                f_k = Some(Box::new(CTMdxKPI::from_xml(reader, &e, false)?));
32500                                #[cfg(feature = "extra-children")]
32501                                {
32502                                    child_idx += 1;
32503                                }
32504                            }
32505                            #[cfg(feature = "extra-children")]
32506                            _ => {
32507                                // Capture unknown element for roundtrip
32508                                let elem = RawXmlElement::from_reader(reader, &e)?;
32509                                extra_children.push(PositionedNode::new(
32510                                    child_idx,
32511                                    RawXmlNode::Element(elem),
32512                                ));
32513                                child_idx += 1;
32514                            }
32515                            #[cfg(not(feature = "extra-children"))]
32516                            _ => {
32517                                // Skip unknown element
32518                                skip_element(reader)?;
32519                            }
32520                        }
32521                    }
32522                    Event::Empty(e) => {
32523                        match e.local_name().as_ref() {
32524                            b"t" => {
32525                                f_cell_type =
32526                                    Some(Box::new(CTMdxTuple::from_xml(reader, &e, true)?));
32527                                #[cfg(feature = "extra-children")]
32528                                {
32529                                    child_idx += 1;
32530                                }
32531                            }
32532                            b"ms" => {
32533                                f_ms = Some(Box::new(CTMdxSet::from_xml(reader, &e, true)?));
32534                                #[cfg(feature = "extra-children")]
32535                                {
32536                                    child_idx += 1;
32537                                }
32538                            }
32539                            b"p" => {
32540                                f_p = Some(Box::new(CTMdxMemeberProp::from_xml(reader, &e, true)?));
32541                                #[cfg(feature = "extra-children")]
32542                                {
32543                                    child_idx += 1;
32544                                }
32545                            }
32546                            b"k" => {
32547                                f_k = Some(Box::new(CTMdxKPI::from_xml(reader, &e, true)?));
32548                                #[cfg(feature = "extra-children")]
32549                                {
32550                                    child_idx += 1;
32551                                }
32552                            }
32553                            #[cfg(feature = "extra-children")]
32554                            _ => {
32555                                // Capture unknown empty element for roundtrip
32556                                let elem = RawXmlElement::from_empty(&e);
32557                                extra_children.push(PositionedNode::new(
32558                                    child_idx,
32559                                    RawXmlNode::Element(elem),
32560                                ));
32561                                child_idx += 1;
32562                            }
32563                            #[cfg(not(feature = "extra-children"))]
32564                            _ => {}
32565                        }
32566                    }
32567                    Event::End(_) => break,
32568                    Event::Eof => break,
32569                    _ => {}
32570                }
32571                buf.clear();
32572            }
32573        }
32574
32575        Ok(Self {
32576            n: f_n.ok_or_else(|| ParseError::MissingAttribute("n".to_string()))?,
32577            formula: f_formula.ok_or_else(|| ParseError::MissingAttribute("f".to_string()))?,
32578            cell_type: f_cell_type,
32579            ms: f_ms,
32580            p: f_p,
32581            k: f_k,
32582            #[cfg(feature = "extra-attrs")]
32583            extra_attrs,
32584            #[cfg(feature = "extra-children")]
32585            extra_children,
32586        })
32587    }
32588}
32589
32590impl FromXml for CTMdxTuple {
32591    fn from_xml<R: BufRead>(
32592        reader: &mut Reader<R>,
32593        start_tag: &BytesStart,
32594        is_empty: bool,
32595    ) -> Result<Self, ParseError> {
32596        let mut f_cells = None;
32597        let mut f_ct = None;
32598        let mut f_si = None;
32599        let mut f_fi = None;
32600        let mut f_bc = None;
32601        let mut f_fc = None;
32602        let mut f_i = None;
32603        let mut f_u = None;
32604        let mut f_st = None;
32605        let mut f_b = None;
32606        let mut f_n = Vec::new();
32607        #[cfg(feature = "extra-attrs")]
32608        let mut extra_attrs = std::collections::HashMap::new();
32609        #[cfg(feature = "extra-children")]
32610        let mut extra_children = Vec::new();
32611        #[cfg(feature = "extra-children")]
32612        let mut child_idx: usize = 0;
32613
32614        // Parse attributes
32615        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32616            let val = String::from_utf8_lossy(&attr.value);
32617            match attr.key.local_name().as_ref() {
32618                b"c" => {
32619                    f_cells = val.parse().ok();
32620                }
32621                b"ct" => {
32622                    f_ct = Some(val.into_owned());
32623                }
32624                b"si" => {
32625                    f_si = val.parse().ok();
32626                }
32627                b"fi" => {
32628                    f_fi = val.parse().ok();
32629                }
32630                b"bc" => {
32631                    f_bc = decode_hex(&val);
32632                }
32633                b"fc" => {
32634                    f_fc = decode_hex(&val);
32635                }
32636                b"i" => {
32637                    f_i = Some(val == "true" || val == "1");
32638                }
32639                b"u" => {
32640                    f_u = Some(val == "true" || val == "1");
32641                }
32642                b"st" => {
32643                    f_st = Some(val == "true" || val == "1");
32644                }
32645                b"b" => {
32646                    f_b = Some(val == "true" || val == "1");
32647                }
32648                #[cfg(feature = "extra-attrs")]
32649                unknown => {
32650                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32651                    extra_attrs.insert(key, val.into_owned());
32652                }
32653                #[cfg(not(feature = "extra-attrs"))]
32654                _ => {}
32655            }
32656        }
32657
32658        // Parse child elements
32659        if !is_empty {
32660            let mut buf = Vec::new();
32661            loop {
32662                match reader.read_event_into(&mut buf)? {
32663                    Event::Start(e) => {
32664                        match e.local_name().as_ref() {
32665                            b"n" => {
32666                                f_n.push(CTMetadataStringIndex::from_xml(reader, &e, false)?);
32667                                #[cfg(feature = "extra-children")]
32668                                {
32669                                    child_idx += 1;
32670                                }
32671                            }
32672                            #[cfg(feature = "extra-children")]
32673                            _ => {
32674                                // Capture unknown element for roundtrip
32675                                let elem = RawXmlElement::from_reader(reader, &e)?;
32676                                extra_children.push(PositionedNode::new(
32677                                    child_idx,
32678                                    RawXmlNode::Element(elem),
32679                                ));
32680                                child_idx += 1;
32681                            }
32682                            #[cfg(not(feature = "extra-children"))]
32683                            _ => {
32684                                // Skip unknown element
32685                                skip_element(reader)?;
32686                            }
32687                        }
32688                    }
32689                    Event::Empty(e) => {
32690                        match e.local_name().as_ref() {
32691                            b"n" => {
32692                                f_n.push(CTMetadataStringIndex::from_xml(reader, &e, true)?);
32693                                #[cfg(feature = "extra-children")]
32694                                {
32695                                    child_idx += 1;
32696                                }
32697                            }
32698                            #[cfg(feature = "extra-children")]
32699                            _ => {
32700                                // Capture unknown empty element for roundtrip
32701                                let elem = RawXmlElement::from_empty(&e);
32702                                extra_children.push(PositionedNode::new(
32703                                    child_idx,
32704                                    RawXmlNode::Element(elem),
32705                                ));
32706                                child_idx += 1;
32707                            }
32708                            #[cfg(not(feature = "extra-children"))]
32709                            _ => {}
32710                        }
32711                    }
32712                    Event::End(_) => break,
32713                    Event::Eof => break,
32714                    _ => {}
32715                }
32716                buf.clear();
32717            }
32718        }
32719
32720        Ok(Self {
32721            cells: f_cells,
32722            ct: f_ct,
32723            si: f_si,
32724            fi: f_fi,
32725            bc: f_bc,
32726            fc: f_fc,
32727            i: f_i,
32728            u: f_u,
32729            st: f_st,
32730            b: f_b,
32731            n: f_n,
32732            #[cfg(feature = "extra-attrs")]
32733            extra_attrs,
32734            #[cfg(feature = "extra-children")]
32735            extra_children,
32736        })
32737    }
32738}
32739
32740impl FromXml for CTMdxSet {
32741    fn from_xml<R: BufRead>(
32742        reader: &mut Reader<R>,
32743        start_tag: &BytesStart,
32744        is_empty: bool,
32745    ) -> Result<Self, ParseError> {
32746        let mut f_ns: Option<u32> = None;
32747        let mut f_cells = None;
32748        let mut f_o = None;
32749        let mut f_n = Vec::new();
32750        #[cfg(feature = "extra-attrs")]
32751        let mut extra_attrs = std::collections::HashMap::new();
32752        #[cfg(feature = "extra-children")]
32753        let mut extra_children = Vec::new();
32754        #[cfg(feature = "extra-children")]
32755        let mut child_idx: usize = 0;
32756
32757        // Parse attributes
32758        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32759            let val = String::from_utf8_lossy(&attr.value);
32760            match attr.key.local_name().as_ref() {
32761                b"ns" => {
32762                    f_ns = val.parse().ok();
32763                }
32764                b"c" => {
32765                    f_cells = val.parse().ok();
32766                }
32767                b"o" => {
32768                    f_o = val.parse().ok();
32769                }
32770                #[cfg(feature = "extra-attrs")]
32771                unknown => {
32772                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32773                    extra_attrs.insert(key, val.into_owned());
32774                }
32775                #[cfg(not(feature = "extra-attrs"))]
32776                _ => {}
32777            }
32778        }
32779
32780        // Parse child elements
32781        if !is_empty {
32782            let mut buf = Vec::new();
32783            loop {
32784                match reader.read_event_into(&mut buf)? {
32785                    Event::Start(e) => {
32786                        match e.local_name().as_ref() {
32787                            b"n" => {
32788                                f_n.push(CTMetadataStringIndex::from_xml(reader, &e, false)?);
32789                                #[cfg(feature = "extra-children")]
32790                                {
32791                                    child_idx += 1;
32792                                }
32793                            }
32794                            #[cfg(feature = "extra-children")]
32795                            _ => {
32796                                // Capture unknown element for roundtrip
32797                                let elem = RawXmlElement::from_reader(reader, &e)?;
32798                                extra_children.push(PositionedNode::new(
32799                                    child_idx,
32800                                    RawXmlNode::Element(elem),
32801                                ));
32802                                child_idx += 1;
32803                            }
32804                            #[cfg(not(feature = "extra-children"))]
32805                            _ => {
32806                                // Skip unknown element
32807                                skip_element(reader)?;
32808                            }
32809                        }
32810                    }
32811                    Event::Empty(e) => {
32812                        match e.local_name().as_ref() {
32813                            b"n" => {
32814                                f_n.push(CTMetadataStringIndex::from_xml(reader, &e, true)?);
32815                                #[cfg(feature = "extra-children")]
32816                                {
32817                                    child_idx += 1;
32818                                }
32819                            }
32820                            #[cfg(feature = "extra-children")]
32821                            _ => {
32822                                // Capture unknown empty element for roundtrip
32823                                let elem = RawXmlElement::from_empty(&e);
32824                                extra_children.push(PositionedNode::new(
32825                                    child_idx,
32826                                    RawXmlNode::Element(elem),
32827                                ));
32828                                child_idx += 1;
32829                            }
32830                            #[cfg(not(feature = "extra-children"))]
32831                            _ => {}
32832                        }
32833                    }
32834                    Event::End(_) => break,
32835                    Event::Eof => break,
32836                    _ => {}
32837                }
32838                buf.clear();
32839            }
32840        }
32841
32842        Ok(Self {
32843            ns: f_ns.ok_or_else(|| ParseError::MissingAttribute("ns".to_string()))?,
32844            cells: f_cells,
32845            o: f_o,
32846            n: f_n,
32847            #[cfg(feature = "extra-attrs")]
32848            extra_attrs,
32849            #[cfg(feature = "extra-children")]
32850            extra_children,
32851        })
32852    }
32853}
32854
32855impl FromXml for CTMdxMemeberProp {
32856    fn from_xml<R: BufRead>(
32857        reader: &mut Reader<R>,
32858        start_tag: &BytesStart,
32859        is_empty: bool,
32860    ) -> Result<Self, ParseError> {
32861        let mut f_n: Option<u32> = None;
32862        let mut f_np: Option<u32> = None;
32863        #[cfg(feature = "extra-attrs")]
32864        let mut extra_attrs = std::collections::HashMap::new();
32865
32866        // Parse attributes
32867        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32868            let val = String::from_utf8_lossy(&attr.value);
32869            match attr.key.local_name().as_ref() {
32870                b"n" => {
32871                    f_n = val.parse().ok();
32872                }
32873                b"np" => {
32874                    f_np = val.parse().ok();
32875                }
32876                #[cfg(feature = "extra-attrs")]
32877                unknown => {
32878                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32879                    extra_attrs.insert(key, val.into_owned());
32880                }
32881                #[cfg(not(feature = "extra-attrs"))]
32882                _ => {}
32883            }
32884        }
32885
32886        if !is_empty {
32887            let mut buf = Vec::new();
32888            loop {
32889                match reader.read_event_into(&mut buf)? {
32890                    Event::End(_) => break,
32891                    Event::Eof => break,
32892                    _ => {}
32893                }
32894                buf.clear();
32895            }
32896        }
32897
32898        Ok(Self {
32899            n: f_n.ok_or_else(|| ParseError::MissingAttribute("n".to_string()))?,
32900            np: f_np.ok_or_else(|| ParseError::MissingAttribute("np".to_string()))?,
32901            #[cfg(feature = "extra-attrs")]
32902            extra_attrs,
32903        })
32904    }
32905}
32906
32907impl FromXml for CTMdxKPI {
32908    fn from_xml<R: BufRead>(
32909        reader: &mut Reader<R>,
32910        start_tag: &BytesStart,
32911        is_empty: bool,
32912    ) -> Result<Self, ParseError> {
32913        let mut f_n: Option<u32> = None;
32914        let mut f_np: Option<u32> = None;
32915        let mut f_p: Option<STMdxKPIProperty> = None;
32916        #[cfg(feature = "extra-attrs")]
32917        let mut extra_attrs = std::collections::HashMap::new();
32918
32919        // Parse attributes
32920        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32921            let val = String::from_utf8_lossy(&attr.value);
32922            match attr.key.local_name().as_ref() {
32923                b"n" => {
32924                    f_n = val.parse().ok();
32925                }
32926                b"np" => {
32927                    f_np = val.parse().ok();
32928                }
32929                b"p" => {
32930                    f_p = val.parse().ok();
32931                }
32932                #[cfg(feature = "extra-attrs")]
32933                unknown => {
32934                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32935                    extra_attrs.insert(key, val.into_owned());
32936                }
32937                #[cfg(not(feature = "extra-attrs"))]
32938                _ => {}
32939            }
32940        }
32941
32942        if !is_empty {
32943            let mut buf = Vec::new();
32944            loop {
32945                match reader.read_event_into(&mut buf)? {
32946                    Event::End(_) => break,
32947                    Event::Eof => break,
32948                    _ => {}
32949                }
32950                buf.clear();
32951            }
32952        }
32953
32954        Ok(Self {
32955            n: f_n.ok_or_else(|| ParseError::MissingAttribute("n".to_string()))?,
32956            np: f_np.ok_or_else(|| ParseError::MissingAttribute("np".to_string()))?,
32957            p: f_p.ok_or_else(|| ParseError::MissingAttribute("p".to_string()))?,
32958            #[cfg(feature = "extra-attrs")]
32959            extra_attrs,
32960        })
32961    }
32962}
32963
32964impl FromXml for CTMetadataStringIndex {
32965    fn from_xml<R: BufRead>(
32966        reader: &mut Reader<R>,
32967        start_tag: &BytesStart,
32968        is_empty: bool,
32969    ) -> Result<Self, ParseError> {
32970        let mut f_x: Option<u32> = None;
32971        let mut f_style_index = None;
32972        #[cfg(feature = "extra-attrs")]
32973        let mut extra_attrs = std::collections::HashMap::new();
32974
32975        // Parse attributes
32976        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
32977            let val = String::from_utf8_lossy(&attr.value);
32978            match attr.key.local_name().as_ref() {
32979                b"x" => {
32980                    f_x = val.parse().ok();
32981                }
32982                b"s" => {
32983                    f_style_index = Some(val == "true" || val == "1");
32984                }
32985                #[cfg(feature = "extra-attrs")]
32986                unknown => {
32987                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
32988                    extra_attrs.insert(key, val.into_owned());
32989                }
32990                #[cfg(not(feature = "extra-attrs"))]
32991                _ => {}
32992            }
32993        }
32994
32995        if !is_empty {
32996            let mut buf = Vec::new();
32997            loop {
32998                match reader.read_event_into(&mut buf)? {
32999                    Event::End(_) => break,
33000                    Event::Eof => break,
33001                    _ => {}
33002                }
33003                buf.clear();
33004            }
33005        }
33006
33007        Ok(Self {
33008            x: f_x.ok_or_else(|| ParseError::MissingAttribute("x".to_string()))?,
33009            style_index: f_style_index,
33010            #[cfg(feature = "extra-attrs")]
33011            extra_attrs,
33012        })
33013    }
33014}
33015
33016impl FromXml for MetadataStrings {
33017    fn from_xml<R: BufRead>(
33018        reader: &mut Reader<R>,
33019        start_tag: &BytesStart,
33020        is_empty: bool,
33021    ) -> Result<Self, ParseError> {
33022        let mut f_count = None;
33023        let mut f_style_index = Vec::new();
33024        #[cfg(feature = "extra-attrs")]
33025        let mut extra_attrs = std::collections::HashMap::new();
33026        #[cfg(feature = "extra-children")]
33027        let mut extra_children = Vec::new();
33028        #[cfg(feature = "extra-children")]
33029        let mut child_idx: usize = 0;
33030
33031        // Parse attributes
33032        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
33033            let val = String::from_utf8_lossy(&attr.value);
33034            match attr.key.local_name().as_ref() {
33035                b"count" => {
33036                    f_count = val.parse().ok();
33037                }
33038                #[cfg(feature = "extra-attrs")]
33039                unknown => {
33040                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
33041                    extra_attrs.insert(key, val.into_owned());
33042                }
33043                #[cfg(not(feature = "extra-attrs"))]
33044                _ => {}
33045            }
33046        }
33047
33048        // Parse child elements
33049        if !is_empty {
33050            let mut buf = Vec::new();
33051            loop {
33052                match reader.read_event_into(&mut buf)? {
33053                    Event::Start(e) => {
33054                        match e.local_name().as_ref() {
33055                            b"s" => {
33056                                f_style_index.push(CTXStringElement::from_xml(reader, &e, false)?);
33057                                #[cfg(feature = "extra-children")]
33058                                {
33059                                    child_idx += 1;
33060                                }
33061                            }
33062                            #[cfg(feature = "extra-children")]
33063                            _ => {
33064                                // Capture unknown element for roundtrip
33065                                let elem = RawXmlElement::from_reader(reader, &e)?;
33066                                extra_children.push(PositionedNode::new(
33067                                    child_idx,
33068                                    RawXmlNode::Element(elem),
33069                                ));
33070                                child_idx += 1;
33071                            }
33072                            #[cfg(not(feature = "extra-children"))]
33073                            _ => {
33074                                // Skip unknown element
33075                                skip_element(reader)?;
33076                            }
33077                        }
33078                    }
33079                    Event::Empty(e) => {
33080                        match e.local_name().as_ref() {
33081                            b"s" => {
33082                                f_style_index.push(CTXStringElement::from_xml(reader, &e, true)?);
33083                                #[cfg(feature = "extra-children")]
33084                                {
33085                                    child_idx += 1;
33086                                }
33087                            }
33088                            #[cfg(feature = "extra-children")]
33089                            _ => {
33090                                // Capture unknown empty element for roundtrip
33091                                let elem = RawXmlElement::from_empty(&e);
33092                                extra_children.push(PositionedNode::new(
33093                                    child_idx,
33094                                    RawXmlNode::Element(elem),
33095                                ));
33096                                child_idx += 1;
33097                            }
33098                            #[cfg(not(feature = "extra-children"))]
33099                            _ => {}
33100                        }
33101                    }
33102                    Event::End(_) => break,
33103                    Event::Eof => break,
33104                    _ => {}
33105                }
33106                buf.clear();
33107            }
33108        }
33109
33110        Ok(Self {
33111            count: f_count,
33112            style_index: f_style_index,
33113            #[cfg(feature = "extra-attrs")]
33114            extra_attrs,
33115            #[cfg(feature = "extra-children")]
33116            extra_children,
33117        })
33118    }
33119}
33120
33121impl FromXml for SingleXmlCells {
33122    fn from_xml<R: BufRead>(
33123        reader: &mut Reader<R>,
33124        start_tag: &BytesStart,
33125        is_empty: bool,
33126    ) -> Result<Self, ParseError> {
33127        let mut f_single_xml_cell = Vec::new();
33128        #[cfg(feature = "extra-children")]
33129        let mut extra_children = Vec::new();
33130        #[cfg(feature = "extra-children")]
33131        let mut child_idx: usize = 0;
33132
33133        // Parse child elements
33134        if !is_empty {
33135            let mut buf = Vec::new();
33136            loop {
33137                match reader.read_event_into(&mut buf)? {
33138                    Event::Start(e) => {
33139                        match e.local_name().as_ref() {
33140                            b"singleXmlCell" => {
33141                                f_single_xml_cell.push(SingleXmlCell::from_xml(reader, &e, false)?);
33142                                #[cfg(feature = "extra-children")]
33143                                {
33144                                    child_idx += 1;
33145                                }
33146                            }
33147                            #[cfg(feature = "extra-children")]
33148                            _ => {
33149                                // Capture unknown element for roundtrip
33150                                let elem = RawXmlElement::from_reader(reader, &e)?;
33151                                extra_children.push(PositionedNode::new(
33152                                    child_idx,
33153                                    RawXmlNode::Element(elem),
33154                                ));
33155                                child_idx += 1;
33156                            }
33157                            #[cfg(not(feature = "extra-children"))]
33158                            _ => {
33159                                // Skip unknown element
33160                                skip_element(reader)?;
33161                            }
33162                        }
33163                    }
33164                    Event::Empty(e) => {
33165                        match e.local_name().as_ref() {
33166                            b"singleXmlCell" => {
33167                                f_single_xml_cell.push(SingleXmlCell::from_xml(reader, &e, true)?);
33168                                #[cfg(feature = "extra-children")]
33169                                {
33170                                    child_idx += 1;
33171                                }
33172                            }
33173                            #[cfg(feature = "extra-children")]
33174                            _ => {
33175                                // Capture unknown empty element for roundtrip
33176                                let elem = RawXmlElement::from_empty(&e);
33177                                extra_children.push(PositionedNode::new(
33178                                    child_idx,
33179                                    RawXmlNode::Element(elem),
33180                                ));
33181                                child_idx += 1;
33182                            }
33183                            #[cfg(not(feature = "extra-children"))]
33184                            _ => {}
33185                        }
33186                    }
33187                    Event::End(_) => break,
33188                    Event::Eof => break,
33189                    _ => {}
33190                }
33191                buf.clear();
33192            }
33193        }
33194
33195        Ok(Self {
33196            single_xml_cell: f_single_xml_cell,
33197            #[cfg(feature = "extra-children")]
33198            extra_children,
33199        })
33200    }
33201}
33202
33203impl FromXml for SingleXmlCell {
33204    fn from_xml<R: BufRead>(
33205        reader: &mut Reader<R>,
33206        start_tag: &BytesStart,
33207        is_empty: bool,
33208    ) -> Result<Self, ParseError> {
33209        let mut f_id: Option<u32> = None;
33210        let mut f_reference: Option<CellRef> = None;
33211        let mut f_connection_id: Option<u32> = None;
33212        let mut f_xml_cell_pr: Option<Box<XmlCellProperties>> = None;
33213        let mut f_extension_list = None;
33214        #[cfg(feature = "extra-attrs")]
33215        let mut extra_attrs = std::collections::HashMap::new();
33216        #[cfg(feature = "extra-children")]
33217        let mut extra_children = Vec::new();
33218        #[cfg(feature = "extra-children")]
33219        let mut child_idx: usize = 0;
33220
33221        // Parse attributes
33222        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
33223            let val = String::from_utf8_lossy(&attr.value);
33224            match attr.key.local_name().as_ref() {
33225                b"id" => {
33226                    f_id = val.parse().ok();
33227                }
33228                b"r" => {
33229                    f_reference = Some(val.into_owned());
33230                }
33231                b"connectionId" => {
33232                    f_connection_id = val.parse().ok();
33233                }
33234                #[cfg(feature = "extra-attrs")]
33235                unknown => {
33236                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
33237                    extra_attrs.insert(key, val.into_owned());
33238                }
33239                #[cfg(not(feature = "extra-attrs"))]
33240                _ => {}
33241            }
33242        }
33243
33244        // Parse child elements
33245        if !is_empty {
33246            let mut buf = Vec::new();
33247            loop {
33248                match reader.read_event_into(&mut buf)? {
33249                    Event::Start(e) => {
33250                        match e.local_name().as_ref() {
33251                            b"xmlCellPr" => {
33252                                f_xml_cell_pr =
33253                                    Some(Box::new(XmlCellProperties::from_xml(reader, &e, false)?));
33254                                #[cfg(feature = "extra-children")]
33255                                {
33256                                    child_idx += 1;
33257                                }
33258                            }
33259                            b"extLst" => {
33260                                f_extension_list =
33261                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
33262                                #[cfg(feature = "extra-children")]
33263                                {
33264                                    child_idx += 1;
33265                                }
33266                            }
33267                            #[cfg(feature = "extra-children")]
33268                            _ => {
33269                                // Capture unknown element for roundtrip
33270                                let elem = RawXmlElement::from_reader(reader, &e)?;
33271                                extra_children.push(PositionedNode::new(
33272                                    child_idx,
33273                                    RawXmlNode::Element(elem),
33274                                ));
33275                                child_idx += 1;
33276                            }
33277                            #[cfg(not(feature = "extra-children"))]
33278                            _ => {
33279                                // Skip unknown element
33280                                skip_element(reader)?;
33281                            }
33282                        }
33283                    }
33284                    Event::Empty(e) => {
33285                        match e.local_name().as_ref() {
33286                            b"xmlCellPr" => {
33287                                f_xml_cell_pr =
33288                                    Some(Box::new(XmlCellProperties::from_xml(reader, &e, true)?));
33289                                #[cfg(feature = "extra-children")]
33290                                {
33291                                    child_idx += 1;
33292                                }
33293                            }
33294                            b"extLst" => {
33295                                f_extension_list =
33296                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
33297                                #[cfg(feature = "extra-children")]
33298                                {
33299                                    child_idx += 1;
33300                                }
33301                            }
33302                            #[cfg(feature = "extra-children")]
33303                            _ => {
33304                                // Capture unknown empty element for roundtrip
33305                                let elem = RawXmlElement::from_empty(&e);
33306                                extra_children.push(PositionedNode::new(
33307                                    child_idx,
33308                                    RawXmlNode::Element(elem),
33309                                ));
33310                                child_idx += 1;
33311                            }
33312                            #[cfg(not(feature = "extra-children"))]
33313                            _ => {}
33314                        }
33315                    }
33316                    Event::End(_) => break,
33317                    Event::Eof => break,
33318                    _ => {}
33319                }
33320                buf.clear();
33321            }
33322        }
33323
33324        Ok(Self {
33325            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
33326            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
33327            connection_id: f_connection_id
33328                .ok_or_else(|| ParseError::MissingAttribute("connectionId".to_string()))?,
33329            xml_cell_pr: f_xml_cell_pr
33330                .ok_or_else(|| ParseError::MissingAttribute("xmlCellPr".to_string()))?,
33331            extension_list: f_extension_list,
33332            #[cfg(feature = "extra-attrs")]
33333            extra_attrs,
33334            #[cfg(feature = "extra-children")]
33335            extra_children,
33336        })
33337    }
33338}
33339
33340impl FromXml for XmlCellProperties {
33341    fn from_xml<R: BufRead>(
33342        reader: &mut Reader<R>,
33343        start_tag: &BytesStart,
33344        is_empty: bool,
33345    ) -> Result<Self, ParseError> {
33346        let mut f_id: Option<u32> = None;
33347        let mut f_unique_name = None;
33348        let mut f_xml_pr: Option<Box<XmlProperties>> = None;
33349        let mut f_extension_list = None;
33350        #[cfg(feature = "extra-attrs")]
33351        let mut extra_attrs = std::collections::HashMap::new();
33352        #[cfg(feature = "extra-children")]
33353        let mut extra_children = Vec::new();
33354        #[cfg(feature = "extra-children")]
33355        let mut child_idx: usize = 0;
33356
33357        // Parse attributes
33358        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
33359            let val = String::from_utf8_lossy(&attr.value);
33360            match attr.key.local_name().as_ref() {
33361                b"id" => {
33362                    f_id = val.parse().ok();
33363                }
33364                b"uniqueName" => {
33365                    f_unique_name = Some(val.into_owned());
33366                }
33367                #[cfg(feature = "extra-attrs")]
33368                unknown => {
33369                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
33370                    extra_attrs.insert(key, val.into_owned());
33371                }
33372                #[cfg(not(feature = "extra-attrs"))]
33373                _ => {}
33374            }
33375        }
33376
33377        // Parse child elements
33378        if !is_empty {
33379            let mut buf = Vec::new();
33380            loop {
33381                match reader.read_event_into(&mut buf)? {
33382                    Event::Start(e) => {
33383                        match e.local_name().as_ref() {
33384                            b"xmlPr" => {
33385                                f_xml_pr =
33386                                    Some(Box::new(XmlProperties::from_xml(reader, &e, false)?));
33387                                #[cfg(feature = "extra-children")]
33388                                {
33389                                    child_idx += 1;
33390                                }
33391                            }
33392                            b"extLst" => {
33393                                f_extension_list =
33394                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
33395                                #[cfg(feature = "extra-children")]
33396                                {
33397                                    child_idx += 1;
33398                                }
33399                            }
33400                            #[cfg(feature = "extra-children")]
33401                            _ => {
33402                                // Capture unknown element for roundtrip
33403                                let elem = RawXmlElement::from_reader(reader, &e)?;
33404                                extra_children.push(PositionedNode::new(
33405                                    child_idx,
33406                                    RawXmlNode::Element(elem),
33407                                ));
33408                                child_idx += 1;
33409                            }
33410                            #[cfg(not(feature = "extra-children"))]
33411                            _ => {
33412                                // Skip unknown element
33413                                skip_element(reader)?;
33414                            }
33415                        }
33416                    }
33417                    Event::Empty(e) => {
33418                        match e.local_name().as_ref() {
33419                            b"xmlPr" => {
33420                                f_xml_pr =
33421                                    Some(Box::new(XmlProperties::from_xml(reader, &e, true)?));
33422                                #[cfg(feature = "extra-children")]
33423                                {
33424                                    child_idx += 1;
33425                                }
33426                            }
33427                            b"extLst" => {
33428                                f_extension_list =
33429                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
33430                                #[cfg(feature = "extra-children")]
33431                                {
33432                                    child_idx += 1;
33433                                }
33434                            }
33435                            #[cfg(feature = "extra-children")]
33436                            _ => {
33437                                // Capture unknown empty element for roundtrip
33438                                let elem = RawXmlElement::from_empty(&e);
33439                                extra_children.push(PositionedNode::new(
33440                                    child_idx,
33441                                    RawXmlNode::Element(elem),
33442                                ));
33443                                child_idx += 1;
33444                            }
33445                            #[cfg(not(feature = "extra-children"))]
33446                            _ => {}
33447                        }
33448                    }
33449                    Event::End(_) => break,
33450                    Event::Eof => break,
33451                    _ => {}
33452                }
33453                buf.clear();
33454            }
33455        }
33456
33457        Ok(Self {
33458            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
33459            unique_name: f_unique_name,
33460            xml_pr: f_xml_pr.ok_or_else(|| ParseError::MissingAttribute("xmlPr".to_string()))?,
33461            extension_list: f_extension_list,
33462            #[cfg(feature = "extra-attrs")]
33463            extra_attrs,
33464            #[cfg(feature = "extra-children")]
33465            extra_children,
33466        })
33467    }
33468}
33469
33470impl FromXml for XmlProperties {
33471    fn from_xml<R: BufRead>(
33472        reader: &mut Reader<R>,
33473        start_tag: &BytesStart,
33474        is_empty: bool,
33475    ) -> Result<Self, ParseError> {
33476        let mut f_map_id: Option<u32> = None;
33477        let mut f_xpath: Option<XmlString> = None;
33478        let mut f_xml_data_type: Option<STXmlDataType> = None;
33479        let mut f_extension_list = None;
33480        #[cfg(feature = "extra-attrs")]
33481        let mut extra_attrs = std::collections::HashMap::new();
33482        #[cfg(feature = "extra-children")]
33483        let mut extra_children = Vec::new();
33484        #[cfg(feature = "extra-children")]
33485        let mut child_idx: usize = 0;
33486
33487        // Parse attributes
33488        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
33489            let val = String::from_utf8_lossy(&attr.value);
33490            match attr.key.local_name().as_ref() {
33491                b"mapId" => {
33492                    f_map_id = val.parse().ok();
33493                }
33494                b"xpath" => {
33495                    f_xpath = Some(val.into_owned());
33496                }
33497                b"xmlDataType" => {
33498                    f_xml_data_type = Some(val.into_owned());
33499                }
33500                #[cfg(feature = "extra-attrs")]
33501                unknown => {
33502                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
33503                    extra_attrs.insert(key, val.into_owned());
33504                }
33505                #[cfg(not(feature = "extra-attrs"))]
33506                _ => {}
33507            }
33508        }
33509
33510        // Parse child elements
33511        if !is_empty {
33512            let mut buf = Vec::new();
33513            loop {
33514                match reader.read_event_into(&mut buf)? {
33515                    Event::Start(e) => {
33516                        match e.local_name().as_ref() {
33517                            b"extLst" => {
33518                                f_extension_list =
33519                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
33520                                #[cfg(feature = "extra-children")]
33521                                {
33522                                    child_idx += 1;
33523                                }
33524                            }
33525                            #[cfg(feature = "extra-children")]
33526                            _ => {
33527                                // Capture unknown element for roundtrip
33528                                let elem = RawXmlElement::from_reader(reader, &e)?;
33529                                extra_children.push(PositionedNode::new(
33530                                    child_idx,
33531                                    RawXmlNode::Element(elem),
33532                                ));
33533                                child_idx += 1;
33534                            }
33535                            #[cfg(not(feature = "extra-children"))]
33536                            _ => {
33537                                // Skip unknown element
33538                                skip_element(reader)?;
33539                            }
33540                        }
33541                    }
33542                    Event::Empty(e) => {
33543                        match e.local_name().as_ref() {
33544                            b"extLst" => {
33545                                f_extension_list =
33546                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
33547                                #[cfg(feature = "extra-children")]
33548                                {
33549                                    child_idx += 1;
33550                                }
33551                            }
33552                            #[cfg(feature = "extra-children")]
33553                            _ => {
33554                                // Capture unknown empty element for roundtrip
33555                                let elem = RawXmlElement::from_empty(&e);
33556                                extra_children.push(PositionedNode::new(
33557                                    child_idx,
33558                                    RawXmlNode::Element(elem),
33559                                ));
33560                                child_idx += 1;
33561                            }
33562                            #[cfg(not(feature = "extra-children"))]
33563                            _ => {}
33564                        }
33565                    }
33566                    Event::End(_) => break,
33567                    Event::Eof => break,
33568                    _ => {}
33569                }
33570                buf.clear();
33571            }
33572        }
33573
33574        Ok(Self {
33575            map_id: f_map_id.ok_or_else(|| ParseError::MissingAttribute("mapId".to_string()))?,
33576            xpath: f_xpath.ok_or_else(|| ParseError::MissingAttribute("xpath".to_string()))?,
33577            xml_data_type: f_xml_data_type
33578                .ok_or_else(|| ParseError::MissingAttribute("xmlDataType".to_string()))?,
33579            extension_list: f_extension_list,
33580            #[cfg(feature = "extra-attrs")]
33581            extra_attrs,
33582            #[cfg(feature = "extra-children")]
33583            extra_children,
33584        })
33585    }
33586}
33587
33588impl FromXml for Stylesheet {
33589    fn from_xml<R: BufRead>(
33590        reader: &mut Reader<R>,
33591        start_tag: &BytesStart,
33592        is_empty: bool,
33593    ) -> Result<Self, ParseError> {
33594        #[cfg(feature = "sml-styling")]
33595        let mut f_num_fmts = None;
33596        #[cfg(feature = "sml-styling")]
33597        let mut f_fonts = None;
33598        #[cfg(feature = "sml-styling")]
33599        let mut f_fills = None;
33600        #[cfg(feature = "sml-styling")]
33601        let mut f_borders = None;
33602        #[cfg(feature = "sml-styling")]
33603        let mut f_cell_style_xfs = None;
33604        #[cfg(feature = "sml-styling")]
33605        let mut f_cell_xfs = None;
33606        #[cfg(feature = "sml-styling")]
33607        let mut f_cell_styles = None;
33608        #[cfg(feature = "sml-styling")]
33609        let mut f_dxfs = None;
33610        #[cfg(feature = "sml-styling")]
33611        let mut f_table_styles = None;
33612        #[cfg(feature = "sml-styling")]
33613        let mut f_colors = None;
33614        #[cfg(feature = "sml-extensions")]
33615        let mut f_extension_list = None;
33616        #[cfg(feature = "extra-children")]
33617        let mut extra_children = Vec::new();
33618        #[cfg(feature = "extra-children")]
33619        let mut child_idx: usize = 0;
33620
33621        // Parse child elements
33622        if !is_empty {
33623            let mut buf = Vec::new();
33624            loop {
33625                match reader.read_event_into(&mut buf)? {
33626                    Event::Start(e) => {
33627                        match e.local_name().as_ref() {
33628                            #[cfg(feature = "sml-styling")]
33629                            b"numFmts" => {
33630                                f_num_fmts =
33631                                    Some(Box::new(NumberFormats::from_xml(reader, &e, false)?));
33632                                #[cfg(feature = "extra-children")]
33633                                {
33634                                    child_idx += 1;
33635                                }
33636                            }
33637                            #[cfg(feature = "sml-styling")]
33638                            b"fonts" => {
33639                                f_fonts = Some(Box::new(Fonts::from_xml(reader, &e, false)?));
33640                                #[cfg(feature = "extra-children")]
33641                                {
33642                                    child_idx += 1;
33643                                }
33644                            }
33645                            #[cfg(feature = "sml-styling")]
33646                            b"fills" => {
33647                                f_fills = Some(Box::new(Fills::from_xml(reader, &e, false)?));
33648                                #[cfg(feature = "extra-children")]
33649                                {
33650                                    child_idx += 1;
33651                                }
33652                            }
33653                            #[cfg(feature = "sml-styling")]
33654                            b"borders" => {
33655                                f_borders = Some(Box::new(Borders::from_xml(reader, &e, false)?));
33656                                #[cfg(feature = "extra-children")]
33657                                {
33658                                    child_idx += 1;
33659                                }
33660                            }
33661                            #[cfg(feature = "sml-styling")]
33662                            b"cellStyleXfs" => {
33663                                f_cell_style_xfs =
33664                                    Some(Box::new(CellStyleFormats::from_xml(reader, &e, false)?));
33665                                #[cfg(feature = "extra-children")]
33666                                {
33667                                    child_idx += 1;
33668                                }
33669                            }
33670                            #[cfg(feature = "sml-styling")]
33671                            b"cellXfs" => {
33672                                f_cell_xfs =
33673                                    Some(Box::new(CellFormats::from_xml(reader, &e, false)?));
33674                                #[cfg(feature = "extra-children")]
33675                                {
33676                                    child_idx += 1;
33677                                }
33678                            }
33679                            #[cfg(feature = "sml-styling")]
33680                            b"cellStyles" => {
33681                                f_cell_styles =
33682                                    Some(Box::new(CellStyles::from_xml(reader, &e, false)?));
33683                                #[cfg(feature = "extra-children")]
33684                                {
33685                                    child_idx += 1;
33686                                }
33687                            }
33688                            #[cfg(feature = "sml-styling")]
33689                            b"dxfs" => {
33690                                f_dxfs = Some(Box::new(DifferentialFormats::from_xml(
33691                                    reader, &e, false,
33692                                )?));
33693                                #[cfg(feature = "extra-children")]
33694                                {
33695                                    child_idx += 1;
33696                                }
33697                            }
33698                            #[cfg(feature = "sml-styling")]
33699                            b"tableStyles" => {
33700                                f_table_styles =
33701                                    Some(Box::new(TableStyles::from_xml(reader, &e, false)?));
33702                                #[cfg(feature = "extra-children")]
33703                                {
33704                                    child_idx += 1;
33705                                }
33706                            }
33707                            #[cfg(feature = "sml-styling")]
33708                            b"colors" => {
33709                                f_colors = Some(Box::new(Colors::from_xml(reader, &e, false)?));
33710                                #[cfg(feature = "extra-children")]
33711                                {
33712                                    child_idx += 1;
33713                                }
33714                            }
33715                            #[cfg(feature = "sml-extensions")]
33716                            b"extLst" => {
33717                                f_extension_list =
33718                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
33719                                #[cfg(feature = "extra-children")]
33720                                {
33721                                    child_idx += 1;
33722                                }
33723                            }
33724                            #[cfg(feature = "extra-children")]
33725                            _ => {
33726                                // Capture unknown element for roundtrip
33727                                let elem = RawXmlElement::from_reader(reader, &e)?;
33728                                extra_children.push(PositionedNode::new(
33729                                    child_idx,
33730                                    RawXmlNode::Element(elem),
33731                                ));
33732                                child_idx += 1;
33733                            }
33734                            #[cfg(not(feature = "extra-children"))]
33735                            _ => {
33736                                // Skip unknown element
33737                                skip_element(reader)?;
33738                            }
33739                        }
33740                    }
33741                    Event::Empty(e) => {
33742                        match e.local_name().as_ref() {
33743                            #[cfg(feature = "sml-styling")]
33744                            b"numFmts" => {
33745                                f_num_fmts =
33746                                    Some(Box::new(NumberFormats::from_xml(reader, &e, true)?));
33747                                #[cfg(feature = "extra-children")]
33748                                {
33749                                    child_idx += 1;
33750                                }
33751                            }
33752                            #[cfg(feature = "sml-styling")]
33753                            b"fonts" => {
33754                                f_fonts = Some(Box::new(Fonts::from_xml(reader, &e, true)?));
33755                                #[cfg(feature = "extra-children")]
33756                                {
33757                                    child_idx += 1;
33758                                }
33759                            }
33760                            #[cfg(feature = "sml-styling")]
33761                            b"fills" => {
33762                                f_fills = Some(Box::new(Fills::from_xml(reader, &e, true)?));
33763                                #[cfg(feature = "extra-children")]
33764                                {
33765                                    child_idx += 1;
33766                                }
33767                            }
33768                            #[cfg(feature = "sml-styling")]
33769                            b"borders" => {
33770                                f_borders = Some(Box::new(Borders::from_xml(reader, &e, true)?));
33771                                #[cfg(feature = "extra-children")]
33772                                {
33773                                    child_idx += 1;
33774                                }
33775                            }
33776                            #[cfg(feature = "sml-styling")]
33777                            b"cellStyleXfs" => {
33778                                f_cell_style_xfs =
33779                                    Some(Box::new(CellStyleFormats::from_xml(reader, &e, true)?));
33780                                #[cfg(feature = "extra-children")]
33781                                {
33782                                    child_idx += 1;
33783                                }
33784                            }
33785                            #[cfg(feature = "sml-styling")]
33786                            b"cellXfs" => {
33787                                f_cell_xfs =
33788                                    Some(Box::new(CellFormats::from_xml(reader, &e, true)?));
33789                                #[cfg(feature = "extra-children")]
33790                                {
33791                                    child_idx += 1;
33792                                }
33793                            }
33794                            #[cfg(feature = "sml-styling")]
33795                            b"cellStyles" => {
33796                                f_cell_styles =
33797                                    Some(Box::new(CellStyles::from_xml(reader, &e, true)?));
33798                                #[cfg(feature = "extra-children")]
33799                                {
33800                                    child_idx += 1;
33801                                }
33802                            }
33803                            #[cfg(feature = "sml-styling")]
33804                            b"dxfs" => {
33805                                f_dxfs = Some(Box::new(DifferentialFormats::from_xml(
33806                                    reader, &e, true,
33807                                )?));
33808                                #[cfg(feature = "extra-children")]
33809                                {
33810                                    child_idx += 1;
33811                                }
33812                            }
33813                            #[cfg(feature = "sml-styling")]
33814                            b"tableStyles" => {
33815                                f_table_styles =
33816                                    Some(Box::new(TableStyles::from_xml(reader, &e, true)?));
33817                                #[cfg(feature = "extra-children")]
33818                                {
33819                                    child_idx += 1;
33820                                }
33821                            }
33822                            #[cfg(feature = "sml-styling")]
33823                            b"colors" => {
33824                                f_colors = Some(Box::new(Colors::from_xml(reader, &e, true)?));
33825                                #[cfg(feature = "extra-children")]
33826                                {
33827                                    child_idx += 1;
33828                                }
33829                            }
33830                            #[cfg(feature = "sml-extensions")]
33831                            b"extLst" => {
33832                                f_extension_list =
33833                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
33834                                #[cfg(feature = "extra-children")]
33835                                {
33836                                    child_idx += 1;
33837                                }
33838                            }
33839                            #[cfg(feature = "extra-children")]
33840                            _ => {
33841                                // Capture unknown empty element for roundtrip
33842                                let elem = RawXmlElement::from_empty(&e);
33843                                extra_children.push(PositionedNode::new(
33844                                    child_idx,
33845                                    RawXmlNode::Element(elem),
33846                                ));
33847                                child_idx += 1;
33848                            }
33849                            #[cfg(not(feature = "extra-children"))]
33850                            _ => {}
33851                        }
33852                    }
33853                    Event::End(_) => break,
33854                    Event::Eof => break,
33855                    _ => {}
33856                }
33857                buf.clear();
33858            }
33859        }
33860
33861        Ok(Self {
33862            #[cfg(feature = "sml-styling")]
33863            num_fmts: f_num_fmts,
33864            #[cfg(feature = "sml-styling")]
33865            fonts: f_fonts,
33866            #[cfg(feature = "sml-styling")]
33867            fills: f_fills,
33868            #[cfg(feature = "sml-styling")]
33869            borders: f_borders,
33870            #[cfg(feature = "sml-styling")]
33871            cell_style_xfs: f_cell_style_xfs,
33872            #[cfg(feature = "sml-styling")]
33873            cell_xfs: f_cell_xfs,
33874            #[cfg(feature = "sml-styling")]
33875            cell_styles: f_cell_styles,
33876            #[cfg(feature = "sml-styling")]
33877            dxfs: f_dxfs,
33878            #[cfg(feature = "sml-styling")]
33879            table_styles: f_table_styles,
33880            #[cfg(feature = "sml-styling")]
33881            colors: f_colors,
33882            #[cfg(feature = "sml-extensions")]
33883            extension_list: f_extension_list,
33884            #[cfg(feature = "extra-children")]
33885            extra_children,
33886        })
33887    }
33888}
33889
33890impl FromXml for CellAlignment {
33891    fn from_xml<R: BufRead>(
33892        reader: &mut Reader<R>,
33893        start_tag: &BytesStart,
33894        is_empty: bool,
33895    ) -> Result<Self, ParseError> {
33896        #[cfg(feature = "sml-styling")]
33897        let mut f_horizontal = None;
33898        #[cfg(feature = "sml-styling")]
33899        let mut f_vertical = None;
33900        #[cfg(feature = "sml-styling")]
33901        let mut f_text_rotation = None;
33902        #[cfg(feature = "sml-styling")]
33903        let mut f_wrap_text = None;
33904        #[cfg(feature = "sml-styling")]
33905        let mut f_indent = None;
33906        #[cfg(feature = "sml-styling")]
33907        let mut f_relative_indent = None;
33908        #[cfg(feature = "sml-styling")]
33909        let mut f_justify_last_line = None;
33910        #[cfg(feature = "sml-styling")]
33911        let mut f_shrink_to_fit = None;
33912        #[cfg(feature = "sml-styling")]
33913        let mut f_reading_order = None;
33914        #[cfg(feature = "extra-attrs")]
33915        let mut extra_attrs = std::collections::HashMap::new();
33916
33917        // Parse attributes
33918        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
33919            let val = String::from_utf8_lossy(&attr.value);
33920            match attr.key.local_name().as_ref() {
33921                #[cfg(feature = "sml-styling")]
33922                b"horizontal" => {
33923                    f_horizontal = val.parse().ok();
33924                }
33925                #[cfg(feature = "sml-styling")]
33926                b"vertical" => {
33927                    f_vertical = val.parse().ok();
33928                }
33929                #[cfg(feature = "sml-styling")]
33930                b"textRotation" => {
33931                    f_text_rotation = Some(val.into_owned());
33932                }
33933                #[cfg(feature = "sml-styling")]
33934                b"wrapText" => {
33935                    f_wrap_text = Some(val == "true" || val == "1");
33936                }
33937                #[cfg(feature = "sml-styling")]
33938                b"indent" => {
33939                    f_indent = val.parse().ok();
33940                }
33941                #[cfg(feature = "sml-styling")]
33942                b"relativeIndent" => {
33943                    f_relative_indent = val.parse().ok();
33944                }
33945                #[cfg(feature = "sml-styling")]
33946                b"justifyLastLine" => {
33947                    f_justify_last_line = Some(val == "true" || val == "1");
33948                }
33949                #[cfg(feature = "sml-styling")]
33950                b"shrinkToFit" => {
33951                    f_shrink_to_fit = Some(val == "true" || val == "1");
33952                }
33953                #[cfg(feature = "sml-styling")]
33954                b"readingOrder" => {
33955                    f_reading_order = val.parse().ok();
33956                }
33957                #[cfg(feature = "extra-attrs")]
33958                unknown => {
33959                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
33960                    extra_attrs.insert(key, val.into_owned());
33961                }
33962                #[cfg(not(feature = "extra-attrs"))]
33963                _ => {}
33964            }
33965        }
33966
33967        if !is_empty {
33968            let mut buf = Vec::new();
33969            loop {
33970                match reader.read_event_into(&mut buf)? {
33971                    Event::End(_) => break,
33972                    Event::Eof => break,
33973                    _ => {}
33974                }
33975                buf.clear();
33976            }
33977        }
33978
33979        Ok(Self {
33980            #[cfg(feature = "sml-styling")]
33981            horizontal: f_horizontal,
33982            #[cfg(feature = "sml-styling")]
33983            vertical: f_vertical,
33984            #[cfg(feature = "sml-styling")]
33985            text_rotation: f_text_rotation,
33986            #[cfg(feature = "sml-styling")]
33987            wrap_text: f_wrap_text,
33988            #[cfg(feature = "sml-styling")]
33989            indent: f_indent,
33990            #[cfg(feature = "sml-styling")]
33991            relative_indent: f_relative_indent,
33992            #[cfg(feature = "sml-styling")]
33993            justify_last_line: f_justify_last_line,
33994            #[cfg(feature = "sml-styling")]
33995            shrink_to_fit: f_shrink_to_fit,
33996            #[cfg(feature = "sml-styling")]
33997            reading_order: f_reading_order,
33998            #[cfg(feature = "extra-attrs")]
33999            extra_attrs,
34000        })
34001    }
34002}
34003
34004impl FromXml for Borders {
34005    fn from_xml<R: BufRead>(
34006        reader: &mut Reader<R>,
34007        start_tag: &BytesStart,
34008        is_empty: bool,
34009    ) -> Result<Self, ParseError> {
34010        let mut f_count = None;
34011        let mut f_border = Vec::new();
34012        #[cfg(feature = "extra-attrs")]
34013        let mut extra_attrs = std::collections::HashMap::new();
34014        #[cfg(feature = "extra-children")]
34015        let mut extra_children = Vec::new();
34016        #[cfg(feature = "extra-children")]
34017        let mut child_idx: usize = 0;
34018
34019        // Parse attributes
34020        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34021            let val = String::from_utf8_lossy(&attr.value);
34022            match attr.key.local_name().as_ref() {
34023                b"count" => {
34024                    f_count = val.parse().ok();
34025                }
34026                #[cfg(feature = "extra-attrs")]
34027                unknown => {
34028                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34029                    extra_attrs.insert(key, val.into_owned());
34030                }
34031                #[cfg(not(feature = "extra-attrs"))]
34032                _ => {}
34033            }
34034        }
34035
34036        // Parse child elements
34037        if !is_empty {
34038            let mut buf = Vec::new();
34039            loop {
34040                match reader.read_event_into(&mut buf)? {
34041                    Event::Start(e) => {
34042                        match e.local_name().as_ref() {
34043                            b"border" => {
34044                                f_border.push(Border::from_xml(reader, &e, false)?);
34045                                #[cfg(feature = "extra-children")]
34046                                {
34047                                    child_idx += 1;
34048                                }
34049                            }
34050                            #[cfg(feature = "extra-children")]
34051                            _ => {
34052                                // Capture unknown element for roundtrip
34053                                let elem = RawXmlElement::from_reader(reader, &e)?;
34054                                extra_children.push(PositionedNode::new(
34055                                    child_idx,
34056                                    RawXmlNode::Element(elem),
34057                                ));
34058                                child_idx += 1;
34059                            }
34060                            #[cfg(not(feature = "extra-children"))]
34061                            _ => {
34062                                // Skip unknown element
34063                                skip_element(reader)?;
34064                            }
34065                        }
34066                    }
34067                    Event::Empty(e) => {
34068                        match e.local_name().as_ref() {
34069                            b"border" => {
34070                                f_border.push(Border::from_xml(reader, &e, true)?);
34071                                #[cfg(feature = "extra-children")]
34072                                {
34073                                    child_idx += 1;
34074                                }
34075                            }
34076                            #[cfg(feature = "extra-children")]
34077                            _ => {
34078                                // Capture unknown empty element for roundtrip
34079                                let elem = RawXmlElement::from_empty(&e);
34080                                extra_children.push(PositionedNode::new(
34081                                    child_idx,
34082                                    RawXmlNode::Element(elem),
34083                                ));
34084                                child_idx += 1;
34085                            }
34086                            #[cfg(not(feature = "extra-children"))]
34087                            _ => {}
34088                        }
34089                    }
34090                    Event::End(_) => break,
34091                    Event::Eof => break,
34092                    _ => {}
34093                }
34094                buf.clear();
34095            }
34096        }
34097
34098        Ok(Self {
34099            count: f_count,
34100            border: f_border,
34101            #[cfg(feature = "extra-attrs")]
34102            extra_attrs,
34103            #[cfg(feature = "extra-children")]
34104            extra_children,
34105        })
34106    }
34107}
34108
34109impl FromXml for Border {
34110    fn from_xml<R: BufRead>(
34111        reader: &mut Reader<R>,
34112        start_tag: &BytesStart,
34113        is_empty: bool,
34114    ) -> Result<Self, ParseError> {
34115        #[cfg(feature = "sml-styling")]
34116        let mut f_diagonal_up = None;
34117        #[cfg(feature = "sml-styling")]
34118        let mut f_diagonal_down = None;
34119        #[cfg(feature = "sml-styling")]
34120        let mut f_outline = None;
34121        let mut f_start = None;
34122        let mut f_end = None;
34123        #[cfg(feature = "sml-styling")]
34124        let mut f_left = None;
34125        #[cfg(feature = "sml-styling")]
34126        let mut f_right = None;
34127        #[cfg(feature = "sml-styling")]
34128        let mut f_top = None;
34129        #[cfg(feature = "sml-styling")]
34130        let mut f_bottom = None;
34131        #[cfg(feature = "sml-styling")]
34132        let mut f_diagonal = None;
34133        #[cfg(feature = "sml-styling")]
34134        let mut f_vertical = None;
34135        #[cfg(feature = "sml-styling")]
34136        let mut f_horizontal = None;
34137        #[cfg(feature = "extra-attrs")]
34138        let mut extra_attrs = std::collections::HashMap::new();
34139        #[cfg(feature = "extra-children")]
34140        let mut extra_children = Vec::new();
34141        #[cfg(feature = "extra-children")]
34142        let mut child_idx: usize = 0;
34143
34144        // Parse attributes
34145        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34146            let val = String::from_utf8_lossy(&attr.value);
34147            match attr.key.local_name().as_ref() {
34148                #[cfg(feature = "sml-styling")]
34149                b"diagonalUp" => {
34150                    f_diagonal_up = Some(val == "true" || val == "1");
34151                }
34152                #[cfg(feature = "sml-styling")]
34153                b"diagonalDown" => {
34154                    f_diagonal_down = Some(val == "true" || val == "1");
34155                }
34156                #[cfg(feature = "sml-styling")]
34157                b"outline" => {
34158                    f_outline = Some(val == "true" || val == "1");
34159                }
34160                #[cfg(feature = "extra-attrs")]
34161                unknown => {
34162                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34163                    extra_attrs.insert(key, val.into_owned());
34164                }
34165                #[cfg(not(feature = "extra-attrs"))]
34166                _ => {}
34167            }
34168        }
34169
34170        // Parse child elements
34171        if !is_empty {
34172            let mut buf = Vec::new();
34173            loop {
34174                match reader.read_event_into(&mut buf)? {
34175                    Event::Start(e) => {
34176                        match e.local_name().as_ref() {
34177                            b"start" => {
34178                                f_start =
34179                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34180                                #[cfg(feature = "extra-children")]
34181                                {
34182                                    child_idx += 1;
34183                                }
34184                            }
34185                            b"end" => {
34186                                f_end =
34187                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34188                                #[cfg(feature = "extra-children")]
34189                                {
34190                                    child_idx += 1;
34191                                }
34192                            }
34193                            #[cfg(feature = "sml-styling")]
34194                            b"left" => {
34195                                f_left =
34196                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34197                                #[cfg(feature = "extra-children")]
34198                                {
34199                                    child_idx += 1;
34200                                }
34201                            }
34202                            #[cfg(feature = "sml-styling")]
34203                            b"right" => {
34204                                f_right =
34205                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34206                                #[cfg(feature = "extra-children")]
34207                                {
34208                                    child_idx += 1;
34209                                }
34210                            }
34211                            #[cfg(feature = "sml-styling")]
34212                            b"top" => {
34213                                f_top =
34214                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34215                                #[cfg(feature = "extra-children")]
34216                                {
34217                                    child_idx += 1;
34218                                }
34219                            }
34220                            #[cfg(feature = "sml-styling")]
34221                            b"bottom" => {
34222                                f_bottom =
34223                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34224                                #[cfg(feature = "extra-children")]
34225                                {
34226                                    child_idx += 1;
34227                                }
34228                            }
34229                            #[cfg(feature = "sml-styling")]
34230                            b"diagonal" => {
34231                                f_diagonal =
34232                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34233                                #[cfg(feature = "extra-children")]
34234                                {
34235                                    child_idx += 1;
34236                                }
34237                            }
34238                            #[cfg(feature = "sml-styling")]
34239                            b"vertical" => {
34240                                f_vertical =
34241                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34242                                #[cfg(feature = "extra-children")]
34243                                {
34244                                    child_idx += 1;
34245                                }
34246                            }
34247                            #[cfg(feature = "sml-styling")]
34248                            b"horizontal" => {
34249                                f_horizontal =
34250                                    Some(Box::new(BorderProperties::from_xml(reader, &e, false)?));
34251                                #[cfg(feature = "extra-children")]
34252                                {
34253                                    child_idx += 1;
34254                                }
34255                            }
34256                            #[cfg(feature = "extra-children")]
34257                            _ => {
34258                                // Capture unknown element for roundtrip
34259                                let elem = RawXmlElement::from_reader(reader, &e)?;
34260                                extra_children.push(PositionedNode::new(
34261                                    child_idx,
34262                                    RawXmlNode::Element(elem),
34263                                ));
34264                                child_idx += 1;
34265                            }
34266                            #[cfg(not(feature = "extra-children"))]
34267                            _ => {
34268                                // Skip unknown element
34269                                skip_element(reader)?;
34270                            }
34271                        }
34272                    }
34273                    Event::Empty(e) => {
34274                        match e.local_name().as_ref() {
34275                            b"start" => {
34276                                f_start =
34277                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34278                                #[cfg(feature = "extra-children")]
34279                                {
34280                                    child_idx += 1;
34281                                }
34282                            }
34283                            b"end" => {
34284                                f_end =
34285                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34286                                #[cfg(feature = "extra-children")]
34287                                {
34288                                    child_idx += 1;
34289                                }
34290                            }
34291                            #[cfg(feature = "sml-styling")]
34292                            b"left" => {
34293                                f_left =
34294                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34295                                #[cfg(feature = "extra-children")]
34296                                {
34297                                    child_idx += 1;
34298                                }
34299                            }
34300                            #[cfg(feature = "sml-styling")]
34301                            b"right" => {
34302                                f_right =
34303                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34304                                #[cfg(feature = "extra-children")]
34305                                {
34306                                    child_idx += 1;
34307                                }
34308                            }
34309                            #[cfg(feature = "sml-styling")]
34310                            b"top" => {
34311                                f_top =
34312                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34313                                #[cfg(feature = "extra-children")]
34314                                {
34315                                    child_idx += 1;
34316                                }
34317                            }
34318                            #[cfg(feature = "sml-styling")]
34319                            b"bottom" => {
34320                                f_bottom =
34321                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34322                                #[cfg(feature = "extra-children")]
34323                                {
34324                                    child_idx += 1;
34325                                }
34326                            }
34327                            #[cfg(feature = "sml-styling")]
34328                            b"diagonal" => {
34329                                f_diagonal =
34330                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34331                                #[cfg(feature = "extra-children")]
34332                                {
34333                                    child_idx += 1;
34334                                }
34335                            }
34336                            #[cfg(feature = "sml-styling")]
34337                            b"vertical" => {
34338                                f_vertical =
34339                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34340                                #[cfg(feature = "extra-children")]
34341                                {
34342                                    child_idx += 1;
34343                                }
34344                            }
34345                            #[cfg(feature = "sml-styling")]
34346                            b"horizontal" => {
34347                                f_horizontal =
34348                                    Some(Box::new(BorderProperties::from_xml(reader, &e, true)?));
34349                                #[cfg(feature = "extra-children")]
34350                                {
34351                                    child_idx += 1;
34352                                }
34353                            }
34354                            #[cfg(feature = "extra-children")]
34355                            _ => {
34356                                // Capture unknown empty element for roundtrip
34357                                let elem = RawXmlElement::from_empty(&e);
34358                                extra_children.push(PositionedNode::new(
34359                                    child_idx,
34360                                    RawXmlNode::Element(elem),
34361                                ));
34362                                child_idx += 1;
34363                            }
34364                            #[cfg(not(feature = "extra-children"))]
34365                            _ => {}
34366                        }
34367                    }
34368                    Event::End(_) => break,
34369                    Event::Eof => break,
34370                    _ => {}
34371                }
34372                buf.clear();
34373            }
34374        }
34375
34376        Ok(Self {
34377            #[cfg(feature = "sml-styling")]
34378            diagonal_up: f_diagonal_up,
34379            #[cfg(feature = "sml-styling")]
34380            diagonal_down: f_diagonal_down,
34381            #[cfg(feature = "sml-styling")]
34382            outline: f_outline,
34383            start: f_start,
34384            end: f_end,
34385            #[cfg(feature = "sml-styling")]
34386            left: f_left,
34387            #[cfg(feature = "sml-styling")]
34388            right: f_right,
34389            #[cfg(feature = "sml-styling")]
34390            top: f_top,
34391            #[cfg(feature = "sml-styling")]
34392            bottom: f_bottom,
34393            #[cfg(feature = "sml-styling")]
34394            diagonal: f_diagonal,
34395            #[cfg(feature = "sml-styling")]
34396            vertical: f_vertical,
34397            #[cfg(feature = "sml-styling")]
34398            horizontal: f_horizontal,
34399            #[cfg(feature = "extra-attrs")]
34400            extra_attrs,
34401            #[cfg(feature = "extra-children")]
34402            extra_children,
34403        })
34404    }
34405}
34406
34407impl FromXml for BorderProperties {
34408    fn from_xml<R: BufRead>(
34409        reader: &mut Reader<R>,
34410        start_tag: &BytesStart,
34411        is_empty: bool,
34412    ) -> Result<Self, ParseError> {
34413        let mut f_style = None;
34414        let mut f_color = None;
34415        #[cfg(feature = "extra-attrs")]
34416        let mut extra_attrs = std::collections::HashMap::new();
34417        #[cfg(feature = "extra-children")]
34418        let mut extra_children = Vec::new();
34419        #[cfg(feature = "extra-children")]
34420        let mut child_idx: usize = 0;
34421
34422        // Parse attributes
34423        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34424            let val = String::from_utf8_lossy(&attr.value);
34425            match attr.key.local_name().as_ref() {
34426                b"style" => {
34427                    f_style = val.parse().ok();
34428                }
34429                #[cfg(feature = "extra-attrs")]
34430                unknown => {
34431                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34432                    extra_attrs.insert(key, val.into_owned());
34433                }
34434                #[cfg(not(feature = "extra-attrs"))]
34435                _ => {}
34436            }
34437        }
34438
34439        // Parse child elements
34440        if !is_empty {
34441            let mut buf = Vec::new();
34442            loop {
34443                match reader.read_event_into(&mut buf)? {
34444                    Event::Start(e) => {
34445                        match e.local_name().as_ref() {
34446                            b"color" => {
34447                                f_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
34448                                #[cfg(feature = "extra-children")]
34449                                {
34450                                    child_idx += 1;
34451                                }
34452                            }
34453                            #[cfg(feature = "extra-children")]
34454                            _ => {
34455                                // Capture unknown element for roundtrip
34456                                let elem = RawXmlElement::from_reader(reader, &e)?;
34457                                extra_children.push(PositionedNode::new(
34458                                    child_idx,
34459                                    RawXmlNode::Element(elem),
34460                                ));
34461                                child_idx += 1;
34462                            }
34463                            #[cfg(not(feature = "extra-children"))]
34464                            _ => {
34465                                // Skip unknown element
34466                                skip_element(reader)?;
34467                            }
34468                        }
34469                    }
34470                    Event::Empty(e) => {
34471                        match e.local_name().as_ref() {
34472                            b"color" => {
34473                                f_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
34474                                #[cfg(feature = "extra-children")]
34475                                {
34476                                    child_idx += 1;
34477                                }
34478                            }
34479                            #[cfg(feature = "extra-children")]
34480                            _ => {
34481                                // Capture unknown empty element for roundtrip
34482                                let elem = RawXmlElement::from_empty(&e);
34483                                extra_children.push(PositionedNode::new(
34484                                    child_idx,
34485                                    RawXmlNode::Element(elem),
34486                                ));
34487                                child_idx += 1;
34488                            }
34489                            #[cfg(not(feature = "extra-children"))]
34490                            _ => {}
34491                        }
34492                    }
34493                    Event::End(_) => break,
34494                    Event::Eof => break,
34495                    _ => {}
34496                }
34497                buf.clear();
34498            }
34499        }
34500
34501        Ok(Self {
34502            style: f_style,
34503            color: f_color,
34504            #[cfg(feature = "extra-attrs")]
34505            extra_attrs,
34506            #[cfg(feature = "extra-children")]
34507            extra_children,
34508        })
34509    }
34510}
34511
34512impl FromXml for CellProtection {
34513    fn from_xml<R: BufRead>(
34514        reader: &mut Reader<R>,
34515        start_tag: &BytesStart,
34516        is_empty: bool,
34517    ) -> Result<Self, ParseError> {
34518        #[cfg(feature = "sml-protection")]
34519        let mut f_locked = None;
34520        #[cfg(feature = "sml-protection")]
34521        let mut f_hidden = None;
34522        #[cfg(feature = "extra-attrs")]
34523        let mut extra_attrs = std::collections::HashMap::new();
34524
34525        // Parse attributes
34526        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34527            let val = String::from_utf8_lossy(&attr.value);
34528            match attr.key.local_name().as_ref() {
34529                #[cfg(feature = "sml-protection")]
34530                b"locked" => {
34531                    f_locked = Some(val == "true" || val == "1");
34532                }
34533                #[cfg(feature = "sml-protection")]
34534                b"hidden" => {
34535                    f_hidden = Some(val == "true" || val == "1");
34536                }
34537                #[cfg(feature = "extra-attrs")]
34538                unknown => {
34539                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34540                    extra_attrs.insert(key, val.into_owned());
34541                }
34542                #[cfg(not(feature = "extra-attrs"))]
34543                _ => {}
34544            }
34545        }
34546
34547        if !is_empty {
34548            let mut buf = Vec::new();
34549            loop {
34550                match reader.read_event_into(&mut buf)? {
34551                    Event::End(_) => break,
34552                    Event::Eof => break,
34553                    _ => {}
34554                }
34555                buf.clear();
34556            }
34557        }
34558
34559        Ok(Self {
34560            #[cfg(feature = "sml-protection")]
34561            locked: f_locked,
34562            #[cfg(feature = "sml-protection")]
34563            hidden: f_hidden,
34564            #[cfg(feature = "extra-attrs")]
34565            extra_attrs,
34566        })
34567    }
34568}
34569
34570impl FromXml for Fonts {
34571    fn from_xml<R: BufRead>(
34572        reader: &mut Reader<R>,
34573        start_tag: &BytesStart,
34574        is_empty: bool,
34575    ) -> Result<Self, ParseError> {
34576        let mut f_count = None;
34577        let mut f_font = Vec::new();
34578        #[cfg(feature = "extra-attrs")]
34579        let mut extra_attrs = std::collections::HashMap::new();
34580        #[cfg(feature = "extra-children")]
34581        let mut extra_children = Vec::new();
34582        #[cfg(feature = "extra-children")]
34583        let mut child_idx: usize = 0;
34584
34585        // Parse attributes
34586        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34587            let val = String::from_utf8_lossy(&attr.value);
34588            match attr.key.local_name().as_ref() {
34589                b"count" => {
34590                    f_count = val.parse().ok();
34591                }
34592                #[cfg(feature = "extra-attrs")]
34593                unknown => {
34594                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34595                    extra_attrs.insert(key, val.into_owned());
34596                }
34597                #[cfg(not(feature = "extra-attrs"))]
34598                _ => {}
34599            }
34600        }
34601
34602        // Parse child elements
34603        if !is_empty {
34604            let mut buf = Vec::new();
34605            loop {
34606                match reader.read_event_into(&mut buf)? {
34607                    Event::Start(e) => {
34608                        match e.local_name().as_ref() {
34609                            b"font" => {
34610                                f_font.push(Font::from_xml(reader, &e, false)?);
34611                                #[cfg(feature = "extra-children")]
34612                                {
34613                                    child_idx += 1;
34614                                }
34615                            }
34616                            #[cfg(feature = "extra-children")]
34617                            _ => {
34618                                // Capture unknown element for roundtrip
34619                                let elem = RawXmlElement::from_reader(reader, &e)?;
34620                                extra_children.push(PositionedNode::new(
34621                                    child_idx,
34622                                    RawXmlNode::Element(elem),
34623                                ));
34624                                child_idx += 1;
34625                            }
34626                            #[cfg(not(feature = "extra-children"))]
34627                            _ => {
34628                                // Skip unknown element
34629                                skip_element(reader)?;
34630                            }
34631                        }
34632                    }
34633                    Event::Empty(e) => {
34634                        match e.local_name().as_ref() {
34635                            b"font" => {
34636                                f_font.push(Font::from_xml(reader, &e, true)?);
34637                                #[cfg(feature = "extra-children")]
34638                                {
34639                                    child_idx += 1;
34640                                }
34641                            }
34642                            #[cfg(feature = "extra-children")]
34643                            _ => {
34644                                // Capture unknown empty element for roundtrip
34645                                let elem = RawXmlElement::from_empty(&e);
34646                                extra_children.push(PositionedNode::new(
34647                                    child_idx,
34648                                    RawXmlNode::Element(elem),
34649                                ));
34650                                child_idx += 1;
34651                            }
34652                            #[cfg(not(feature = "extra-children"))]
34653                            _ => {}
34654                        }
34655                    }
34656                    Event::End(_) => break,
34657                    Event::Eof => break,
34658                    _ => {}
34659                }
34660                buf.clear();
34661            }
34662        }
34663
34664        Ok(Self {
34665            count: f_count,
34666            font: f_font,
34667            #[cfg(feature = "extra-attrs")]
34668            extra_attrs,
34669            #[cfg(feature = "extra-children")]
34670            extra_children,
34671        })
34672    }
34673}
34674
34675impl FromXml for Fills {
34676    fn from_xml<R: BufRead>(
34677        reader: &mut Reader<R>,
34678        start_tag: &BytesStart,
34679        is_empty: bool,
34680    ) -> Result<Self, ParseError> {
34681        let mut f_count = None;
34682        let mut f_fill = Vec::new();
34683        #[cfg(feature = "extra-attrs")]
34684        let mut extra_attrs = std::collections::HashMap::new();
34685        #[cfg(feature = "extra-children")]
34686        let mut extra_children = Vec::new();
34687        #[cfg(feature = "extra-children")]
34688        let mut child_idx: usize = 0;
34689
34690        // Parse attributes
34691        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34692            let val = String::from_utf8_lossy(&attr.value);
34693            match attr.key.local_name().as_ref() {
34694                b"count" => {
34695                    f_count = val.parse().ok();
34696                }
34697                #[cfg(feature = "extra-attrs")]
34698                unknown => {
34699                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34700                    extra_attrs.insert(key, val.into_owned());
34701                }
34702                #[cfg(not(feature = "extra-attrs"))]
34703                _ => {}
34704            }
34705        }
34706
34707        // Parse child elements
34708        if !is_empty {
34709            let mut buf = Vec::new();
34710            loop {
34711                match reader.read_event_into(&mut buf)? {
34712                    Event::Start(e) => {
34713                        match e.local_name().as_ref() {
34714                            b"fill" => {
34715                                f_fill.push(Fill::from_xml(reader, &e, false)?);
34716                                #[cfg(feature = "extra-children")]
34717                                {
34718                                    child_idx += 1;
34719                                }
34720                            }
34721                            #[cfg(feature = "extra-children")]
34722                            _ => {
34723                                // Capture unknown element for roundtrip
34724                                let elem = RawXmlElement::from_reader(reader, &e)?;
34725                                extra_children.push(PositionedNode::new(
34726                                    child_idx,
34727                                    RawXmlNode::Element(elem),
34728                                ));
34729                                child_idx += 1;
34730                            }
34731                            #[cfg(not(feature = "extra-children"))]
34732                            _ => {
34733                                // Skip unknown element
34734                                skip_element(reader)?;
34735                            }
34736                        }
34737                    }
34738                    Event::Empty(e) => {
34739                        match e.local_name().as_ref() {
34740                            b"fill" => {
34741                                f_fill.push(Fill::from_xml(reader, &e, true)?);
34742                                #[cfg(feature = "extra-children")]
34743                                {
34744                                    child_idx += 1;
34745                                }
34746                            }
34747                            #[cfg(feature = "extra-children")]
34748                            _ => {
34749                                // Capture unknown empty element for roundtrip
34750                                let elem = RawXmlElement::from_empty(&e);
34751                                extra_children.push(PositionedNode::new(
34752                                    child_idx,
34753                                    RawXmlNode::Element(elem),
34754                                ));
34755                                child_idx += 1;
34756                            }
34757                            #[cfg(not(feature = "extra-children"))]
34758                            _ => {}
34759                        }
34760                    }
34761                    Event::End(_) => break,
34762                    Event::Eof => break,
34763                    _ => {}
34764                }
34765                buf.clear();
34766            }
34767        }
34768
34769        Ok(Self {
34770            count: f_count,
34771            fill: f_fill,
34772            #[cfg(feature = "extra-attrs")]
34773            extra_attrs,
34774            #[cfg(feature = "extra-children")]
34775            extra_children,
34776        })
34777    }
34778}
34779
34780impl FromXml for Fill {
34781    fn from_xml<R: BufRead>(
34782        reader: &mut Reader<R>,
34783        start_tag: &BytesStart,
34784        is_empty: bool,
34785    ) -> Result<Self, ParseError> {
34786        #[cfg(feature = "sml-styling")]
34787        let mut f_pattern_fill = None;
34788        #[cfg(feature = "sml-styling")]
34789        let mut f_gradient_fill = None;
34790        #[cfg(feature = "extra-children")]
34791        let mut extra_children = Vec::new();
34792        #[cfg(feature = "extra-children")]
34793        let mut child_idx: usize = 0;
34794
34795        // Parse child elements
34796        if !is_empty {
34797            let mut buf = Vec::new();
34798            loop {
34799                match reader.read_event_into(&mut buf)? {
34800                    Event::Start(e) => {
34801                        match e.local_name().as_ref() {
34802                            #[cfg(feature = "sml-styling")]
34803                            b"patternFill" => {
34804                                f_pattern_fill =
34805                                    Some(Box::new(PatternFill::from_xml(reader, &e, false)?));
34806                                #[cfg(feature = "extra-children")]
34807                                {
34808                                    child_idx += 1;
34809                                }
34810                            }
34811                            #[cfg(feature = "sml-styling")]
34812                            b"gradientFill" => {
34813                                f_gradient_fill =
34814                                    Some(Box::new(GradientFill::from_xml(reader, &e, false)?));
34815                                #[cfg(feature = "extra-children")]
34816                                {
34817                                    child_idx += 1;
34818                                }
34819                            }
34820                            #[cfg(feature = "extra-children")]
34821                            _ => {
34822                                // Capture unknown element for roundtrip
34823                                let elem = RawXmlElement::from_reader(reader, &e)?;
34824                                extra_children.push(PositionedNode::new(
34825                                    child_idx,
34826                                    RawXmlNode::Element(elem),
34827                                ));
34828                                child_idx += 1;
34829                            }
34830                            #[cfg(not(feature = "extra-children"))]
34831                            _ => {
34832                                // Skip unknown element
34833                                skip_element(reader)?;
34834                            }
34835                        }
34836                    }
34837                    Event::Empty(e) => {
34838                        match e.local_name().as_ref() {
34839                            #[cfg(feature = "sml-styling")]
34840                            b"patternFill" => {
34841                                f_pattern_fill =
34842                                    Some(Box::new(PatternFill::from_xml(reader, &e, true)?));
34843                                #[cfg(feature = "extra-children")]
34844                                {
34845                                    child_idx += 1;
34846                                }
34847                            }
34848                            #[cfg(feature = "sml-styling")]
34849                            b"gradientFill" => {
34850                                f_gradient_fill =
34851                                    Some(Box::new(GradientFill::from_xml(reader, &e, true)?));
34852                                #[cfg(feature = "extra-children")]
34853                                {
34854                                    child_idx += 1;
34855                                }
34856                            }
34857                            #[cfg(feature = "extra-children")]
34858                            _ => {
34859                                // Capture unknown empty element for roundtrip
34860                                let elem = RawXmlElement::from_empty(&e);
34861                                extra_children.push(PositionedNode::new(
34862                                    child_idx,
34863                                    RawXmlNode::Element(elem),
34864                                ));
34865                                child_idx += 1;
34866                            }
34867                            #[cfg(not(feature = "extra-children"))]
34868                            _ => {}
34869                        }
34870                    }
34871                    Event::End(_) => break,
34872                    Event::Eof => break,
34873                    _ => {}
34874                }
34875                buf.clear();
34876            }
34877        }
34878
34879        Ok(Self {
34880            #[cfg(feature = "sml-styling")]
34881            pattern_fill: f_pattern_fill,
34882            #[cfg(feature = "sml-styling")]
34883            gradient_fill: f_gradient_fill,
34884            #[cfg(feature = "extra-children")]
34885            extra_children,
34886        })
34887    }
34888}
34889
34890impl FromXml for PatternFill {
34891    fn from_xml<R: BufRead>(
34892        reader: &mut Reader<R>,
34893        start_tag: &BytesStart,
34894        is_empty: bool,
34895    ) -> Result<Self, ParseError> {
34896        let mut f_pattern_type = None;
34897        let mut f_fg_color = None;
34898        let mut f_bg_color = None;
34899        #[cfg(feature = "extra-attrs")]
34900        let mut extra_attrs = std::collections::HashMap::new();
34901        #[cfg(feature = "extra-children")]
34902        let mut extra_children = Vec::new();
34903        #[cfg(feature = "extra-children")]
34904        let mut child_idx: usize = 0;
34905
34906        // Parse attributes
34907        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
34908            let val = String::from_utf8_lossy(&attr.value);
34909            match attr.key.local_name().as_ref() {
34910                b"patternType" => {
34911                    f_pattern_type = val.parse().ok();
34912                }
34913                #[cfg(feature = "extra-attrs")]
34914                unknown => {
34915                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
34916                    extra_attrs.insert(key, val.into_owned());
34917                }
34918                #[cfg(not(feature = "extra-attrs"))]
34919                _ => {}
34920            }
34921        }
34922
34923        // Parse child elements
34924        if !is_empty {
34925            let mut buf = Vec::new();
34926            loop {
34927                match reader.read_event_into(&mut buf)? {
34928                    Event::Start(e) => {
34929                        match e.local_name().as_ref() {
34930                            b"fgColor" => {
34931                                f_fg_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
34932                                #[cfg(feature = "extra-children")]
34933                                {
34934                                    child_idx += 1;
34935                                }
34936                            }
34937                            b"bgColor" => {
34938                                f_bg_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
34939                                #[cfg(feature = "extra-children")]
34940                                {
34941                                    child_idx += 1;
34942                                }
34943                            }
34944                            #[cfg(feature = "extra-children")]
34945                            _ => {
34946                                // Capture unknown element for roundtrip
34947                                let elem = RawXmlElement::from_reader(reader, &e)?;
34948                                extra_children.push(PositionedNode::new(
34949                                    child_idx,
34950                                    RawXmlNode::Element(elem),
34951                                ));
34952                                child_idx += 1;
34953                            }
34954                            #[cfg(not(feature = "extra-children"))]
34955                            _ => {
34956                                // Skip unknown element
34957                                skip_element(reader)?;
34958                            }
34959                        }
34960                    }
34961                    Event::Empty(e) => {
34962                        match e.local_name().as_ref() {
34963                            b"fgColor" => {
34964                                f_fg_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
34965                                #[cfg(feature = "extra-children")]
34966                                {
34967                                    child_idx += 1;
34968                                }
34969                            }
34970                            b"bgColor" => {
34971                                f_bg_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
34972                                #[cfg(feature = "extra-children")]
34973                                {
34974                                    child_idx += 1;
34975                                }
34976                            }
34977                            #[cfg(feature = "extra-children")]
34978                            _ => {
34979                                // Capture unknown empty element for roundtrip
34980                                let elem = RawXmlElement::from_empty(&e);
34981                                extra_children.push(PositionedNode::new(
34982                                    child_idx,
34983                                    RawXmlNode::Element(elem),
34984                                ));
34985                                child_idx += 1;
34986                            }
34987                            #[cfg(not(feature = "extra-children"))]
34988                            _ => {}
34989                        }
34990                    }
34991                    Event::End(_) => break,
34992                    Event::Eof => break,
34993                    _ => {}
34994                }
34995                buf.clear();
34996            }
34997        }
34998
34999        Ok(Self {
35000            pattern_type: f_pattern_type,
35001            fg_color: f_fg_color,
35002            bg_color: f_bg_color,
35003            #[cfg(feature = "extra-attrs")]
35004            extra_attrs,
35005            #[cfg(feature = "extra-children")]
35006            extra_children,
35007        })
35008    }
35009}
35010
35011impl FromXml for Color {
35012    fn from_xml<R: BufRead>(
35013        reader: &mut Reader<R>,
35014        start_tag: &BytesStart,
35015        is_empty: bool,
35016    ) -> Result<Self, ParseError> {
35017        #[cfg(feature = "sml-styling")]
35018        let mut f_auto = None;
35019        #[cfg(feature = "sml-styling")]
35020        let mut f_indexed = None;
35021        #[cfg(feature = "sml-styling")]
35022        let mut f_rgb = None;
35023        #[cfg(feature = "sml-styling")]
35024        let mut f_theme = None;
35025        #[cfg(feature = "sml-styling")]
35026        let mut f_tint = None;
35027        #[cfg(feature = "extra-attrs")]
35028        let mut extra_attrs = std::collections::HashMap::new();
35029
35030        // Parse attributes
35031        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35032            let val = String::from_utf8_lossy(&attr.value);
35033            match attr.key.local_name().as_ref() {
35034                #[cfg(feature = "sml-styling")]
35035                b"auto" => {
35036                    f_auto = Some(val == "true" || val == "1");
35037                }
35038                #[cfg(feature = "sml-styling")]
35039                b"indexed" => {
35040                    f_indexed = val.parse().ok();
35041                }
35042                #[cfg(feature = "sml-styling")]
35043                b"rgb" => {
35044                    f_rgb = decode_hex(&val);
35045                }
35046                #[cfg(feature = "sml-styling")]
35047                b"theme" => {
35048                    f_theme = val.parse().ok();
35049                }
35050                #[cfg(feature = "sml-styling")]
35051                b"tint" => {
35052                    f_tint = val.parse().ok();
35053                }
35054                #[cfg(feature = "extra-attrs")]
35055                unknown => {
35056                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35057                    extra_attrs.insert(key, val.into_owned());
35058                }
35059                #[cfg(not(feature = "extra-attrs"))]
35060                _ => {}
35061            }
35062        }
35063
35064        if !is_empty {
35065            let mut buf = Vec::new();
35066            loop {
35067                match reader.read_event_into(&mut buf)? {
35068                    Event::End(_) => break,
35069                    Event::Eof => break,
35070                    _ => {}
35071                }
35072                buf.clear();
35073            }
35074        }
35075
35076        Ok(Self {
35077            #[cfg(feature = "sml-styling")]
35078            auto: f_auto,
35079            #[cfg(feature = "sml-styling")]
35080            indexed: f_indexed,
35081            #[cfg(feature = "sml-styling")]
35082            rgb: f_rgb,
35083            #[cfg(feature = "sml-styling")]
35084            theme: f_theme,
35085            #[cfg(feature = "sml-styling")]
35086            tint: f_tint,
35087            #[cfg(feature = "extra-attrs")]
35088            extra_attrs,
35089        })
35090    }
35091}
35092
35093impl FromXml for GradientFill {
35094    fn from_xml<R: BufRead>(
35095        reader: &mut Reader<R>,
35096        start_tag: &BytesStart,
35097        is_empty: bool,
35098    ) -> Result<Self, ParseError> {
35099        let mut f_type = None;
35100        let mut f_degree = None;
35101        let mut f_left = None;
35102        let mut f_right = None;
35103        let mut f_top = None;
35104        let mut f_bottom = None;
35105        let mut f_stop = Vec::new();
35106        #[cfg(feature = "extra-attrs")]
35107        let mut extra_attrs = std::collections::HashMap::new();
35108        #[cfg(feature = "extra-children")]
35109        let mut extra_children = Vec::new();
35110        #[cfg(feature = "extra-children")]
35111        let mut child_idx: usize = 0;
35112
35113        // Parse attributes
35114        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35115            let val = String::from_utf8_lossy(&attr.value);
35116            match attr.key.local_name().as_ref() {
35117                b"type" => {
35118                    f_type = val.parse().ok();
35119                }
35120                b"degree" => {
35121                    f_degree = val.parse().ok();
35122                }
35123                b"left" => {
35124                    f_left = val.parse().ok();
35125                }
35126                b"right" => {
35127                    f_right = val.parse().ok();
35128                }
35129                b"top" => {
35130                    f_top = val.parse().ok();
35131                }
35132                b"bottom" => {
35133                    f_bottom = val.parse().ok();
35134                }
35135                #[cfg(feature = "extra-attrs")]
35136                unknown => {
35137                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35138                    extra_attrs.insert(key, val.into_owned());
35139                }
35140                #[cfg(not(feature = "extra-attrs"))]
35141                _ => {}
35142            }
35143        }
35144
35145        // Parse child elements
35146        if !is_empty {
35147            let mut buf = Vec::new();
35148            loop {
35149                match reader.read_event_into(&mut buf)? {
35150                    Event::Start(e) => {
35151                        match e.local_name().as_ref() {
35152                            b"stop" => {
35153                                f_stop.push(GradientStop::from_xml(reader, &e, false)?);
35154                                #[cfg(feature = "extra-children")]
35155                                {
35156                                    child_idx += 1;
35157                                }
35158                            }
35159                            #[cfg(feature = "extra-children")]
35160                            _ => {
35161                                // Capture unknown element for roundtrip
35162                                let elem = RawXmlElement::from_reader(reader, &e)?;
35163                                extra_children.push(PositionedNode::new(
35164                                    child_idx,
35165                                    RawXmlNode::Element(elem),
35166                                ));
35167                                child_idx += 1;
35168                            }
35169                            #[cfg(not(feature = "extra-children"))]
35170                            _ => {
35171                                // Skip unknown element
35172                                skip_element(reader)?;
35173                            }
35174                        }
35175                    }
35176                    Event::Empty(e) => {
35177                        match e.local_name().as_ref() {
35178                            b"stop" => {
35179                                f_stop.push(GradientStop::from_xml(reader, &e, true)?);
35180                                #[cfg(feature = "extra-children")]
35181                                {
35182                                    child_idx += 1;
35183                                }
35184                            }
35185                            #[cfg(feature = "extra-children")]
35186                            _ => {
35187                                // Capture unknown empty element for roundtrip
35188                                let elem = RawXmlElement::from_empty(&e);
35189                                extra_children.push(PositionedNode::new(
35190                                    child_idx,
35191                                    RawXmlNode::Element(elem),
35192                                ));
35193                                child_idx += 1;
35194                            }
35195                            #[cfg(not(feature = "extra-children"))]
35196                            _ => {}
35197                        }
35198                    }
35199                    Event::End(_) => break,
35200                    Event::Eof => break,
35201                    _ => {}
35202                }
35203                buf.clear();
35204            }
35205        }
35206
35207        Ok(Self {
35208            r#type: f_type,
35209            degree: f_degree,
35210            left: f_left,
35211            right: f_right,
35212            top: f_top,
35213            bottom: f_bottom,
35214            stop: f_stop,
35215            #[cfg(feature = "extra-attrs")]
35216            extra_attrs,
35217            #[cfg(feature = "extra-children")]
35218            extra_children,
35219        })
35220    }
35221}
35222
35223impl FromXml for GradientStop {
35224    fn from_xml<R: BufRead>(
35225        reader: &mut Reader<R>,
35226        start_tag: &BytesStart,
35227        is_empty: bool,
35228    ) -> Result<Self, ParseError> {
35229        let mut f_position: Option<f64> = None;
35230        let mut f_color: Option<Box<Color>> = None;
35231        #[cfg(feature = "extra-attrs")]
35232        let mut extra_attrs = std::collections::HashMap::new();
35233        #[cfg(feature = "extra-children")]
35234        let mut extra_children = Vec::new();
35235        #[cfg(feature = "extra-children")]
35236        let mut child_idx: usize = 0;
35237
35238        // Parse attributes
35239        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35240            let val = String::from_utf8_lossy(&attr.value);
35241            match attr.key.local_name().as_ref() {
35242                b"position" => {
35243                    f_position = val.parse().ok();
35244                }
35245                #[cfg(feature = "extra-attrs")]
35246                unknown => {
35247                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35248                    extra_attrs.insert(key, val.into_owned());
35249                }
35250                #[cfg(not(feature = "extra-attrs"))]
35251                _ => {}
35252            }
35253        }
35254
35255        // Parse child elements
35256        if !is_empty {
35257            let mut buf = Vec::new();
35258            loop {
35259                match reader.read_event_into(&mut buf)? {
35260                    Event::Start(e) => {
35261                        match e.local_name().as_ref() {
35262                            b"color" => {
35263                                f_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
35264                                #[cfg(feature = "extra-children")]
35265                                {
35266                                    child_idx += 1;
35267                                }
35268                            }
35269                            #[cfg(feature = "extra-children")]
35270                            _ => {
35271                                // Capture unknown element for roundtrip
35272                                let elem = RawXmlElement::from_reader(reader, &e)?;
35273                                extra_children.push(PositionedNode::new(
35274                                    child_idx,
35275                                    RawXmlNode::Element(elem),
35276                                ));
35277                                child_idx += 1;
35278                            }
35279                            #[cfg(not(feature = "extra-children"))]
35280                            _ => {
35281                                // Skip unknown element
35282                                skip_element(reader)?;
35283                            }
35284                        }
35285                    }
35286                    Event::Empty(e) => {
35287                        match e.local_name().as_ref() {
35288                            b"color" => {
35289                                f_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
35290                                #[cfg(feature = "extra-children")]
35291                                {
35292                                    child_idx += 1;
35293                                }
35294                            }
35295                            #[cfg(feature = "extra-children")]
35296                            _ => {
35297                                // Capture unknown empty element for roundtrip
35298                                let elem = RawXmlElement::from_empty(&e);
35299                                extra_children.push(PositionedNode::new(
35300                                    child_idx,
35301                                    RawXmlNode::Element(elem),
35302                                ));
35303                                child_idx += 1;
35304                            }
35305                            #[cfg(not(feature = "extra-children"))]
35306                            _ => {}
35307                        }
35308                    }
35309                    Event::End(_) => break,
35310                    Event::Eof => break,
35311                    _ => {}
35312                }
35313                buf.clear();
35314            }
35315        }
35316
35317        Ok(Self {
35318            position: f_position
35319                .ok_or_else(|| ParseError::MissingAttribute("position".to_string()))?,
35320            color: f_color.ok_or_else(|| ParseError::MissingAttribute("color".to_string()))?,
35321            #[cfg(feature = "extra-attrs")]
35322            extra_attrs,
35323            #[cfg(feature = "extra-children")]
35324            extra_children,
35325        })
35326    }
35327}
35328
35329impl FromXml for NumberFormats {
35330    fn from_xml<R: BufRead>(
35331        reader: &mut Reader<R>,
35332        start_tag: &BytesStart,
35333        is_empty: bool,
35334    ) -> Result<Self, ParseError> {
35335        let mut f_count = None;
35336        let mut f_num_fmt = Vec::new();
35337        #[cfg(feature = "extra-attrs")]
35338        let mut extra_attrs = std::collections::HashMap::new();
35339        #[cfg(feature = "extra-children")]
35340        let mut extra_children = Vec::new();
35341        #[cfg(feature = "extra-children")]
35342        let mut child_idx: usize = 0;
35343
35344        // Parse attributes
35345        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35346            let val = String::from_utf8_lossy(&attr.value);
35347            match attr.key.local_name().as_ref() {
35348                b"count" => {
35349                    f_count = val.parse().ok();
35350                }
35351                #[cfg(feature = "extra-attrs")]
35352                unknown => {
35353                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35354                    extra_attrs.insert(key, val.into_owned());
35355                }
35356                #[cfg(not(feature = "extra-attrs"))]
35357                _ => {}
35358            }
35359        }
35360
35361        // Parse child elements
35362        if !is_empty {
35363            let mut buf = Vec::new();
35364            loop {
35365                match reader.read_event_into(&mut buf)? {
35366                    Event::Start(e) => {
35367                        match e.local_name().as_ref() {
35368                            b"numFmt" => {
35369                                f_num_fmt.push(NumberFormat::from_xml(reader, &e, false)?);
35370                                #[cfg(feature = "extra-children")]
35371                                {
35372                                    child_idx += 1;
35373                                }
35374                            }
35375                            #[cfg(feature = "extra-children")]
35376                            _ => {
35377                                // Capture unknown element for roundtrip
35378                                let elem = RawXmlElement::from_reader(reader, &e)?;
35379                                extra_children.push(PositionedNode::new(
35380                                    child_idx,
35381                                    RawXmlNode::Element(elem),
35382                                ));
35383                                child_idx += 1;
35384                            }
35385                            #[cfg(not(feature = "extra-children"))]
35386                            _ => {
35387                                // Skip unknown element
35388                                skip_element(reader)?;
35389                            }
35390                        }
35391                    }
35392                    Event::Empty(e) => {
35393                        match e.local_name().as_ref() {
35394                            b"numFmt" => {
35395                                f_num_fmt.push(NumberFormat::from_xml(reader, &e, true)?);
35396                                #[cfg(feature = "extra-children")]
35397                                {
35398                                    child_idx += 1;
35399                                }
35400                            }
35401                            #[cfg(feature = "extra-children")]
35402                            _ => {
35403                                // Capture unknown empty element for roundtrip
35404                                let elem = RawXmlElement::from_empty(&e);
35405                                extra_children.push(PositionedNode::new(
35406                                    child_idx,
35407                                    RawXmlNode::Element(elem),
35408                                ));
35409                                child_idx += 1;
35410                            }
35411                            #[cfg(not(feature = "extra-children"))]
35412                            _ => {}
35413                        }
35414                    }
35415                    Event::End(_) => break,
35416                    Event::Eof => break,
35417                    _ => {}
35418                }
35419                buf.clear();
35420            }
35421        }
35422
35423        Ok(Self {
35424            count: f_count,
35425            num_fmt: f_num_fmt,
35426            #[cfg(feature = "extra-attrs")]
35427            extra_attrs,
35428            #[cfg(feature = "extra-children")]
35429            extra_children,
35430        })
35431    }
35432}
35433
35434impl FromXml for NumberFormat {
35435    fn from_xml<R: BufRead>(
35436        reader: &mut Reader<R>,
35437        start_tag: &BytesStart,
35438        is_empty: bool,
35439    ) -> Result<Self, ParseError> {
35440        #[cfg(feature = "sml-styling")]
35441        let mut f_number_format_id: Option<STNumFmtId> = None;
35442        #[cfg(feature = "sml-styling")]
35443        let mut f_format_code: Option<XmlString> = None;
35444        #[cfg(feature = "extra-attrs")]
35445        let mut extra_attrs = std::collections::HashMap::new();
35446
35447        // Parse attributes
35448        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35449            let val = String::from_utf8_lossy(&attr.value);
35450            match attr.key.local_name().as_ref() {
35451                #[cfg(feature = "sml-styling")]
35452                b"numFmtId" => {
35453                    f_number_format_id = val.parse().ok();
35454                }
35455                #[cfg(feature = "sml-styling")]
35456                b"formatCode" => {
35457                    f_format_code = Some(val.into_owned());
35458                }
35459                #[cfg(feature = "extra-attrs")]
35460                unknown => {
35461                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35462                    extra_attrs.insert(key, val.into_owned());
35463                }
35464                #[cfg(not(feature = "extra-attrs"))]
35465                _ => {}
35466            }
35467        }
35468
35469        if !is_empty {
35470            let mut buf = Vec::new();
35471            loop {
35472                match reader.read_event_into(&mut buf)? {
35473                    Event::End(_) => break,
35474                    Event::Eof => break,
35475                    _ => {}
35476                }
35477                buf.clear();
35478            }
35479        }
35480
35481        Ok(Self {
35482            #[cfg(feature = "sml-styling")]
35483            number_format_id: f_number_format_id
35484                .ok_or_else(|| ParseError::MissingAttribute("numFmtId".to_string()))?,
35485            #[cfg(feature = "sml-styling")]
35486            format_code: f_format_code
35487                .ok_or_else(|| ParseError::MissingAttribute("formatCode".to_string()))?,
35488            #[cfg(feature = "extra-attrs")]
35489            extra_attrs,
35490        })
35491    }
35492}
35493
35494impl FromXml for CellStyleFormats {
35495    fn from_xml<R: BufRead>(
35496        reader: &mut Reader<R>,
35497        start_tag: &BytesStart,
35498        is_empty: bool,
35499    ) -> Result<Self, ParseError> {
35500        let mut f_count = None;
35501        let mut f_xf = Vec::new();
35502        #[cfg(feature = "extra-attrs")]
35503        let mut extra_attrs = std::collections::HashMap::new();
35504        #[cfg(feature = "extra-children")]
35505        let mut extra_children = Vec::new();
35506        #[cfg(feature = "extra-children")]
35507        let mut child_idx: usize = 0;
35508
35509        // Parse attributes
35510        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35511            let val = String::from_utf8_lossy(&attr.value);
35512            match attr.key.local_name().as_ref() {
35513                b"count" => {
35514                    f_count = val.parse().ok();
35515                }
35516                #[cfg(feature = "extra-attrs")]
35517                unknown => {
35518                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35519                    extra_attrs.insert(key, val.into_owned());
35520                }
35521                #[cfg(not(feature = "extra-attrs"))]
35522                _ => {}
35523            }
35524        }
35525
35526        // Parse child elements
35527        if !is_empty {
35528            let mut buf = Vec::new();
35529            loop {
35530                match reader.read_event_into(&mut buf)? {
35531                    Event::Start(e) => {
35532                        match e.local_name().as_ref() {
35533                            b"xf" => {
35534                                f_xf.push(Format::from_xml(reader, &e, false)?);
35535                                #[cfg(feature = "extra-children")]
35536                                {
35537                                    child_idx += 1;
35538                                }
35539                            }
35540                            #[cfg(feature = "extra-children")]
35541                            _ => {
35542                                // Capture unknown element for roundtrip
35543                                let elem = RawXmlElement::from_reader(reader, &e)?;
35544                                extra_children.push(PositionedNode::new(
35545                                    child_idx,
35546                                    RawXmlNode::Element(elem),
35547                                ));
35548                                child_idx += 1;
35549                            }
35550                            #[cfg(not(feature = "extra-children"))]
35551                            _ => {
35552                                // Skip unknown element
35553                                skip_element(reader)?;
35554                            }
35555                        }
35556                    }
35557                    Event::Empty(e) => {
35558                        match e.local_name().as_ref() {
35559                            b"xf" => {
35560                                f_xf.push(Format::from_xml(reader, &e, true)?);
35561                                #[cfg(feature = "extra-children")]
35562                                {
35563                                    child_idx += 1;
35564                                }
35565                            }
35566                            #[cfg(feature = "extra-children")]
35567                            _ => {
35568                                // Capture unknown empty element for roundtrip
35569                                let elem = RawXmlElement::from_empty(&e);
35570                                extra_children.push(PositionedNode::new(
35571                                    child_idx,
35572                                    RawXmlNode::Element(elem),
35573                                ));
35574                                child_idx += 1;
35575                            }
35576                            #[cfg(not(feature = "extra-children"))]
35577                            _ => {}
35578                        }
35579                    }
35580                    Event::End(_) => break,
35581                    Event::Eof => break,
35582                    _ => {}
35583                }
35584                buf.clear();
35585            }
35586        }
35587
35588        Ok(Self {
35589            count: f_count,
35590            xf: f_xf,
35591            #[cfg(feature = "extra-attrs")]
35592            extra_attrs,
35593            #[cfg(feature = "extra-children")]
35594            extra_children,
35595        })
35596    }
35597}
35598
35599impl FromXml for CellFormats {
35600    fn from_xml<R: BufRead>(
35601        reader: &mut Reader<R>,
35602        start_tag: &BytesStart,
35603        is_empty: bool,
35604    ) -> Result<Self, ParseError> {
35605        let mut f_count = None;
35606        let mut f_xf = Vec::new();
35607        #[cfg(feature = "extra-attrs")]
35608        let mut extra_attrs = std::collections::HashMap::new();
35609        #[cfg(feature = "extra-children")]
35610        let mut extra_children = Vec::new();
35611        #[cfg(feature = "extra-children")]
35612        let mut child_idx: usize = 0;
35613
35614        // Parse attributes
35615        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35616            let val = String::from_utf8_lossy(&attr.value);
35617            match attr.key.local_name().as_ref() {
35618                b"count" => {
35619                    f_count = val.parse().ok();
35620                }
35621                #[cfg(feature = "extra-attrs")]
35622                unknown => {
35623                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35624                    extra_attrs.insert(key, val.into_owned());
35625                }
35626                #[cfg(not(feature = "extra-attrs"))]
35627                _ => {}
35628            }
35629        }
35630
35631        // Parse child elements
35632        if !is_empty {
35633            let mut buf = Vec::new();
35634            loop {
35635                match reader.read_event_into(&mut buf)? {
35636                    Event::Start(e) => {
35637                        match e.local_name().as_ref() {
35638                            b"xf" => {
35639                                f_xf.push(Format::from_xml(reader, &e, false)?);
35640                                #[cfg(feature = "extra-children")]
35641                                {
35642                                    child_idx += 1;
35643                                }
35644                            }
35645                            #[cfg(feature = "extra-children")]
35646                            _ => {
35647                                // Capture unknown element for roundtrip
35648                                let elem = RawXmlElement::from_reader(reader, &e)?;
35649                                extra_children.push(PositionedNode::new(
35650                                    child_idx,
35651                                    RawXmlNode::Element(elem),
35652                                ));
35653                                child_idx += 1;
35654                            }
35655                            #[cfg(not(feature = "extra-children"))]
35656                            _ => {
35657                                // Skip unknown element
35658                                skip_element(reader)?;
35659                            }
35660                        }
35661                    }
35662                    Event::Empty(e) => {
35663                        match e.local_name().as_ref() {
35664                            b"xf" => {
35665                                f_xf.push(Format::from_xml(reader, &e, true)?);
35666                                #[cfg(feature = "extra-children")]
35667                                {
35668                                    child_idx += 1;
35669                                }
35670                            }
35671                            #[cfg(feature = "extra-children")]
35672                            _ => {
35673                                // Capture unknown empty element for roundtrip
35674                                let elem = RawXmlElement::from_empty(&e);
35675                                extra_children.push(PositionedNode::new(
35676                                    child_idx,
35677                                    RawXmlNode::Element(elem),
35678                                ));
35679                                child_idx += 1;
35680                            }
35681                            #[cfg(not(feature = "extra-children"))]
35682                            _ => {}
35683                        }
35684                    }
35685                    Event::End(_) => break,
35686                    Event::Eof => break,
35687                    _ => {}
35688                }
35689                buf.clear();
35690            }
35691        }
35692
35693        Ok(Self {
35694            count: f_count,
35695            xf: f_xf,
35696            #[cfg(feature = "extra-attrs")]
35697            extra_attrs,
35698            #[cfg(feature = "extra-children")]
35699            extra_children,
35700        })
35701    }
35702}
35703
35704impl FromXml for Format {
35705    fn from_xml<R: BufRead>(
35706        reader: &mut Reader<R>,
35707        start_tag: &BytesStart,
35708        is_empty: bool,
35709    ) -> Result<Self, ParseError> {
35710        #[cfg(feature = "sml-styling")]
35711        let mut f_number_format_id = None;
35712        #[cfg(feature = "sml-styling")]
35713        let mut f_font_id = None;
35714        #[cfg(feature = "sml-styling")]
35715        let mut f_fill_id = None;
35716        #[cfg(feature = "sml-styling")]
35717        let mut f_border_id = None;
35718        #[cfg(feature = "sml-styling")]
35719        let mut f_format_id = None;
35720        #[cfg(feature = "sml-styling")]
35721        let mut f_quote_prefix = None;
35722        #[cfg(feature = "sml-pivot")]
35723        let mut f_pivot_button = None;
35724        #[cfg(feature = "sml-styling")]
35725        let mut f_apply_number_format = None;
35726        #[cfg(feature = "sml-styling")]
35727        let mut f_apply_font = None;
35728        #[cfg(feature = "sml-styling")]
35729        let mut f_apply_fill = None;
35730        #[cfg(feature = "sml-styling")]
35731        let mut f_apply_border = None;
35732        #[cfg(feature = "sml-styling")]
35733        let mut f_apply_alignment = None;
35734        #[cfg(feature = "sml-styling")]
35735        let mut f_apply_protection = None;
35736        #[cfg(feature = "sml-styling")]
35737        let mut f_alignment = None;
35738        #[cfg(feature = "sml-protection")]
35739        let mut f_protection = None;
35740        #[cfg(feature = "sml-extensions")]
35741        let mut f_extension_list = None;
35742        #[cfg(feature = "extra-attrs")]
35743        let mut extra_attrs = std::collections::HashMap::new();
35744        #[cfg(feature = "extra-children")]
35745        let mut extra_children = Vec::new();
35746        #[cfg(feature = "extra-children")]
35747        let mut child_idx: usize = 0;
35748
35749        // Parse attributes
35750        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35751            let val = String::from_utf8_lossy(&attr.value);
35752            match attr.key.local_name().as_ref() {
35753                #[cfg(feature = "sml-styling")]
35754                b"numFmtId" => {
35755                    f_number_format_id = val.parse().ok();
35756                }
35757                #[cfg(feature = "sml-styling")]
35758                b"fontId" => {
35759                    f_font_id = val.parse().ok();
35760                }
35761                #[cfg(feature = "sml-styling")]
35762                b"fillId" => {
35763                    f_fill_id = val.parse().ok();
35764                }
35765                #[cfg(feature = "sml-styling")]
35766                b"borderId" => {
35767                    f_border_id = val.parse().ok();
35768                }
35769                #[cfg(feature = "sml-styling")]
35770                b"xfId" => {
35771                    f_format_id = val.parse().ok();
35772                }
35773                #[cfg(feature = "sml-styling")]
35774                b"quotePrefix" => {
35775                    f_quote_prefix = Some(val == "true" || val == "1");
35776                }
35777                #[cfg(feature = "sml-pivot")]
35778                b"pivotButton" => {
35779                    f_pivot_button = Some(val == "true" || val == "1");
35780                }
35781                #[cfg(feature = "sml-styling")]
35782                b"applyNumberFormat" => {
35783                    f_apply_number_format = Some(val == "true" || val == "1");
35784                }
35785                #[cfg(feature = "sml-styling")]
35786                b"applyFont" => {
35787                    f_apply_font = Some(val == "true" || val == "1");
35788                }
35789                #[cfg(feature = "sml-styling")]
35790                b"applyFill" => {
35791                    f_apply_fill = Some(val == "true" || val == "1");
35792                }
35793                #[cfg(feature = "sml-styling")]
35794                b"applyBorder" => {
35795                    f_apply_border = Some(val == "true" || val == "1");
35796                }
35797                #[cfg(feature = "sml-styling")]
35798                b"applyAlignment" => {
35799                    f_apply_alignment = Some(val == "true" || val == "1");
35800                }
35801                #[cfg(feature = "sml-styling")]
35802                b"applyProtection" => {
35803                    f_apply_protection = Some(val == "true" || val == "1");
35804                }
35805                #[cfg(feature = "extra-attrs")]
35806                unknown => {
35807                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35808                    extra_attrs.insert(key, val.into_owned());
35809                }
35810                #[cfg(not(feature = "extra-attrs"))]
35811                _ => {}
35812            }
35813        }
35814
35815        // Parse child elements
35816        if !is_empty {
35817            let mut buf = Vec::new();
35818            loop {
35819                match reader.read_event_into(&mut buf)? {
35820                    Event::Start(e) => {
35821                        match e.local_name().as_ref() {
35822                            #[cfg(feature = "sml-styling")]
35823                            b"alignment" => {
35824                                f_alignment =
35825                                    Some(Box::new(CellAlignment::from_xml(reader, &e, false)?));
35826                                #[cfg(feature = "extra-children")]
35827                                {
35828                                    child_idx += 1;
35829                                }
35830                            }
35831                            #[cfg(feature = "sml-protection")]
35832                            b"protection" => {
35833                                f_protection =
35834                                    Some(Box::new(CellProtection::from_xml(reader, &e, false)?));
35835                                #[cfg(feature = "extra-children")]
35836                                {
35837                                    child_idx += 1;
35838                                }
35839                            }
35840                            #[cfg(feature = "sml-extensions")]
35841                            b"extLst" => {
35842                                f_extension_list =
35843                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
35844                                #[cfg(feature = "extra-children")]
35845                                {
35846                                    child_idx += 1;
35847                                }
35848                            }
35849                            #[cfg(feature = "extra-children")]
35850                            _ => {
35851                                // Capture unknown element for roundtrip
35852                                let elem = RawXmlElement::from_reader(reader, &e)?;
35853                                extra_children.push(PositionedNode::new(
35854                                    child_idx,
35855                                    RawXmlNode::Element(elem),
35856                                ));
35857                                child_idx += 1;
35858                            }
35859                            #[cfg(not(feature = "extra-children"))]
35860                            _ => {
35861                                // Skip unknown element
35862                                skip_element(reader)?;
35863                            }
35864                        }
35865                    }
35866                    Event::Empty(e) => {
35867                        match e.local_name().as_ref() {
35868                            #[cfg(feature = "sml-styling")]
35869                            b"alignment" => {
35870                                f_alignment =
35871                                    Some(Box::new(CellAlignment::from_xml(reader, &e, true)?));
35872                                #[cfg(feature = "extra-children")]
35873                                {
35874                                    child_idx += 1;
35875                                }
35876                            }
35877                            #[cfg(feature = "sml-protection")]
35878                            b"protection" => {
35879                                f_protection =
35880                                    Some(Box::new(CellProtection::from_xml(reader, &e, true)?));
35881                                #[cfg(feature = "extra-children")]
35882                                {
35883                                    child_idx += 1;
35884                                }
35885                            }
35886                            #[cfg(feature = "sml-extensions")]
35887                            b"extLst" => {
35888                                f_extension_list =
35889                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
35890                                #[cfg(feature = "extra-children")]
35891                                {
35892                                    child_idx += 1;
35893                                }
35894                            }
35895                            #[cfg(feature = "extra-children")]
35896                            _ => {
35897                                // Capture unknown empty element for roundtrip
35898                                let elem = RawXmlElement::from_empty(&e);
35899                                extra_children.push(PositionedNode::new(
35900                                    child_idx,
35901                                    RawXmlNode::Element(elem),
35902                                ));
35903                                child_idx += 1;
35904                            }
35905                            #[cfg(not(feature = "extra-children"))]
35906                            _ => {}
35907                        }
35908                    }
35909                    Event::End(_) => break,
35910                    Event::Eof => break,
35911                    _ => {}
35912                }
35913                buf.clear();
35914            }
35915        }
35916
35917        Ok(Self {
35918            #[cfg(feature = "sml-styling")]
35919            number_format_id: f_number_format_id,
35920            #[cfg(feature = "sml-styling")]
35921            font_id: f_font_id,
35922            #[cfg(feature = "sml-styling")]
35923            fill_id: f_fill_id,
35924            #[cfg(feature = "sml-styling")]
35925            border_id: f_border_id,
35926            #[cfg(feature = "sml-styling")]
35927            format_id: f_format_id,
35928            #[cfg(feature = "sml-styling")]
35929            quote_prefix: f_quote_prefix,
35930            #[cfg(feature = "sml-pivot")]
35931            pivot_button: f_pivot_button,
35932            #[cfg(feature = "sml-styling")]
35933            apply_number_format: f_apply_number_format,
35934            #[cfg(feature = "sml-styling")]
35935            apply_font: f_apply_font,
35936            #[cfg(feature = "sml-styling")]
35937            apply_fill: f_apply_fill,
35938            #[cfg(feature = "sml-styling")]
35939            apply_border: f_apply_border,
35940            #[cfg(feature = "sml-styling")]
35941            apply_alignment: f_apply_alignment,
35942            #[cfg(feature = "sml-styling")]
35943            apply_protection: f_apply_protection,
35944            #[cfg(feature = "sml-styling")]
35945            alignment: f_alignment,
35946            #[cfg(feature = "sml-protection")]
35947            protection: f_protection,
35948            #[cfg(feature = "sml-extensions")]
35949            extension_list: f_extension_list,
35950            #[cfg(feature = "extra-attrs")]
35951            extra_attrs,
35952            #[cfg(feature = "extra-children")]
35953            extra_children,
35954        })
35955    }
35956}
35957
35958impl FromXml for CellStyles {
35959    fn from_xml<R: BufRead>(
35960        reader: &mut Reader<R>,
35961        start_tag: &BytesStart,
35962        is_empty: bool,
35963    ) -> Result<Self, ParseError> {
35964        let mut f_count = None;
35965        let mut f_cell_style = Vec::new();
35966        #[cfg(feature = "extra-attrs")]
35967        let mut extra_attrs = std::collections::HashMap::new();
35968        #[cfg(feature = "extra-children")]
35969        let mut extra_children = Vec::new();
35970        #[cfg(feature = "extra-children")]
35971        let mut child_idx: usize = 0;
35972
35973        // Parse attributes
35974        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
35975            let val = String::from_utf8_lossy(&attr.value);
35976            match attr.key.local_name().as_ref() {
35977                b"count" => {
35978                    f_count = val.parse().ok();
35979                }
35980                #[cfg(feature = "extra-attrs")]
35981                unknown => {
35982                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
35983                    extra_attrs.insert(key, val.into_owned());
35984                }
35985                #[cfg(not(feature = "extra-attrs"))]
35986                _ => {}
35987            }
35988        }
35989
35990        // Parse child elements
35991        if !is_empty {
35992            let mut buf = Vec::new();
35993            loop {
35994                match reader.read_event_into(&mut buf)? {
35995                    Event::Start(e) => {
35996                        match e.local_name().as_ref() {
35997                            b"cellStyle" => {
35998                                f_cell_style.push(CellStyle::from_xml(reader, &e, false)?);
35999                                #[cfg(feature = "extra-children")]
36000                                {
36001                                    child_idx += 1;
36002                                }
36003                            }
36004                            #[cfg(feature = "extra-children")]
36005                            _ => {
36006                                // Capture unknown element for roundtrip
36007                                let elem = RawXmlElement::from_reader(reader, &e)?;
36008                                extra_children.push(PositionedNode::new(
36009                                    child_idx,
36010                                    RawXmlNode::Element(elem),
36011                                ));
36012                                child_idx += 1;
36013                            }
36014                            #[cfg(not(feature = "extra-children"))]
36015                            _ => {
36016                                // Skip unknown element
36017                                skip_element(reader)?;
36018                            }
36019                        }
36020                    }
36021                    Event::Empty(e) => {
36022                        match e.local_name().as_ref() {
36023                            b"cellStyle" => {
36024                                f_cell_style.push(CellStyle::from_xml(reader, &e, true)?);
36025                                #[cfg(feature = "extra-children")]
36026                                {
36027                                    child_idx += 1;
36028                                }
36029                            }
36030                            #[cfg(feature = "extra-children")]
36031                            _ => {
36032                                // Capture unknown empty element for roundtrip
36033                                let elem = RawXmlElement::from_empty(&e);
36034                                extra_children.push(PositionedNode::new(
36035                                    child_idx,
36036                                    RawXmlNode::Element(elem),
36037                                ));
36038                                child_idx += 1;
36039                            }
36040                            #[cfg(not(feature = "extra-children"))]
36041                            _ => {}
36042                        }
36043                    }
36044                    Event::End(_) => break,
36045                    Event::Eof => break,
36046                    _ => {}
36047                }
36048                buf.clear();
36049            }
36050        }
36051
36052        Ok(Self {
36053            count: f_count,
36054            cell_style: f_cell_style,
36055            #[cfg(feature = "extra-attrs")]
36056            extra_attrs,
36057            #[cfg(feature = "extra-children")]
36058            extra_children,
36059        })
36060    }
36061}
36062
36063impl FromXml for CellStyle {
36064    fn from_xml<R: BufRead>(
36065        reader: &mut Reader<R>,
36066        start_tag: &BytesStart,
36067        is_empty: bool,
36068    ) -> Result<Self, ParseError> {
36069        let mut f_name = None;
36070        let mut f_format_id: Option<STCellStyleXfId> = None;
36071        let mut f_builtin_id = None;
36072        let mut f_i_level = None;
36073        let mut f_hidden = None;
36074        let mut f_custom_builtin = None;
36075        let mut f_extension_list = None;
36076        #[cfg(feature = "extra-attrs")]
36077        let mut extra_attrs = std::collections::HashMap::new();
36078        #[cfg(feature = "extra-children")]
36079        let mut extra_children = Vec::new();
36080        #[cfg(feature = "extra-children")]
36081        let mut child_idx: usize = 0;
36082
36083        // Parse attributes
36084        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
36085            let val = String::from_utf8_lossy(&attr.value);
36086            match attr.key.local_name().as_ref() {
36087                b"name" => {
36088                    f_name = Some(val.into_owned());
36089                }
36090                b"xfId" => {
36091                    f_format_id = val.parse().ok();
36092                }
36093                b"builtinId" => {
36094                    f_builtin_id = val.parse().ok();
36095                }
36096                b"iLevel" => {
36097                    f_i_level = val.parse().ok();
36098                }
36099                b"hidden" => {
36100                    f_hidden = Some(val == "true" || val == "1");
36101                }
36102                b"customBuiltin" => {
36103                    f_custom_builtin = Some(val == "true" || val == "1");
36104                }
36105                #[cfg(feature = "extra-attrs")]
36106                unknown => {
36107                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
36108                    extra_attrs.insert(key, val.into_owned());
36109                }
36110                #[cfg(not(feature = "extra-attrs"))]
36111                _ => {}
36112            }
36113        }
36114
36115        // Parse child elements
36116        if !is_empty {
36117            let mut buf = Vec::new();
36118            loop {
36119                match reader.read_event_into(&mut buf)? {
36120                    Event::Start(e) => {
36121                        match e.local_name().as_ref() {
36122                            b"extLst" => {
36123                                f_extension_list =
36124                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
36125                                #[cfg(feature = "extra-children")]
36126                                {
36127                                    child_idx += 1;
36128                                }
36129                            }
36130                            #[cfg(feature = "extra-children")]
36131                            _ => {
36132                                // Capture unknown element for roundtrip
36133                                let elem = RawXmlElement::from_reader(reader, &e)?;
36134                                extra_children.push(PositionedNode::new(
36135                                    child_idx,
36136                                    RawXmlNode::Element(elem),
36137                                ));
36138                                child_idx += 1;
36139                            }
36140                            #[cfg(not(feature = "extra-children"))]
36141                            _ => {
36142                                // Skip unknown element
36143                                skip_element(reader)?;
36144                            }
36145                        }
36146                    }
36147                    Event::Empty(e) => {
36148                        match e.local_name().as_ref() {
36149                            b"extLst" => {
36150                                f_extension_list =
36151                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
36152                                #[cfg(feature = "extra-children")]
36153                                {
36154                                    child_idx += 1;
36155                                }
36156                            }
36157                            #[cfg(feature = "extra-children")]
36158                            _ => {
36159                                // Capture unknown empty element for roundtrip
36160                                let elem = RawXmlElement::from_empty(&e);
36161                                extra_children.push(PositionedNode::new(
36162                                    child_idx,
36163                                    RawXmlNode::Element(elem),
36164                                ));
36165                                child_idx += 1;
36166                            }
36167                            #[cfg(not(feature = "extra-children"))]
36168                            _ => {}
36169                        }
36170                    }
36171                    Event::End(_) => break,
36172                    Event::Eof => break,
36173                    _ => {}
36174                }
36175                buf.clear();
36176            }
36177        }
36178
36179        Ok(Self {
36180            name: f_name,
36181            format_id: f_format_id
36182                .ok_or_else(|| ParseError::MissingAttribute("xfId".to_string()))?,
36183            builtin_id: f_builtin_id,
36184            i_level: f_i_level,
36185            hidden: f_hidden,
36186            custom_builtin: f_custom_builtin,
36187            extension_list: f_extension_list,
36188            #[cfg(feature = "extra-attrs")]
36189            extra_attrs,
36190            #[cfg(feature = "extra-children")]
36191            extra_children,
36192        })
36193    }
36194}
36195
36196impl FromXml for DifferentialFormats {
36197    fn from_xml<R: BufRead>(
36198        reader: &mut Reader<R>,
36199        start_tag: &BytesStart,
36200        is_empty: bool,
36201    ) -> Result<Self, ParseError> {
36202        let mut f_count = None;
36203        let mut f_dxf = Vec::new();
36204        #[cfg(feature = "extra-attrs")]
36205        let mut extra_attrs = std::collections::HashMap::new();
36206        #[cfg(feature = "extra-children")]
36207        let mut extra_children = Vec::new();
36208        #[cfg(feature = "extra-children")]
36209        let mut child_idx: usize = 0;
36210
36211        // Parse attributes
36212        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
36213            let val = String::from_utf8_lossy(&attr.value);
36214            match attr.key.local_name().as_ref() {
36215                b"count" => {
36216                    f_count = val.parse().ok();
36217                }
36218                #[cfg(feature = "extra-attrs")]
36219                unknown => {
36220                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
36221                    extra_attrs.insert(key, val.into_owned());
36222                }
36223                #[cfg(not(feature = "extra-attrs"))]
36224                _ => {}
36225            }
36226        }
36227
36228        // Parse child elements
36229        if !is_empty {
36230            let mut buf = Vec::new();
36231            loop {
36232                match reader.read_event_into(&mut buf)? {
36233                    Event::Start(e) => {
36234                        match e.local_name().as_ref() {
36235                            b"dxf" => {
36236                                f_dxf.push(DifferentialFormat::from_xml(reader, &e, false)?);
36237                                #[cfg(feature = "extra-children")]
36238                                {
36239                                    child_idx += 1;
36240                                }
36241                            }
36242                            #[cfg(feature = "extra-children")]
36243                            _ => {
36244                                // Capture unknown element for roundtrip
36245                                let elem = RawXmlElement::from_reader(reader, &e)?;
36246                                extra_children.push(PositionedNode::new(
36247                                    child_idx,
36248                                    RawXmlNode::Element(elem),
36249                                ));
36250                                child_idx += 1;
36251                            }
36252                            #[cfg(not(feature = "extra-children"))]
36253                            _ => {
36254                                // Skip unknown element
36255                                skip_element(reader)?;
36256                            }
36257                        }
36258                    }
36259                    Event::Empty(e) => {
36260                        match e.local_name().as_ref() {
36261                            b"dxf" => {
36262                                f_dxf.push(DifferentialFormat::from_xml(reader, &e, true)?);
36263                                #[cfg(feature = "extra-children")]
36264                                {
36265                                    child_idx += 1;
36266                                }
36267                            }
36268                            #[cfg(feature = "extra-children")]
36269                            _ => {
36270                                // Capture unknown empty element for roundtrip
36271                                let elem = RawXmlElement::from_empty(&e);
36272                                extra_children.push(PositionedNode::new(
36273                                    child_idx,
36274                                    RawXmlNode::Element(elem),
36275                                ));
36276                                child_idx += 1;
36277                            }
36278                            #[cfg(not(feature = "extra-children"))]
36279                            _ => {}
36280                        }
36281                    }
36282                    Event::End(_) => break,
36283                    Event::Eof => break,
36284                    _ => {}
36285                }
36286                buf.clear();
36287            }
36288        }
36289
36290        Ok(Self {
36291            count: f_count,
36292            dxf: f_dxf,
36293            #[cfg(feature = "extra-attrs")]
36294            extra_attrs,
36295            #[cfg(feature = "extra-children")]
36296            extra_children,
36297        })
36298    }
36299}
36300
36301impl FromXml for DifferentialFormat {
36302    fn from_xml<R: BufRead>(
36303        reader: &mut Reader<R>,
36304        start_tag: &BytesStart,
36305        is_empty: bool,
36306    ) -> Result<Self, ParseError> {
36307        let mut f_font = None;
36308        let mut f_num_fmt = None;
36309        let mut f_fill = None;
36310        let mut f_alignment = None;
36311        let mut f_border = None;
36312        let mut f_protection = None;
36313        let mut f_extension_list = None;
36314        #[cfg(feature = "extra-children")]
36315        let mut extra_children = Vec::new();
36316        #[cfg(feature = "extra-children")]
36317        let mut child_idx: usize = 0;
36318
36319        // Parse child elements
36320        if !is_empty {
36321            let mut buf = Vec::new();
36322            loop {
36323                match reader.read_event_into(&mut buf)? {
36324                    Event::Start(e) => {
36325                        match e.local_name().as_ref() {
36326                            b"font" => {
36327                                f_font = Some(Box::new(Font::from_xml(reader, &e, false)?));
36328                                #[cfg(feature = "extra-children")]
36329                                {
36330                                    child_idx += 1;
36331                                }
36332                            }
36333                            b"numFmt" => {
36334                                f_num_fmt =
36335                                    Some(Box::new(NumberFormat::from_xml(reader, &e, false)?));
36336                                #[cfg(feature = "extra-children")]
36337                                {
36338                                    child_idx += 1;
36339                                }
36340                            }
36341                            b"fill" => {
36342                                f_fill = Some(Box::new(Fill::from_xml(reader, &e, false)?));
36343                                #[cfg(feature = "extra-children")]
36344                                {
36345                                    child_idx += 1;
36346                                }
36347                            }
36348                            b"alignment" => {
36349                                f_alignment =
36350                                    Some(Box::new(CellAlignment::from_xml(reader, &e, false)?));
36351                                #[cfg(feature = "extra-children")]
36352                                {
36353                                    child_idx += 1;
36354                                }
36355                            }
36356                            b"border" => {
36357                                f_border = Some(Box::new(Border::from_xml(reader, &e, false)?));
36358                                #[cfg(feature = "extra-children")]
36359                                {
36360                                    child_idx += 1;
36361                                }
36362                            }
36363                            b"protection" => {
36364                                f_protection =
36365                                    Some(Box::new(CellProtection::from_xml(reader, &e, false)?));
36366                                #[cfg(feature = "extra-children")]
36367                                {
36368                                    child_idx += 1;
36369                                }
36370                            }
36371                            b"extLst" => {
36372                                f_extension_list =
36373                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
36374                                #[cfg(feature = "extra-children")]
36375                                {
36376                                    child_idx += 1;
36377                                }
36378                            }
36379                            #[cfg(feature = "extra-children")]
36380                            _ => {
36381                                // Capture unknown element for roundtrip
36382                                let elem = RawXmlElement::from_reader(reader, &e)?;
36383                                extra_children.push(PositionedNode::new(
36384                                    child_idx,
36385                                    RawXmlNode::Element(elem),
36386                                ));
36387                                child_idx += 1;
36388                            }
36389                            #[cfg(not(feature = "extra-children"))]
36390                            _ => {
36391                                // Skip unknown element
36392                                skip_element(reader)?;
36393                            }
36394                        }
36395                    }
36396                    Event::Empty(e) => {
36397                        match e.local_name().as_ref() {
36398                            b"font" => {
36399                                f_font = Some(Box::new(Font::from_xml(reader, &e, true)?));
36400                                #[cfg(feature = "extra-children")]
36401                                {
36402                                    child_idx += 1;
36403                                }
36404                            }
36405                            b"numFmt" => {
36406                                f_num_fmt =
36407                                    Some(Box::new(NumberFormat::from_xml(reader, &e, true)?));
36408                                #[cfg(feature = "extra-children")]
36409                                {
36410                                    child_idx += 1;
36411                                }
36412                            }
36413                            b"fill" => {
36414                                f_fill = Some(Box::new(Fill::from_xml(reader, &e, true)?));
36415                                #[cfg(feature = "extra-children")]
36416                                {
36417                                    child_idx += 1;
36418                                }
36419                            }
36420                            b"alignment" => {
36421                                f_alignment =
36422                                    Some(Box::new(CellAlignment::from_xml(reader, &e, true)?));
36423                                #[cfg(feature = "extra-children")]
36424                                {
36425                                    child_idx += 1;
36426                                }
36427                            }
36428                            b"border" => {
36429                                f_border = Some(Box::new(Border::from_xml(reader, &e, true)?));
36430                                #[cfg(feature = "extra-children")]
36431                                {
36432                                    child_idx += 1;
36433                                }
36434                            }
36435                            b"protection" => {
36436                                f_protection =
36437                                    Some(Box::new(CellProtection::from_xml(reader, &e, true)?));
36438                                #[cfg(feature = "extra-children")]
36439                                {
36440                                    child_idx += 1;
36441                                }
36442                            }
36443                            b"extLst" => {
36444                                f_extension_list =
36445                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
36446                                #[cfg(feature = "extra-children")]
36447                                {
36448                                    child_idx += 1;
36449                                }
36450                            }
36451                            #[cfg(feature = "extra-children")]
36452                            _ => {
36453                                // Capture unknown empty element for roundtrip
36454                                let elem = RawXmlElement::from_empty(&e);
36455                                extra_children.push(PositionedNode::new(
36456                                    child_idx,
36457                                    RawXmlNode::Element(elem),
36458                                ));
36459                                child_idx += 1;
36460                            }
36461                            #[cfg(not(feature = "extra-children"))]
36462                            _ => {}
36463                        }
36464                    }
36465                    Event::End(_) => break,
36466                    Event::Eof => break,
36467                    _ => {}
36468                }
36469                buf.clear();
36470            }
36471        }
36472
36473        Ok(Self {
36474            font: f_font,
36475            num_fmt: f_num_fmt,
36476            fill: f_fill,
36477            alignment: f_alignment,
36478            border: f_border,
36479            protection: f_protection,
36480            extension_list: f_extension_list,
36481            #[cfg(feature = "extra-children")]
36482            extra_children,
36483        })
36484    }
36485}
36486
36487impl FromXml for Colors {
36488    fn from_xml<R: BufRead>(
36489        reader: &mut Reader<R>,
36490        start_tag: &BytesStart,
36491        is_empty: bool,
36492    ) -> Result<Self, ParseError> {
36493        #[cfg(feature = "sml-styling")]
36494        let mut f_indexed_colors = None;
36495        #[cfg(feature = "sml-styling")]
36496        let mut f_mru_colors = None;
36497        #[cfg(feature = "extra-children")]
36498        let mut extra_children = Vec::new();
36499        #[cfg(feature = "extra-children")]
36500        let mut child_idx: usize = 0;
36501
36502        // Parse child elements
36503        if !is_empty {
36504            let mut buf = Vec::new();
36505            loop {
36506                match reader.read_event_into(&mut buf)? {
36507                    Event::Start(e) => {
36508                        match e.local_name().as_ref() {
36509                            #[cfg(feature = "sml-styling")]
36510                            b"indexedColors" => {
36511                                f_indexed_colors =
36512                                    Some(Box::new(IndexedColors::from_xml(reader, &e, false)?));
36513                                #[cfg(feature = "extra-children")]
36514                                {
36515                                    child_idx += 1;
36516                                }
36517                            }
36518                            #[cfg(feature = "sml-styling")]
36519                            b"mruColors" => {
36520                                f_mru_colors =
36521                                    Some(Box::new(MostRecentColors::from_xml(reader, &e, false)?));
36522                                #[cfg(feature = "extra-children")]
36523                                {
36524                                    child_idx += 1;
36525                                }
36526                            }
36527                            #[cfg(feature = "extra-children")]
36528                            _ => {
36529                                // Capture unknown element for roundtrip
36530                                let elem = RawXmlElement::from_reader(reader, &e)?;
36531                                extra_children.push(PositionedNode::new(
36532                                    child_idx,
36533                                    RawXmlNode::Element(elem),
36534                                ));
36535                                child_idx += 1;
36536                            }
36537                            #[cfg(not(feature = "extra-children"))]
36538                            _ => {
36539                                // Skip unknown element
36540                                skip_element(reader)?;
36541                            }
36542                        }
36543                    }
36544                    Event::Empty(e) => {
36545                        match e.local_name().as_ref() {
36546                            #[cfg(feature = "sml-styling")]
36547                            b"indexedColors" => {
36548                                f_indexed_colors =
36549                                    Some(Box::new(IndexedColors::from_xml(reader, &e, true)?));
36550                                #[cfg(feature = "extra-children")]
36551                                {
36552                                    child_idx += 1;
36553                                }
36554                            }
36555                            #[cfg(feature = "sml-styling")]
36556                            b"mruColors" => {
36557                                f_mru_colors =
36558                                    Some(Box::new(MostRecentColors::from_xml(reader, &e, true)?));
36559                                #[cfg(feature = "extra-children")]
36560                                {
36561                                    child_idx += 1;
36562                                }
36563                            }
36564                            #[cfg(feature = "extra-children")]
36565                            _ => {
36566                                // Capture unknown empty element for roundtrip
36567                                let elem = RawXmlElement::from_empty(&e);
36568                                extra_children.push(PositionedNode::new(
36569                                    child_idx,
36570                                    RawXmlNode::Element(elem),
36571                                ));
36572                                child_idx += 1;
36573                            }
36574                            #[cfg(not(feature = "extra-children"))]
36575                            _ => {}
36576                        }
36577                    }
36578                    Event::End(_) => break,
36579                    Event::Eof => break,
36580                    _ => {}
36581                }
36582                buf.clear();
36583            }
36584        }
36585
36586        Ok(Self {
36587            #[cfg(feature = "sml-styling")]
36588            indexed_colors: f_indexed_colors,
36589            #[cfg(feature = "sml-styling")]
36590            mru_colors: f_mru_colors,
36591            #[cfg(feature = "extra-children")]
36592            extra_children,
36593        })
36594    }
36595}
36596
36597impl FromXml for IndexedColors {
36598    fn from_xml<R: BufRead>(
36599        reader: &mut Reader<R>,
36600        start_tag: &BytesStart,
36601        is_empty: bool,
36602    ) -> Result<Self, ParseError> {
36603        let mut f_rgb_color = Vec::new();
36604        #[cfg(feature = "extra-children")]
36605        let mut extra_children = Vec::new();
36606        #[cfg(feature = "extra-children")]
36607        let mut child_idx: usize = 0;
36608
36609        // Parse child elements
36610        if !is_empty {
36611            let mut buf = Vec::new();
36612            loop {
36613                match reader.read_event_into(&mut buf)? {
36614                    Event::Start(e) => {
36615                        match e.local_name().as_ref() {
36616                            b"rgbColor" => {
36617                                f_rgb_color.push(RgbColor::from_xml(reader, &e, false)?);
36618                                #[cfg(feature = "extra-children")]
36619                                {
36620                                    child_idx += 1;
36621                                }
36622                            }
36623                            #[cfg(feature = "extra-children")]
36624                            _ => {
36625                                // Capture unknown element for roundtrip
36626                                let elem = RawXmlElement::from_reader(reader, &e)?;
36627                                extra_children.push(PositionedNode::new(
36628                                    child_idx,
36629                                    RawXmlNode::Element(elem),
36630                                ));
36631                                child_idx += 1;
36632                            }
36633                            #[cfg(not(feature = "extra-children"))]
36634                            _ => {
36635                                // Skip unknown element
36636                                skip_element(reader)?;
36637                            }
36638                        }
36639                    }
36640                    Event::Empty(e) => {
36641                        match e.local_name().as_ref() {
36642                            b"rgbColor" => {
36643                                f_rgb_color.push(RgbColor::from_xml(reader, &e, true)?);
36644                                #[cfg(feature = "extra-children")]
36645                                {
36646                                    child_idx += 1;
36647                                }
36648                            }
36649                            #[cfg(feature = "extra-children")]
36650                            _ => {
36651                                // Capture unknown empty element for roundtrip
36652                                let elem = RawXmlElement::from_empty(&e);
36653                                extra_children.push(PositionedNode::new(
36654                                    child_idx,
36655                                    RawXmlNode::Element(elem),
36656                                ));
36657                                child_idx += 1;
36658                            }
36659                            #[cfg(not(feature = "extra-children"))]
36660                            _ => {}
36661                        }
36662                    }
36663                    Event::End(_) => break,
36664                    Event::Eof => break,
36665                    _ => {}
36666                }
36667                buf.clear();
36668            }
36669        }
36670
36671        Ok(Self {
36672            rgb_color: f_rgb_color,
36673            #[cfg(feature = "extra-children")]
36674            extra_children,
36675        })
36676    }
36677}
36678
36679impl FromXml for MostRecentColors {
36680    fn from_xml<R: BufRead>(
36681        reader: &mut Reader<R>,
36682        start_tag: &BytesStart,
36683        is_empty: bool,
36684    ) -> Result<Self, ParseError> {
36685        let mut f_color = Vec::new();
36686        #[cfg(feature = "extra-children")]
36687        let mut extra_children = Vec::new();
36688        #[cfg(feature = "extra-children")]
36689        let mut child_idx: usize = 0;
36690
36691        // Parse child elements
36692        if !is_empty {
36693            let mut buf = Vec::new();
36694            loop {
36695                match reader.read_event_into(&mut buf)? {
36696                    Event::Start(e) => {
36697                        match e.local_name().as_ref() {
36698                            b"color" => {
36699                                f_color.push(Color::from_xml(reader, &e, false)?);
36700                                #[cfg(feature = "extra-children")]
36701                                {
36702                                    child_idx += 1;
36703                                }
36704                            }
36705                            #[cfg(feature = "extra-children")]
36706                            _ => {
36707                                // Capture unknown element for roundtrip
36708                                let elem = RawXmlElement::from_reader(reader, &e)?;
36709                                extra_children.push(PositionedNode::new(
36710                                    child_idx,
36711                                    RawXmlNode::Element(elem),
36712                                ));
36713                                child_idx += 1;
36714                            }
36715                            #[cfg(not(feature = "extra-children"))]
36716                            _ => {
36717                                // Skip unknown element
36718                                skip_element(reader)?;
36719                            }
36720                        }
36721                    }
36722                    Event::Empty(e) => {
36723                        match e.local_name().as_ref() {
36724                            b"color" => {
36725                                f_color.push(Color::from_xml(reader, &e, true)?);
36726                                #[cfg(feature = "extra-children")]
36727                                {
36728                                    child_idx += 1;
36729                                }
36730                            }
36731                            #[cfg(feature = "extra-children")]
36732                            _ => {
36733                                // Capture unknown empty element for roundtrip
36734                                let elem = RawXmlElement::from_empty(&e);
36735                                extra_children.push(PositionedNode::new(
36736                                    child_idx,
36737                                    RawXmlNode::Element(elem),
36738                                ));
36739                                child_idx += 1;
36740                            }
36741                            #[cfg(not(feature = "extra-children"))]
36742                            _ => {}
36743                        }
36744                    }
36745                    Event::End(_) => break,
36746                    Event::Eof => break,
36747                    _ => {}
36748                }
36749                buf.clear();
36750            }
36751        }
36752
36753        Ok(Self {
36754            color: f_color,
36755            #[cfg(feature = "extra-children")]
36756            extra_children,
36757        })
36758    }
36759}
36760
36761impl FromXml for RgbColor {
36762    fn from_xml<R: BufRead>(
36763        reader: &mut Reader<R>,
36764        start_tag: &BytesStart,
36765        is_empty: bool,
36766    ) -> Result<Self, ParseError> {
36767        let mut f_rgb = None;
36768        #[cfg(feature = "extra-attrs")]
36769        let mut extra_attrs = std::collections::HashMap::new();
36770
36771        // Parse attributes
36772        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
36773            let val = String::from_utf8_lossy(&attr.value);
36774            match attr.key.local_name().as_ref() {
36775                b"rgb" => {
36776                    f_rgb = decode_hex(&val);
36777                }
36778                #[cfg(feature = "extra-attrs")]
36779                unknown => {
36780                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
36781                    extra_attrs.insert(key, val.into_owned());
36782                }
36783                #[cfg(not(feature = "extra-attrs"))]
36784                _ => {}
36785            }
36786        }
36787
36788        if !is_empty {
36789            let mut buf = Vec::new();
36790            loop {
36791                match reader.read_event_into(&mut buf)? {
36792                    Event::End(_) => break,
36793                    Event::Eof => break,
36794                    _ => {}
36795                }
36796                buf.clear();
36797            }
36798        }
36799
36800        Ok(Self {
36801            rgb: f_rgb,
36802            #[cfg(feature = "extra-attrs")]
36803            extra_attrs,
36804        })
36805    }
36806}
36807
36808impl FromXml for TableStyles {
36809    fn from_xml<R: BufRead>(
36810        reader: &mut Reader<R>,
36811        start_tag: &BytesStart,
36812        is_empty: bool,
36813    ) -> Result<Self, ParseError> {
36814        let mut f_count = None;
36815        let mut f_default_table_style = None;
36816        let mut f_default_pivot_style = None;
36817        let mut f_table_style = Vec::new();
36818        #[cfg(feature = "extra-attrs")]
36819        let mut extra_attrs = std::collections::HashMap::new();
36820        #[cfg(feature = "extra-children")]
36821        let mut extra_children = Vec::new();
36822        #[cfg(feature = "extra-children")]
36823        let mut child_idx: usize = 0;
36824
36825        // Parse attributes
36826        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
36827            let val = String::from_utf8_lossy(&attr.value);
36828            match attr.key.local_name().as_ref() {
36829                b"count" => {
36830                    f_count = val.parse().ok();
36831                }
36832                b"defaultTableStyle" => {
36833                    f_default_table_style = Some(val.into_owned());
36834                }
36835                b"defaultPivotStyle" => {
36836                    f_default_pivot_style = Some(val.into_owned());
36837                }
36838                #[cfg(feature = "extra-attrs")]
36839                unknown => {
36840                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
36841                    extra_attrs.insert(key, val.into_owned());
36842                }
36843                #[cfg(not(feature = "extra-attrs"))]
36844                _ => {}
36845            }
36846        }
36847
36848        // Parse child elements
36849        if !is_empty {
36850            let mut buf = Vec::new();
36851            loop {
36852                match reader.read_event_into(&mut buf)? {
36853                    Event::Start(e) => {
36854                        match e.local_name().as_ref() {
36855                            b"tableStyle" => {
36856                                f_table_style.push(TableStyle::from_xml(reader, &e, false)?);
36857                                #[cfg(feature = "extra-children")]
36858                                {
36859                                    child_idx += 1;
36860                                }
36861                            }
36862                            #[cfg(feature = "extra-children")]
36863                            _ => {
36864                                // Capture unknown element for roundtrip
36865                                let elem = RawXmlElement::from_reader(reader, &e)?;
36866                                extra_children.push(PositionedNode::new(
36867                                    child_idx,
36868                                    RawXmlNode::Element(elem),
36869                                ));
36870                                child_idx += 1;
36871                            }
36872                            #[cfg(not(feature = "extra-children"))]
36873                            _ => {
36874                                // Skip unknown element
36875                                skip_element(reader)?;
36876                            }
36877                        }
36878                    }
36879                    Event::Empty(e) => {
36880                        match e.local_name().as_ref() {
36881                            b"tableStyle" => {
36882                                f_table_style.push(TableStyle::from_xml(reader, &e, true)?);
36883                                #[cfg(feature = "extra-children")]
36884                                {
36885                                    child_idx += 1;
36886                                }
36887                            }
36888                            #[cfg(feature = "extra-children")]
36889                            _ => {
36890                                // Capture unknown empty element for roundtrip
36891                                let elem = RawXmlElement::from_empty(&e);
36892                                extra_children.push(PositionedNode::new(
36893                                    child_idx,
36894                                    RawXmlNode::Element(elem),
36895                                ));
36896                                child_idx += 1;
36897                            }
36898                            #[cfg(not(feature = "extra-children"))]
36899                            _ => {}
36900                        }
36901                    }
36902                    Event::End(_) => break,
36903                    Event::Eof => break,
36904                    _ => {}
36905                }
36906                buf.clear();
36907            }
36908        }
36909
36910        Ok(Self {
36911            count: f_count,
36912            default_table_style: f_default_table_style,
36913            default_pivot_style: f_default_pivot_style,
36914            table_style: f_table_style,
36915            #[cfg(feature = "extra-attrs")]
36916            extra_attrs,
36917            #[cfg(feature = "extra-children")]
36918            extra_children,
36919        })
36920    }
36921}
36922
36923impl FromXml for TableStyle {
36924    fn from_xml<R: BufRead>(
36925        reader: &mut Reader<R>,
36926        start_tag: &BytesStart,
36927        is_empty: bool,
36928    ) -> Result<Self, ParseError> {
36929        let mut f_name: Option<String> = None;
36930        let mut f_pivot = None;
36931        let mut f_table = None;
36932        let mut f_count = None;
36933        let mut f_table_style_element = Vec::new();
36934        #[cfg(feature = "extra-attrs")]
36935        let mut extra_attrs = std::collections::HashMap::new();
36936        #[cfg(feature = "extra-children")]
36937        let mut extra_children = Vec::new();
36938        #[cfg(feature = "extra-children")]
36939        let mut child_idx: usize = 0;
36940
36941        // Parse attributes
36942        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
36943            let val = String::from_utf8_lossy(&attr.value);
36944            match attr.key.local_name().as_ref() {
36945                b"name" => {
36946                    f_name = Some(val.into_owned());
36947                }
36948                b"pivot" => {
36949                    f_pivot = Some(val == "true" || val == "1");
36950                }
36951                b"table" => {
36952                    f_table = Some(val == "true" || val == "1");
36953                }
36954                b"count" => {
36955                    f_count = val.parse().ok();
36956                }
36957                #[cfg(feature = "extra-attrs")]
36958                unknown => {
36959                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
36960                    extra_attrs.insert(key, val.into_owned());
36961                }
36962                #[cfg(not(feature = "extra-attrs"))]
36963                _ => {}
36964            }
36965        }
36966
36967        // Parse child elements
36968        if !is_empty {
36969            let mut buf = Vec::new();
36970            loop {
36971                match reader.read_event_into(&mut buf)? {
36972                    Event::Start(e) => {
36973                        match e.local_name().as_ref() {
36974                            b"tableStyleElement" => {
36975                                f_table_style_element
36976                                    .push(TableStyleElement::from_xml(reader, &e, false)?);
36977                                #[cfg(feature = "extra-children")]
36978                                {
36979                                    child_idx += 1;
36980                                }
36981                            }
36982                            #[cfg(feature = "extra-children")]
36983                            _ => {
36984                                // Capture unknown element for roundtrip
36985                                let elem = RawXmlElement::from_reader(reader, &e)?;
36986                                extra_children.push(PositionedNode::new(
36987                                    child_idx,
36988                                    RawXmlNode::Element(elem),
36989                                ));
36990                                child_idx += 1;
36991                            }
36992                            #[cfg(not(feature = "extra-children"))]
36993                            _ => {
36994                                // Skip unknown element
36995                                skip_element(reader)?;
36996                            }
36997                        }
36998                    }
36999                    Event::Empty(e) => {
37000                        match e.local_name().as_ref() {
37001                            b"tableStyleElement" => {
37002                                f_table_style_element
37003                                    .push(TableStyleElement::from_xml(reader, &e, true)?);
37004                                #[cfg(feature = "extra-children")]
37005                                {
37006                                    child_idx += 1;
37007                                }
37008                            }
37009                            #[cfg(feature = "extra-children")]
37010                            _ => {
37011                                // Capture unknown empty element for roundtrip
37012                                let elem = RawXmlElement::from_empty(&e);
37013                                extra_children.push(PositionedNode::new(
37014                                    child_idx,
37015                                    RawXmlNode::Element(elem),
37016                                ));
37017                                child_idx += 1;
37018                            }
37019                            #[cfg(not(feature = "extra-children"))]
37020                            _ => {}
37021                        }
37022                    }
37023                    Event::End(_) => break,
37024                    Event::Eof => break,
37025                    _ => {}
37026                }
37027                buf.clear();
37028            }
37029        }
37030
37031        Ok(Self {
37032            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
37033            pivot: f_pivot,
37034            table: f_table,
37035            count: f_count,
37036            table_style_element: f_table_style_element,
37037            #[cfg(feature = "extra-attrs")]
37038            extra_attrs,
37039            #[cfg(feature = "extra-children")]
37040            extra_children,
37041        })
37042    }
37043}
37044
37045impl FromXml for TableStyleElement {
37046    fn from_xml<R: BufRead>(
37047        reader: &mut Reader<R>,
37048        start_tag: &BytesStart,
37049        is_empty: bool,
37050    ) -> Result<Self, ParseError> {
37051        let mut f_type: Option<STTableStyleType> = None;
37052        let mut f_size = None;
37053        let mut f_dxf_id = None;
37054        #[cfg(feature = "extra-attrs")]
37055        let mut extra_attrs = std::collections::HashMap::new();
37056
37057        // Parse attributes
37058        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37059            let val = String::from_utf8_lossy(&attr.value);
37060            match attr.key.local_name().as_ref() {
37061                b"type" => {
37062                    f_type = val.parse().ok();
37063                }
37064                b"size" => {
37065                    f_size = val.parse().ok();
37066                }
37067                b"dxfId" => {
37068                    f_dxf_id = val.parse().ok();
37069                }
37070                #[cfg(feature = "extra-attrs")]
37071                unknown => {
37072                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37073                    extra_attrs.insert(key, val.into_owned());
37074                }
37075                #[cfg(not(feature = "extra-attrs"))]
37076                _ => {}
37077            }
37078        }
37079
37080        if !is_empty {
37081            let mut buf = Vec::new();
37082            loop {
37083                match reader.read_event_into(&mut buf)? {
37084                    Event::End(_) => break,
37085                    Event::Eof => break,
37086                    _ => {}
37087                }
37088                buf.clear();
37089            }
37090        }
37091
37092        Ok(Self {
37093            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
37094            size: f_size,
37095            dxf_id: f_dxf_id,
37096            #[cfg(feature = "extra-attrs")]
37097            extra_attrs,
37098        })
37099    }
37100}
37101
37102impl FromXml for BooleanProperty {
37103    fn from_xml<R: BufRead>(
37104        reader: &mut Reader<R>,
37105        start_tag: &BytesStart,
37106        is_empty: bool,
37107    ) -> Result<Self, ParseError> {
37108        let mut f_value = None;
37109        #[cfg(feature = "extra-attrs")]
37110        let mut extra_attrs = std::collections::HashMap::new();
37111
37112        // Parse attributes
37113        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37114            let val = String::from_utf8_lossy(&attr.value);
37115            match attr.key.local_name().as_ref() {
37116                b"val" => {
37117                    f_value = Some(val == "true" || val == "1");
37118                }
37119                #[cfg(feature = "extra-attrs")]
37120                unknown => {
37121                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37122                    extra_attrs.insert(key, val.into_owned());
37123                }
37124                #[cfg(not(feature = "extra-attrs"))]
37125                _ => {}
37126            }
37127        }
37128
37129        if !is_empty {
37130            let mut buf = Vec::new();
37131            loop {
37132                match reader.read_event_into(&mut buf)? {
37133                    Event::End(_) => break,
37134                    Event::Eof => break,
37135                    _ => {}
37136                }
37137                buf.clear();
37138            }
37139        }
37140
37141        Ok(Self {
37142            value: f_value,
37143            #[cfg(feature = "extra-attrs")]
37144            extra_attrs,
37145        })
37146    }
37147}
37148
37149impl FromXml for FontSize {
37150    fn from_xml<R: BufRead>(
37151        reader: &mut Reader<R>,
37152        start_tag: &BytesStart,
37153        is_empty: bool,
37154    ) -> Result<Self, ParseError> {
37155        let mut f_value: Option<f64> = None;
37156        #[cfg(feature = "extra-attrs")]
37157        let mut extra_attrs = std::collections::HashMap::new();
37158
37159        // Parse attributes
37160        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37161            let val = String::from_utf8_lossy(&attr.value);
37162            match attr.key.local_name().as_ref() {
37163                b"val" => {
37164                    f_value = val.parse().ok();
37165                }
37166                #[cfg(feature = "extra-attrs")]
37167                unknown => {
37168                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37169                    extra_attrs.insert(key, val.into_owned());
37170                }
37171                #[cfg(not(feature = "extra-attrs"))]
37172                _ => {}
37173            }
37174        }
37175
37176        if !is_empty {
37177            let mut buf = Vec::new();
37178            loop {
37179                match reader.read_event_into(&mut buf)? {
37180                    Event::End(_) => break,
37181                    Event::Eof => break,
37182                    _ => {}
37183                }
37184                buf.clear();
37185            }
37186        }
37187
37188        Ok(Self {
37189            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37190            #[cfg(feature = "extra-attrs")]
37191            extra_attrs,
37192        })
37193    }
37194}
37195
37196impl FromXml for IntProperty {
37197    fn from_xml<R: BufRead>(
37198        reader: &mut Reader<R>,
37199        start_tag: &BytesStart,
37200        is_empty: bool,
37201    ) -> Result<Self, ParseError> {
37202        let mut f_value: Option<i32> = None;
37203        #[cfg(feature = "extra-attrs")]
37204        let mut extra_attrs = std::collections::HashMap::new();
37205
37206        // Parse attributes
37207        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37208            let val = String::from_utf8_lossy(&attr.value);
37209            match attr.key.local_name().as_ref() {
37210                b"val" => {
37211                    f_value = val.parse().ok();
37212                }
37213                #[cfg(feature = "extra-attrs")]
37214                unknown => {
37215                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37216                    extra_attrs.insert(key, val.into_owned());
37217                }
37218                #[cfg(not(feature = "extra-attrs"))]
37219                _ => {}
37220            }
37221        }
37222
37223        if !is_empty {
37224            let mut buf = Vec::new();
37225            loop {
37226                match reader.read_event_into(&mut buf)? {
37227                    Event::End(_) => break,
37228                    Event::Eof => break,
37229                    _ => {}
37230                }
37231                buf.clear();
37232            }
37233        }
37234
37235        Ok(Self {
37236            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37237            #[cfg(feature = "extra-attrs")]
37238            extra_attrs,
37239        })
37240    }
37241}
37242
37243impl FromXml for FontName {
37244    fn from_xml<R: BufRead>(
37245        reader: &mut Reader<R>,
37246        start_tag: &BytesStart,
37247        is_empty: bool,
37248    ) -> Result<Self, ParseError> {
37249        let mut f_value: Option<XmlString> = None;
37250        #[cfg(feature = "extra-attrs")]
37251        let mut extra_attrs = std::collections::HashMap::new();
37252
37253        // Parse attributes
37254        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37255            let val = String::from_utf8_lossy(&attr.value);
37256            match attr.key.local_name().as_ref() {
37257                b"val" => {
37258                    f_value = Some(val.into_owned());
37259                }
37260                #[cfg(feature = "extra-attrs")]
37261                unknown => {
37262                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37263                    extra_attrs.insert(key, val.into_owned());
37264                }
37265                #[cfg(not(feature = "extra-attrs"))]
37266                _ => {}
37267            }
37268        }
37269
37270        if !is_empty {
37271            let mut buf = Vec::new();
37272            loop {
37273                match reader.read_event_into(&mut buf)? {
37274                    Event::End(_) => break,
37275                    Event::Eof => break,
37276                    _ => {}
37277                }
37278                buf.clear();
37279            }
37280        }
37281
37282        Ok(Self {
37283            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37284            #[cfg(feature = "extra-attrs")]
37285            extra_attrs,
37286        })
37287    }
37288}
37289
37290impl FromXml for VerticalAlignFontProperty {
37291    fn from_xml<R: BufRead>(
37292        reader: &mut Reader<R>,
37293        start_tag: &BytesStart,
37294        is_empty: bool,
37295    ) -> Result<Self, ParseError> {
37296        let mut f_value: Option<VerticalAlignRun> = None;
37297        #[cfg(feature = "extra-attrs")]
37298        let mut extra_attrs = std::collections::HashMap::new();
37299
37300        // Parse attributes
37301        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37302            let val = String::from_utf8_lossy(&attr.value);
37303            match attr.key.local_name().as_ref() {
37304                b"val" => {
37305                    f_value = val.parse().ok();
37306                }
37307                #[cfg(feature = "extra-attrs")]
37308                unknown => {
37309                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37310                    extra_attrs.insert(key, val.into_owned());
37311                }
37312                #[cfg(not(feature = "extra-attrs"))]
37313                _ => {}
37314            }
37315        }
37316
37317        if !is_empty {
37318            let mut buf = Vec::new();
37319            loop {
37320                match reader.read_event_into(&mut buf)? {
37321                    Event::End(_) => break,
37322                    Event::Eof => break,
37323                    _ => {}
37324                }
37325                buf.clear();
37326            }
37327        }
37328
37329        Ok(Self {
37330            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37331            #[cfg(feature = "extra-attrs")]
37332            extra_attrs,
37333        })
37334    }
37335}
37336
37337impl FromXml for FontSchemeProperty {
37338    fn from_xml<R: BufRead>(
37339        reader: &mut Reader<R>,
37340        start_tag: &BytesStart,
37341        is_empty: bool,
37342    ) -> Result<Self, ParseError> {
37343        let mut f_value: Option<FontScheme> = None;
37344        #[cfg(feature = "extra-attrs")]
37345        let mut extra_attrs = std::collections::HashMap::new();
37346
37347        // Parse attributes
37348        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37349            let val = String::from_utf8_lossy(&attr.value);
37350            match attr.key.local_name().as_ref() {
37351                b"val" => {
37352                    f_value = val.parse().ok();
37353                }
37354                #[cfg(feature = "extra-attrs")]
37355                unknown => {
37356                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37357                    extra_attrs.insert(key, val.into_owned());
37358                }
37359                #[cfg(not(feature = "extra-attrs"))]
37360                _ => {}
37361            }
37362        }
37363
37364        if !is_empty {
37365            let mut buf = Vec::new();
37366            loop {
37367                match reader.read_event_into(&mut buf)? {
37368                    Event::End(_) => break,
37369                    Event::Eof => break,
37370                    _ => {}
37371                }
37372                buf.clear();
37373            }
37374        }
37375
37376        Ok(Self {
37377            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37378            #[cfg(feature = "extra-attrs")]
37379            extra_attrs,
37380        })
37381    }
37382}
37383
37384impl FromXml for UnderlineProperty {
37385    fn from_xml<R: BufRead>(
37386        reader: &mut Reader<R>,
37387        start_tag: &BytesStart,
37388        is_empty: bool,
37389    ) -> Result<Self, ParseError> {
37390        let mut f_value = None;
37391        #[cfg(feature = "extra-attrs")]
37392        let mut extra_attrs = std::collections::HashMap::new();
37393
37394        // Parse attributes
37395        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37396            let val = String::from_utf8_lossy(&attr.value);
37397            match attr.key.local_name().as_ref() {
37398                b"val" => {
37399                    f_value = val.parse().ok();
37400                }
37401                #[cfg(feature = "extra-attrs")]
37402                unknown => {
37403                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37404                    extra_attrs.insert(key, val.into_owned());
37405                }
37406                #[cfg(not(feature = "extra-attrs"))]
37407                _ => {}
37408            }
37409        }
37410
37411        if !is_empty {
37412            let mut buf = Vec::new();
37413            loop {
37414                match reader.read_event_into(&mut buf)? {
37415                    Event::End(_) => break,
37416                    Event::Eof => break,
37417                    _ => {}
37418                }
37419                buf.clear();
37420            }
37421        }
37422
37423        Ok(Self {
37424            value: f_value,
37425            #[cfg(feature = "extra-attrs")]
37426            extra_attrs,
37427        })
37428    }
37429}
37430
37431impl FromXml for Font {
37432    fn from_xml<R: BufRead>(
37433        reader: &mut Reader<R>,
37434        start_tag: &BytesStart,
37435        is_empty: bool,
37436    ) -> Result<Self, ParseError> {
37437        #[cfg(feature = "sml-styling")]
37438        let mut f_name = None;
37439        #[cfg(feature = "sml-styling")]
37440        let mut f_charset = None;
37441        #[cfg(feature = "sml-styling")]
37442        let mut f_family = None;
37443        #[cfg(feature = "sml-styling")]
37444        let mut f_b = None;
37445        #[cfg(feature = "sml-styling")]
37446        let mut f_i = None;
37447        #[cfg(feature = "sml-styling")]
37448        let mut f_strike = None;
37449        #[cfg(feature = "sml-styling")]
37450        let mut f_outline = None;
37451        #[cfg(feature = "sml-styling")]
37452        let mut f_shadow = None;
37453        #[cfg(feature = "sml-styling")]
37454        let mut f_condense = None;
37455        #[cfg(feature = "sml-styling")]
37456        let mut f_extend = None;
37457        #[cfg(feature = "sml-styling")]
37458        let mut f_color = None;
37459        #[cfg(feature = "sml-styling")]
37460        let mut f_sz = None;
37461        #[cfg(feature = "sml-styling")]
37462        let mut f_u = None;
37463        #[cfg(feature = "sml-styling")]
37464        let mut f_vert_align = None;
37465        #[cfg(feature = "sml-styling")]
37466        let mut f_scheme = None;
37467        #[cfg(feature = "extra-children")]
37468        let mut extra_children = Vec::new();
37469        #[cfg(feature = "extra-children")]
37470        let mut child_idx: usize = 0;
37471
37472        // Parse child elements
37473        if !is_empty {
37474            let mut buf = Vec::new();
37475            loop {
37476                match reader.read_event_into(&mut buf)? {
37477                    Event::Start(e) => {
37478                        match e.local_name().as_ref() {
37479                            #[cfg(feature = "sml-styling")]
37480                            b"name" => {
37481                                f_name = Some(Box::new(FontName::from_xml(reader, &e, false)?));
37482                                #[cfg(feature = "extra-children")]
37483                                {
37484                                    child_idx += 1;
37485                                }
37486                            }
37487                            #[cfg(feature = "sml-styling")]
37488                            b"charset" => {
37489                                f_charset =
37490                                    Some(Box::new(IntProperty::from_xml(reader, &e, false)?));
37491                                #[cfg(feature = "extra-children")]
37492                                {
37493                                    child_idx += 1;
37494                                }
37495                            }
37496                            #[cfg(feature = "sml-styling")]
37497                            b"family" => {
37498                                f_family = Some(Box::new(FontFamily::from_xml(reader, &e, false)?));
37499                                #[cfg(feature = "extra-children")]
37500                                {
37501                                    child_idx += 1;
37502                                }
37503                            }
37504                            #[cfg(feature = "sml-styling")]
37505                            b"b" => {
37506                                f_b = Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37507                                #[cfg(feature = "extra-children")]
37508                                {
37509                                    child_idx += 1;
37510                                }
37511                            }
37512                            #[cfg(feature = "sml-styling")]
37513                            b"i" => {
37514                                f_i = Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37515                                #[cfg(feature = "extra-children")]
37516                                {
37517                                    child_idx += 1;
37518                                }
37519                            }
37520                            #[cfg(feature = "sml-styling")]
37521                            b"strike" => {
37522                                f_strike =
37523                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37524                                #[cfg(feature = "extra-children")]
37525                                {
37526                                    child_idx += 1;
37527                                }
37528                            }
37529                            #[cfg(feature = "sml-styling")]
37530                            b"outline" => {
37531                                f_outline =
37532                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37533                                #[cfg(feature = "extra-children")]
37534                                {
37535                                    child_idx += 1;
37536                                }
37537                            }
37538                            #[cfg(feature = "sml-styling")]
37539                            b"shadow" => {
37540                                f_shadow =
37541                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37542                                #[cfg(feature = "extra-children")]
37543                                {
37544                                    child_idx += 1;
37545                                }
37546                            }
37547                            #[cfg(feature = "sml-styling")]
37548                            b"condense" => {
37549                                f_condense =
37550                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37551                                #[cfg(feature = "extra-children")]
37552                                {
37553                                    child_idx += 1;
37554                                }
37555                            }
37556                            #[cfg(feature = "sml-styling")]
37557                            b"extend" => {
37558                                f_extend =
37559                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, false)?));
37560                                #[cfg(feature = "extra-children")]
37561                                {
37562                                    child_idx += 1;
37563                                }
37564                            }
37565                            #[cfg(feature = "sml-styling")]
37566                            b"color" => {
37567                                f_color = Some(Box::new(Color::from_xml(reader, &e, false)?));
37568                                #[cfg(feature = "extra-children")]
37569                                {
37570                                    child_idx += 1;
37571                                }
37572                            }
37573                            #[cfg(feature = "sml-styling")]
37574                            b"sz" => {
37575                                f_sz = Some(Box::new(FontSize::from_xml(reader, &e, false)?));
37576                                #[cfg(feature = "extra-children")]
37577                                {
37578                                    child_idx += 1;
37579                                }
37580                            }
37581                            #[cfg(feature = "sml-styling")]
37582                            b"u" => {
37583                                f_u =
37584                                    Some(Box::new(UnderlineProperty::from_xml(reader, &e, false)?));
37585                                #[cfg(feature = "extra-children")]
37586                                {
37587                                    child_idx += 1;
37588                                }
37589                            }
37590                            #[cfg(feature = "sml-styling")]
37591                            b"vertAlign" => {
37592                                f_vert_align = Some(Box::new(VerticalAlignFontProperty::from_xml(
37593                                    reader, &e, false,
37594                                )?));
37595                                #[cfg(feature = "extra-children")]
37596                                {
37597                                    child_idx += 1;
37598                                }
37599                            }
37600                            #[cfg(feature = "sml-styling")]
37601                            b"scheme" => {
37602                                f_scheme = Some(Box::new(FontSchemeProperty::from_xml(
37603                                    reader, &e, false,
37604                                )?));
37605                                #[cfg(feature = "extra-children")]
37606                                {
37607                                    child_idx += 1;
37608                                }
37609                            }
37610                            #[cfg(feature = "extra-children")]
37611                            _ => {
37612                                // Capture unknown element for roundtrip
37613                                let elem = RawXmlElement::from_reader(reader, &e)?;
37614                                extra_children.push(PositionedNode::new(
37615                                    child_idx,
37616                                    RawXmlNode::Element(elem),
37617                                ));
37618                                child_idx += 1;
37619                            }
37620                            #[cfg(not(feature = "extra-children"))]
37621                            _ => {
37622                                // Skip unknown element
37623                                skip_element(reader)?;
37624                            }
37625                        }
37626                    }
37627                    Event::Empty(e) => {
37628                        match e.local_name().as_ref() {
37629                            #[cfg(feature = "sml-styling")]
37630                            b"name" => {
37631                                f_name = Some(Box::new(FontName::from_xml(reader, &e, true)?));
37632                                #[cfg(feature = "extra-children")]
37633                                {
37634                                    child_idx += 1;
37635                                }
37636                            }
37637                            #[cfg(feature = "sml-styling")]
37638                            b"charset" => {
37639                                f_charset =
37640                                    Some(Box::new(IntProperty::from_xml(reader, &e, true)?));
37641                                #[cfg(feature = "extra-children")]
37642                                {
37643                                    child_idx += 1;
37644                                }
37645                            }
37646                            #[cfg(feature = "sml-styling")]
37647                            b"family" => {
37648                                f_family = Some(Box::new(FontFamily::from_xml(reader, &e, true)?));
37649                                #[cfg(feature = "extra-children")]
37650                                {
37651                                    child_idx += 1;
37652                                }
37653                            }
37654                            #[cfg(feature = "sml-styling")]
37655                            b"b" => {
37656                                f_b = Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37657                                #[cfg(feature = "extra-children")]
37658                                {
37659                                    child_idx += 1;
37660                                }
37661                            }
37662                            #[cfg(feature = "sml-styling")]
37663                            b"i" => {
37664                                f_i = Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37665                                #[cfg(feature = "extra-children")]
37666                                {
37667                                    child_idx += 1;
37668                                }
37669                            }
37670                            #[cfg(feature = "sml-styling")]
37671                            b"strike" => {
37672                                f_strike =
37673                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37674                                #[cfg(feature = "extra-children")]
37675                                {
37676                                    child_idx += 1;
37677                                }
37678                            }
37679                            #[cfg(feature = "sml-styling")]
37680                            b"outline" => {
37681                                f_outline =
37682                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37683                                #[cfg(feature = "extra-children")]
37684                                {
37685                                    child_idx += 1;
37686                                }
37687                            }
37688                            #[cfg(feature = "sml-styling")]
37689                            b"shadow" => {
37690                                f_shadow =
37691                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37692                                #[cfg(feature = "extra-children")]
37693                                {
37694                                    child_idx += 1;
37695                                }
37696                            }
37697                            #[cfg(feature = "sml-styling")]
37698                            b"condense" => {
37699                                f_condense =
37700                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37701                                #[cfg(feature = "extra-children")]
37702                                {
37703                                    child_idx += 1;
37704                                }
37705                            }
37706                            #[cfg(feature = "sml-styling")]
37707                            b"extend" => {
37708                                f_extend =
37709                                    Some(Box::new(BooleanProperty::from_xml(reader, &e, true)?));
37710                                #[cfg(feature = "extra-children")]
37711                                {
37712                                    child_idx += 1;
37713                                }
37714                            }
37715                            #[cfg(feature = "sml-styling")]
37716                            b"color" => {
37717                                f_color = Some(Box::new(Color::from_xml(reader, &e, true)?));
37718                                #[cfg(feature = "extra-children")]
37719                                {
37720                                    child_idx += 1;
37721                                }
37722                            }
37723                            #[cfg(feature = "sml-styling")]
37724                            b"sz" => {
37725                                f_sz = Some(Box::new(FontSize::from_xml(reader, &e, true)?));
37726                                #[cfg(feature = "extra-children")]
37727                                {
37728                                    child_idx += 1;
37729                                }
37730                            }
37731                            #[cfg(feature = "sml-styling")]
37732                            b"u" => {
37733                                f_u =
37734                                    Some(Box::new(UnderlineProperty::from_xml(reader, &e, true)?));
37735                                #[cfg(feature = "extra-children")]
37736                                {
37737                                    child_idx += 1;
37738                                }
37739                            }
37740                            #[cfg(feature = "sml-styling")]
37741                            b"vertAlign" => {
37742                                f_vert_align = Some(Box::new(VerticalAlignFontProperty::from_xml(
37743                                    reader, &e, true,
37744                                )?));
37745                                #[cfg(feature = "extra-children")]
37746                                {
37747                                    child_idx += 1;
37748                                }
37749                            }
37750                            #[cfg(feature = "sml-styling")]
37751                            b"scheme" => {
37752                                f_scheme =
37753                                    Some(Box::new(FontSchemeProperty::from_xml(reader, &e, true)?));
37754                                #[cfg(feature = "extra-children")]
37755                                {
37756                                    child_idx += 1;
37757                                }
37758                            }
37759                            #[cfg(feature = "extra-children")]
37760                            _ => {
37761                                // Capture unknown empty element for roundtrip
37762                                let elem = RawXmlElement::from_empty(&e);
37763                                extra_children.push(PositionedNode::new(
37764                                    child_idx,
37765                                    RawXmlNode::Element(elem),
37766                                ));
37767                                child_idx += 1;
37768                            }
37769                            #[cfg(not(feature = "extra-children"))]
37770                            _ => {}
37771                        }
37772                    }
37773                    Event::End(_) => break,
37774                    Event::Eof => break,
37775                    _ => {}
37776                }
37777                buf.clear();
37778            }
37779        }
37780
37781        Ok(Self {
37782            #[cfg(feature = "sml-styling")]
37783            name: f_name,
37784            #[cfg(feature = "sml-styling")]
37785            charset: f_charset,
37786            #[cfg(feature = "sml-styling")]
37787            family: f_family,
37788            #[cfg(feature = "sml-styling")]
37789            b: f_b,
37790            #[cfg(feature = "sml-styling")]
37791            i: f_i,
37792            #[cfg(feature = "sml-styling")]
37793            strike: f_strike,
37794            #[cfg(feature = "sml-styling")]
37795            outline: f_outline,
37796            #[cfg(feature = "sml-styling")]
37797            shadow: f_shadow,
37798            #[cfg(feature = "sml-styling")]
37799            condense: f_condense,
37800            #[cfg(feature = "sml-styling")]
37801            extend: f_extend,
37802            #[cfg(feature = "sml-styling")]
37803            color: f_color,
37804            #[cfg(feature = "sml-styling")]
37805            sz: f_sz,
37806            #[cfg(feature = "sml-styling")]
37807            u: f_u,
37808            #[cfg(feature = "sml-styling")]
37809            vert_align: f_vert_align,
37810            #[cfg(feature = "sml-styling")]
37811            scheme: f_scheme,
37812            #[cfg(feature = "extra-children")]
37813            extra_children,
37814        })
37815    }
37816}
37817
37818impl FromXml for FontFamily {
37819    fn from_xml<R: BufRead>(
37820        reader: &mut Reader<R>,
37821        start_tag: &BytesStart,
37822        is_empty: bool,
37823    ) -> Result<Self, ParseError> {
37824        let mut f_value: Option<STFontFamily> = None;
37825        #[cfg(feature = "extra-attrs")]
37826        let mut extra_attrs = std::collections::HashMap::new();
37827
37828        // Parse attributes
37829        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37830            let val = String::from_utf8_lossy(&attr.value);
37831            match attr.key.local_name().as_ref() {
37832                b"val" => {
37833                    f_value = val.parse().ok();
37834                }
37835                #[cfg(feature = "extra-attrs")]
37836                unknown => {
37837                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37838                    extra_attrs.insert(key, val.into_owned());
37839                }
37840                #[cfg(not(feature = "extra-attrs"))]
37841                _ => {}
37842            }
37843        }
37844
37845        if !is_empty {
37846            let mut buf = Vec::new();
37847            loop {
37848                match reader.read_event_into(&mut buf)? {
37849                    Event::End(_) => break,
37850                    Event::Eof => break,
37851                    _ => {}
37852                }
37853                buf.clear();
37854            }
37855        }
37856
37857        Ok(Self {
37858            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
37859            #[cfg(feature = "extra-attrs")]
37860            extra_attrs,
37861        })
37862    }
37863}
37864
37865impl FromXml for SmlAGAutoFormat {
37866    fn from_xml<R: BufRead>(
37867        reader: &mut Reader<R>,
37868        start_tag: &BytesStart,
37869        is_empty: bool,
37870    ) -> Result<Self, ParseError> {
37871        let mut f_auto_format_id = None;
37872        let mut f_apply_number_formats = None;
37873        let mut f_apply_border_formats = None;
37874        let mut f_apply_font_formats = None;
37875        let mut f_apply_pattern_formats = None;
37876        let mut f_apply_alignment_formats = None;
37877        let mut f_apply_width_height_formats = None;
37878        #[cfg(feature = "extra-attrs")]
37879        let mut extra_attrs = std::collections::HashMap::new();
37880
37881        // Parse attributes
37882        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
37883            let val = String::from_utf8_lossy(&attr.value);
37884            match attr.key.local_name().as_ref() {
37885                b"autoFormatId" => {
37886                    f_auto_format_id = val.parse().ok();
37887                }
37888                b"applyNumberFormats" => {
37889                    f_apply_number_formats = Some(val == "true" || val == "1");
37890                }
37891                b"applyBorderFormats" => {
37892                    f_apply_border_formats = Some(val == "true" || val == "1");
37893                }
37894                b"applyFontFormats" => {
37895                    f_apply_font_formats = Some(val == "true" || val == "1");
37896                }
37897                b"applyPatternFormats" => {
37898                    f_apply_pattern_formats = Some(val == "true" || val == "1");
37899                }
37900                b"applyAlignmentFormats" => {
37901                    f_apply_alignment_formats = Some(val == "true" || val == "1");
37902                }
37903                b"applyWidthHeightFormats" => {
37904                    f_apply_width_height_formats = Some(val == "true" || val == "1");
37905                }
37906                #[cfg(feature = "extra-attrs")]
37907                unknown => {
37908                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
37909                    extra_attrs.insert(key, val.into_owned());
37910                }
37911                #[cfg(not(feature = "extra-attrs"))]
37912                _ => {}
37913            }
37914        }
37915
37916        if !is_empty {
37917            let mut buf = Vec::new();
37918            loop {
37919                match reader.read_event_into(&mut buf)? {
37920                    Event::End(_) => break,
37921                    Event::Eof => break,
37922                    _ => {}
37923                }
37924                buf.clear();
37925            }
37926        }
37927
37928        Ok(Self {
37929            auto_format_id: f_auto_format_id,
37930            apply_number_formats: f_apply_number_formats,
37931            apply_border_formats: f_apply_border_formats,
37932            apply_font_formats: f_apply_font_formats,
37933            apply_pattern_formats: f_apply_pattern_formats,
37934            apply_alignment_formats: f_apply_alignment_formats,
37935            apply_width_height_formats: f_apply_width_height_formats,
37936            #[cfg(feature = "extra-attrs")]
37937            extra_attrs,
37938        })
37939    }
37940}
37941
37942impl FromXml for ExternalLink {
37943    fn from_xml<R: BufRead>(
37944        reader: &mut Reader<R>,
37945        start_tag: &BytesStart,
37946        is_empty: bool,
37947    ) -> Result<Self, ParseError> {
37948        let mut f_external_book = None;
37949        let mut f_dde_link = None;
37950        let mut f_ole_link = None;
37951        let mut f_extension_list = None;
37952        #[cfg(feature = "extra-children")]
37953        let mut extra_children = Vec::new();
37954        #[cfg(feature = "extra-children")]
37955        let mut child_idx: usize = 0;
37956
37957        // Parse child elements
37958        if !is_empty {
37959            let mut buf = Vec::new();
37960            loop {
37961                match reader.read_event_into(&mut buf)? {
37962                    Event::Start(e) => {
37963                        match e.local_name().as_ref() {
37964                            b"externalBook" => {
37965                                f_external_book =
37966                                    Some(Box::new(ExternalBook::from_xml(reader, &e, false)?));
37967                                #[cfg(feature = "extra-children")]
37968                                {
37969                                    child_idx += 1;
37970                                }
37971                            }
37972                            b"ddeLink" => {
37973                                f_dde_link = Some(Box::new(DdeLink::from_xml(reader, &e, false)?));
37974                                #[cfg(feature = "extra-children")]
37975                                {
37976                                    child_idx += 1;
37977                                }
37978                            }
37979                            b"oleLink" => {
37980                                f_ole_link = Some(Box::new(OleLink::from_xml(reader, &e, false)?));
37981                                #[cfg(feature = "extra-children")]
37982                                {
37983                                    child_idx += 1;
37984                                }
37985                            }
37986                            b"extLst" => {
37987                                f_extension_list =
37988                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
37989                                #[cfg(feature = "extra-children")]
37990                                {
37991                                    child_idx += 1;
37992                                }
37993                            }
37994                            #[cfg(feature = "extra-children")]
37995                            _ => {
37996                                // Capture unknown element for roundtrip
37997                                let elem = RawXmlElement::from_reader(reader, &e)?;
37998                                extra_children.push(PositionedNode::new(
37999                                    child_idx,
38000                                    RawXmlNode::Element(elem),
38001                                ));
38002                                child_idx += 1;
38003                            }
38004                            #[cfg(not(feature = "extra-children"))]
38005                            _ => {
38006                                // Skip unknown element
38007                                skip_element(reader)?;
38008                            }
38009                        }
38010                    }
38011                    Event::Empty(e) => {
38012                        match e.local_name().as_ref() {
38013                            b"externalBook" => {
38014                                f_external_book =
38015                                    Some(Box::new(ExternalBook::from_xml(reader, &e, true)?));
38016                                #[cfg(feature = "extra-children")]
38017                                {
38018                                    child_idx += 1;
38019                                }
38020                            }
38021                            b"ddeLink" => {
38022                                f_dde_link = Some(Box::new(DdeLink::from_xml(reader, &e, true)?));
38023                                #[cfg(feature = "extra-children")]
38024                                {
38025                                    child_idx += 1;
38026                                }
38027                            }
38028                            b"oleLink" => {
38029                                f_ole_link = Some(Box::new(OleLink::from_xml(reader, &e, true)?));
38030                                #[cfg(feature = "extra-children")]
38031                                {
38032                                    child_idx += 1;
38033                                }
38034                            }
38035                            b"extLst" => {
38036                                f_extension_list =
38037                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
38038                                #[cfg(feature = "extra-children")]
38039                                {
38040                                    child_idx += 1;
38041                                }
38042                            }
38043                            #[cfg(feature = "extra-children")]
38044                            _ => {
38045                                // Capture unknown empty element for roundtrip
38046                                let elem = RawXmlElement::from_empty(&e);
38047                                extra_children.push(PositionedNode::new(
38048                                    child_idx,
38049                                    RawXmlNode::Element(elem),
38050                                ));
38051                                child_idx += 1;
38052                            }
38053                            #[cfg(not(feature = "extra-children"))]
38054                            _ => {}
38055                        }
38056                    }
38057                    Event::End(_) => break,
38058                    Event::Eof => break,
38059                    _ => {}
38060                }
38061                buf.clear();
38062            }
38063        }
38064
38065        Ok(Self {
38066            external_book: f_external_book,
38067            dde_link: f_dde_link,
38068            ole_link: f_ole_link,
38069            extension_list: f_extension_list,
38070            #[cfg(feature = "extra-children")]
38071            extra_children,
38072        })
38073    }
38074}
38075
38076impl FromXml for ExternalBook {
38077    fn from_xml<R: BufRead>(
38078        reader: &mut Reader<R>,
38079        start_tag: &BytesStart,
38080        is_empty: bool,
38081    ) -> Result<Self, ParseError> {
38082        let mut f_id: Option<STRelationshipId> = None;
38083        let mut f_sheet_names = None;
38084        let mut f_defined_names = None;
38085        let mut f_sheet_data_set = None;
38086        #[cfg(feature = "extra-attrs")]
38087        let mut extra_attrs = std::collections::HashMap::new();
38088        #[cfg(feature = "extra-children")]
38089        let mut extra_children = Vec::new();
38090        #[cfg(feature = "extra-children")]
38091        let mut child_idx: usize = 0;
38092
38093        // Parse attributes
38094        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38095            let val = String::from_utf8_lossy(&attr.value);
38096            match attr.key.local_name().as_ref() {
38097                b"id" => {
38098                    f_id = Some(val.into_owned());
38099                }
38100                #[cfg(feature = "extra-attrs")]
38101                unknown => {
38102                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38103                    extra_attrs.insert(key, val.into_owned());
38104                }
38105                #[cfg(not(feature = "extra-attrs"))]
38106                _ => {}
38107            }
38108        }
38109
38110        // Parse child elements
38111        if !is_empty {
38112            let mut buf = Vec::new();
38113            loop {
38114                match reader.read_event_into(&mut buf)? {
38115                    Event::Start(e) => {
38116                        match e.local_name().as_ref() {
38117                            b"sheetNames" => {
38118                                f_sheet_names = Some(Box::new(CTExternalSheetNames::from_xml(
38119                                    reader, &e, false,
38120                                )?));
38121                                #[cfg(feature = "extra-children")]
38122                                {
38123                                    child_idx += 1;
38124                                }
38125                            }
38126                            b"definedNames" => {
38127                                f_defined_names = Some(Box::new(CTExternalDefinedNames::from_xml(
38128                                    reader, &e, false,
38129                                )?));
38130                                #[cfg(feature = "extra-children")]
38131                                {
38132                                    child_idx += 1;
38133                                }
38134                            }
38135                            b"sheetDataSet" => {
38136                                f_sheet_data_set = Some(Box::new(ExternalSheetDataSet::from_xml(
38137                                    reader, &e, false,
38138                                )?));
38139                                #[cfg(feature = "extra-children")]
38140                                {
38141                                    child_idx += 1;
38142                                }
38143                            }
38144                            #[cfg(feature = "extra-children")]
38145                            _ => {
38146                                // Capture unknown element for roundtrip
38147                                let elem = RawXmlElement::from_reader(reader, &e)?;
38148                                extra_children.push(PositionedNode::new(
38149                                    child_idx,
38150                                    RawXmlNode::Element(elem),
38151                                ));
38152                                child_idx += 1;
38153                            }
38154                            #[cfg(not(feature = "extra-children"))]
38155                            _ => {
38156                                // Skip unknown element
38157                                skip_element(reader)?;
38158                            }
38159                        }
38160                    }
38161                    Event::Empty(e) => {
38162                        match e.local_name().as_ref() {
38163                            b"sheetNames" => {
38164                                f_sheet_names = Some(Box::new(CTExternalSheetNames::from_xml(
38165                                    reader, &e, true,
38166                                )?));
38167                                #[cfg(feature = "extra-children")]
38168                                {
38169                                    child_idx += 1;
38170                                }
38171                            }
38172                            b"definedNames" => {
38173                                f_defined_names = Some(Box::new(CTExternalDefinedNames::from_xml(
38174                                    reader, &e, true,
38175                                )?));
38176                                #[cfg(feature = "extra-children")]
38177                                {
38178                                    child_idx += 1;
38179                                }
38180                            }
38181                            b"sheetDataSet" => {
38182                                f_sheet_data_set = Some(Box::new(ExternalSheetDataSet::from_xml(
38183                                    reader, &e, true,
38184                                )?));
38185                                #[cfg(feature = "extra-children")]
38186                                {
38187                                    child_idx += 1;
38188                                }
38189                            }
38190                            #[cfg(feature = "extra-children")]
38191                            _ => {
38192                                // Capture unknown empty element for roundtrip
38193                                let elem = RawXmlElement::from_empty(&e);
38194                                extra_children.push(PositionedNode::new(
38195                                    child_idx,
38196                                    RawXmlNode::Element(elem),
38197                                ));
38198                                child_idx += 1;
38199                            }
38200                            #[cfg(not(feature = "extra-children"))]
38201                            _ => {}
38202                        }
38203                    }
38204                    Event::End(_) => break,
38205                    Event::Eof => break,
38206                    _ => {}
38207                }
38208                buf.clear();
38209            }
38210        }
38211
38212        Ok(Self {
38213            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
38214            sheet_names: f_sheet_names,
38215            defined_names: f_defined_names,
38216            sheet_data_set: f_sheet_data_set,
38217            #[cfg(feature = "extra-attrs")]
38218            extra_attrs,
38219            #[cfg(feature = "extra-children")]
38220            extra_children,
38221        })
38222    }
38223}
38224
38225impl FromXml for CTExternalSheetNames {
38226    fn from_xml<R: BufRead>(
38227        reader: &mut Reader<R>,
38228        start_tag: &BytesStart,
38229        is_empty: bool,
38230    ) -> Result<Self, ParseError> {
38231        let mut f_sheet_name = Vec::new();
38232        #[cfg(feature = "extra-children")]
38233        let mut extra_children = Vec::new();
38234        #[cfg(feature = "extra-children")]
38235        let mut child_idx: usize = 0;
38236
38237        // Parse child elements
38238        if !is_empty {
38239            let mut buf = Vec::new();
38240            loop {
38241                match reader.read_event_into(&mut buf)? {
38242                    Event::Start(e) => {
38243                        match e.local_name().as_ref() {
38244                            b"sheetName" => {
38245                                f_sheet_name
38246                                    .push(CTExternalSheetName::from_xml(reader, &e, false)?);
38247                                #[cfg(feature = "extra-children")]
38248                                {
38249                                    child_idx += 1;
38250                                }
38251                            }
38252                            #[cfg(feature = "extra-children")]
38253                            _ => {
38254                                // Capture unknown element for roundtrip
38255                                let elem = RawXmlElement::from_reader(reader, &e)?;
38256                                extra_children.push(PositionedNode::new(
38257                                    child_idx,
38258                                    RawXmlNode::Element(elem),
38259                                ));
38260                                child_idx += 1;
38261                            }
38262                            #[cfg(not(feature = "extra-children"))]
38263                            _ => {
38264                                // Skip unknown element
38265                                skip_element(reader)?;
38266                            }
38267                        }
38268                    }
38269                    Event::Empty(e) => {
38270                        match e.local_name().as_ref() {
38271                            b"sheetName" => {
38272                                f_sheet_name.push(CTExternalSheetName::from_xml(reader, &e, true)?);
38273                                #[cfg(feature = "extra-children")]
38274                                {
38275                                    child_idx += 1;
38276                                }
38277                            }
38278                            #[cfg(feature = "extra-children")]
38279                            _ => {
38280                                // Capture unknown empty element for roundtrip
38281                                let elem = RawXmlElement::from_empty(&e);
38282                                extra_children.push(PositionedNode::new(
38283                                    child_idx,
38284                                    RawXmlNode::Element(elem),
38285                                ));
38286                                child_idx += 1;
38287                            }
38288                            #[cfg(not(feature = "extra-children"))]
38289                            _ => {}
38290                        }
38291                    }
38292                    Event::End(_) => break,
38293                    Event::Eof => break,
38294                    _ => {}
38295                }
38296                buf.clear();
38297            }
38298        }
38299
38300        Ok(Self {
38301            sheet_name: f_sheet_name,
38302            #[cfg(feature = "extra-children")]
38303            extra_children,
38304        })
38305    }
38306}
38307
38308impl FromXml for CTExternalSheetName {
38309    fn from_xml<R: BufRead>(
38310        reader: &mut Reader<R>,
38311        start_tag: &BytesStart,
38312        is_empty: bool,
38313    ) -> Result<Self, ParseError> {
38314        let mut f_value = None;
38315        #[cfg(feature = "extra-attrs")]
38316        let mut extra_attrs = std::collections::HashMap::new();
38317
38318        // Parse attributes
38319        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38320            let val = String::from_utf8_lossy(&attr.value);
38321            match attr.key.local_name().as_ref() {
38322                b"val" => {
38323                    f_value = Some(val.into_owned());
38324                }
38325                #[cfg(feature = "extra-attrs")]
38326                unknown => {
38327                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38328                    extra_attrs.insert(key, val.into_owned());
38329                }
38330                #[cfg(not(feature = "extra-attrs"))]
38331                _ => {}
38332            }
38333        }
38334
38335        if !is_empty {
38336            let mut buf = Vec::new();
38337            loop {
38338                match reader.read_event_into(&mut buf)? {
38339                    Event::End(_) => break,
38340                    Event::Eof => break,
38341                    _ => {}
38342                }
38343                buf.clear();
38344            }
38345        }
38346
38347        Ok(Self {
38348            value: f_value,
38349            #[cfg(feature = "extra-attrs")]
38350            extra_attrs,
38351        })
38352    }
38353}
38354
38355impl FromXml for CTExternalDefinedNames {
38356    fn from_xml<R: BufRead>(
38357        reader: &mut Reader<R>,
38358        start_tag: &BytesStart,
38359        is_empty: bool,
38360    ) -> Result<Self, ParseError> {
38361        let mut f_defined_name = Vec::new();
38362        #[cfg(feature = "extra-children")]
38363        let mut extra_children = Vec::new();
38364        #[cfg(feature = "extra-children")]
38365        let mut child_idx: usize = 0;
38366
38367        // Parse child elements
38368        if !is_empty {
38369            let mut buf = Vec::new();
38370            loop {
38371                match reader.read_event_into(&mut buf)? {
38372                    Event::Start(e) => {
38373                        match e.local_name().as_ref() {
38374                            b"definedName" => {
38375                                f_defined_name
38376                                    .push(CTExternalDefinedName::from_xml(reader, &e, false)?);
38377                                #[cfg(feature = "extra-children")]
38378                                {
38379                                    child_idx += 1;
38380                                }
38381                            }
38382                            #[cfg(feature = "extra-children")]
38383                            _ => {
38384                                // Capture unknown element for roundtrip
38385                                let elem = RawXmlElement::from_reader(reader, &e)?;
38386                                extra_children.push(PositionedNode::new(
38387                                    child_idx,
38388                                    RawXmlNode::Element(elem),
38389                                ));
38390                                child_idx += 1;
38391                            }
38392                            #[cfg(not(feature = "extra-children"))]
38393                            _ => {
38394                                // Skip unknown element
38395                                skip_element(reader)?;
38396                            }
38397                        }
38398                    }
38399                    Event::Empty(e) => {
38400                        match e.local_name().as_ref() {
38401                            b"definedName" => {
38402                                f_defined_name
38403                                    .push(CTExternalDefinedName::from_xml(reader, &e, true)?);
38404                                #[cfg(feature = "extra-children")]
38405                                {
38406                                    child_idx += 1;
38407                                }
38408                            }
38409                            #[cfg(feature = "extra-children")]
38410                            _ => {
38411                                // Capture unknown empty element for roundtrip
38412                                let elem = RawXmlElement::from_empty(&e);
38413                                extra_children.push(PositionedNode::new(
38414                                    child_idx,
38415                                    RawXmlNode::Element(elem),
38416                                ));
38417                                child_idx += 1;
38418                            }
38419                            #[cfg(not(feature = "extra-children"))]
38420                            _ => {}
38421                        }
38422                    }
38423                    Event::End(_) => break,
38424                    Event::Eof => break,
38425                    _ => {}
38426                }
38427                buf.clear();
38428            }
38429        }
38430
38431        Ok(Self {
38432            defined_name: f_defined_name,
38433            #[cfg(feature = "extra-children")]
38434            extra_children,
38435        })
38436    }
38437}
38438
38439impl FromXml for CTExternalDefinedName {
38440    fn from_xml<R: BufRead>(
38441        reader: &mut Reader<R>,
38442        start_tag: &BytesStart,
38443        is_empty: bool,
38444    ) -> Result<Self, ParseError> {
38445        let mut f_name: Option<XmlString> = None;
38446        let mut f_refers_to = None;
38447        let mut f_sheet_id = None;
38448        #[cfg(feature = "extra-attrs")]
38449        let mut extra_attrs = std::collections::HashMap::new();
38450
38451        // Parse attributes
38452        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38453            let val = String::from_utf8_lossy(&attr.value);
38454            match attr.key.local_name().as_ref() {
38455                b"name" => {
38456                    f_name = Some(val.into_owned());
38457                }
38458                b"refersTo" => {
38459                    f_refers_to = Some(val.into_owned());
38460                }
38461                b"sheetId" => {
38462                    f_sheet_id = val.parse().ok();
38463                }
38464                #[cfg(feature = "extra-attrs")]
38465                unknown => {
38466                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38467                    extra_attrs.insert(key, val.into_owned());
38468                }
38469                #[cfg(not(feature = "extra-attrs"))]
38470                _ => {}
38471            }
38472        }
38473
38474        if !is_empty {
38475            let mut buf = Vec::new();
38476            loop {
38477                match reader.read_event_into(&mut buf)? {
38478                    Event::End(_) => break,
38479                    Event::Eof => break,
38480                    _ => {}
38481                }
38482                buf.clear();
38483            }
38484        }
38485
38486        Ok(Self {
38487            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
38488            refers_to: f_refers_to,
38489            sheet_id: f_sheet_id,
38490            #[cfg(feature = "extra-attrs")]
38491            extra_attrs,
38492        })
38493    }
38494}
38495
38496impl FromXml for ExternalSheetDataSet {
38497    fn from_xml<R: BufRead>(
38498        reader: &mut Reader<R>,
38499        start_tag: &BytesStart,
38500        is_empty: bool,
38501    ) -> Result<Self, ParseError> {
38502        let mut f_sheet_data = Vec::new();
38503        #[cfg(feature = "extra-children")]
38504        let mut extra_children = Vec::new();
38505        #[cfg(feature = "extra-children")]
38506        let mut child_idx: usize = 0;
38507
38508        // Parse child elements
38509        if !is_empty {
38510            let mut buf = Vec::new();
38511            loop {
38512                match reader.read_event_into(&mut buf)? {
38513                    Event::Start(e) => {
38514                        match e.local_name().as_ref() {
38515                            b"sheetData" => {
38516                                f_sheet_data.push(ExternalSheetData::from_xml(reader, &e, false)?);
38517                                #[cfg(feature = "extra-children")]
38518                                {
38519                                    child_idx += 1;
38520                                }
38521                            }
38522                            #[cfg(feature = "extra-children")]
38523                            _ => {
38524                                // Capture unknown element for roundtrip
38525                                let elem = RawXmlElement::from_reader(reader, &e)?;
38526                                extra_children.push(PositionedNode::new(
38527                                    child_idx,
38528                                    RawXmlNode::Element(elem),
38529                                ));
38530                                child_idx += 1;
38531                            }
38532                            #[cfg(not(feature = "extra-children"))]
38533                            _ => {
38534                                // Skip unknown element
38535                                skip_element(reader)?;
38536                            }
38537                        }
38538                    }
38539                    Event::Empty(e) => {
38540                        match e.local_name().as_ref() {
38541                            b"sheetData" => {
38542                                f_sheet_data.push(ExternalSheetData::from_xml(reader, &e, true)?);
38543                                #[cfg(feature = "extra-children")]
38544                                {
38545                                    child_idx += 1;
38546                                }
38547                            }
38548                            #[cfg(feature = "extra-children")]
38549                            _ => {
38550                                // Capture unknown empty element for roundtrip
38551                                let elem = RawXmlElement::from_empty(&e);
38552                                extra_children.push(PositionedNode::new(
38553                                    child_idx,
38554                                    RawXmlNode::Element(elem),
38555                                ));
38556                                child_idx += 1;
38557                            }
38558                            #[cfg(not(feature = "extra-children"))]
38559                            _ => {}
38560                        }
38561                    }
38562                    Event::End(_) => break,
38563                    Event::Eof => break,
38564                    _ => {}
38565                }
38566                buf.clear();
38567            }
38568        }
38569
38570        Ok(Self {
38571            sheet_data: f_sheet_data,
38572            #[cfg(feature = "extra-children")]
38573            extra_children,
38574        })
38575    }
38576}
38577
38578impl FromXml for ExternalSheetData {
38579    fn from_xml<R: BufRead>(
38580        reader: &mut Reader<R>,
38581        start_tag: &BytesStart,
38582        is_empty: bool,
38583    ) -> Result<Self, ParseError> {
38584        let mut f_sheet_id: Option<u32> = None;
38585        let mut f_refresh_error = None;
38586        let mut f_row = Vec::new();
38587        #[cfg(feature = "extra-attrs")]
38588        let mut extra_attrs = std::collections::HashMap::new();
38589        #[cfg(feature = "extra-children")]
38590        let mut extra_children = Vec::new();
38591        #[cfg(feature = "extra-children")]
38592        let mut child_idx: usize = 0;
38593
38594        // Parse attributes
38595        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38596            let val = String::from_utf8_lossy(&attr.value);
38597            match attr.key.local_name().as_ref() {
38598                b"sheetId" => {
38599                    f_sheet_id = val.parse().ok();
38600                }
38601                b"refreshError" => {
38602                    f_refresh_error = Some(val == "true" || val == "1");
38603                }
38604                #[cfg(feature = "extra-attrs")]
38605                unknown => {
38606                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38607                    extra_attrs.insert(key, val.into_owned());
38608                }
38609                #[cfg(not(feature = "extra-attrs"))]
38610                _ => {}
38611            }
38612        }
38613
38614        // Parse child elements
38615        if !is_empty {
38616            let mut buf = Vec::new();
38617            loop {
38618                match reader.read_event_into(&mut buf)? {
38619                    Event::Start(e) => {
38620                        match e.local_name().as_ref() {
38621                            b"row" => {
38622                                f_row.push(ExternalRow::from_xml(reader, &e, false)?);
38623                                #[cfg(feature = "extra-children")]
38624                                {
38625                                    child_idx += 1;
38626                                }
38627                            }
38628                            #[cfg(feature = "extra-children")]
38629                            _ => {
38630                                // Capture unknown element for roundtrip
38631                                let elem = RawXmlElement::from_reader(reader, &e)?;
38632                                extra_children.push(PositionedNode::new(
38633                                    child_idx,
38634                                    RawXmlNode::Element(elem),
38635                                ));
38636                                child_idx += 1;
38637                            }
38638                            #[cfg(not(feature = "extra-children"))]
38639                            _ => {
38640                                // Skip unknown element
38641                                skip_element(reader)?;
38642                            }
38643                        }
38644                    }
38645                    Event::Empty(e) => {
38646                        match e.local_name().as_ref() {
38647                            b"row" => {
38648                                f_row.push(ExternalRow::from_xml(reader, &e, true)?);
38649                                #[cfg(feature = "extra-children")]
38650                                {
38651                                    child_idx += 1;
38652                                }
38653                            }
38654                            #[cfg(feature = "extra-children")]
38655                            _ => {
38656                                // Capture unknown empty element for roundtrip
38657                                let elem = RawXmlElement::from_empty(&e);
38658                                extra_children.push(PositionedNode::new(
38659                                    child_idx,
38660                                    RawXmlNode::Element(elem),
38661                                ));
38662                                child_idx += 1;
38663                            }
38664                            #[cfg(not(feature = "extra-children"))]
38665                            _ => {}
38666                        }
38667                    }
38668                    Event::End(_) => break,
38669                    Event::Eof => break,
38670                    _ => {}
38671                }
38672                buf.clear();
38673            }
38674        }
38675
38676        Ok(Self {
38677            sheet_id: f_sheet_id
38678                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
38679            refresh_error: f_refresh_error,
38680            row: f_row,
38681            #[cfg(feature = "extra-attrs")]
38682            extra_attrs,
38683            #[cfg(feature = "extra-children")]
38684            extra_children,
38685        })
38686    }
38687}
38688
38689impl FromXml for ExternalRow {
38690    fn from_xml<R: BufRead>(
38691        reader: &mut Reader<R>,
38692        start_tag: &BytesStart,
38693        is_empty: bool,
38694    ) -> Result<Self, ParseError> {
38695        let mut f_reference: Option<u32> = None;
38696        let mut f_cell = Vec::new();
38697        #[cfg(feature = "extra-attrs")]
38698        let mut extra_attrs = std::collections::HashMap::new();
38699        #[cfg(feature = "extra-children")]
38700        let mut extra_children = Vec::new();
38701        #[cfg(feature = "extra-children")]
38702        let mut child_idx: usize = 0;
38703
38704        // Parse attributes
38705        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38706            let val = String::from_utf8_lossy(&attr.value);
38707            match attr.key.local_name().as_ref() {
38708                b"r" => {
38709                    f_reference = val.parse().ok();
38710                }
38711                #[cfg(feature = "extra-attrs")]
38712                unknown => {
38713                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38714                    extra_attrs.insert(key, val.into_owned());
38715                }
38716                #[cfg(not(feature = "extra-attrs"))]
38717                _ => {}
38718            }
38719        }
38720
38721        // Parse child elements
38722        if !is_empty {
38723            let mut buf = Vec::new();
38724            loop {
38725                match reader.read_event_into(&mut buf)? {
38726                    Event::Start(e) => {
38727                        match e.local_name().as_ref() {
38728                            b"cell" => {
38729                                f_cell.push(ExternalCell::from_xml(reader, &e, false)?);
38730                                #[cfg(feature = "extra-children")]
38731                                {
38732                                    child_idx += 1;
38733                                }
38734                            }
38735                            #[cfg(feature = "extra-children")]
38736                            _ => {
38737                                // Capture unknown element for roundtrip
38738                                let elem = RawXmlElement::from_reader(reader, &e)?;
38739                                extra_children.push(PositionedNode::new(
38740                                    child_idx,
38741                                    RawXmlNode::Element(elem),
38742                                ));
38743                                child_idx += 1;
38744                            }
38745                            #[cfg(not(feature = "extra-children"))]
38746                            _ => {
38747                                // Skip unknown element
38748                                skip_element(reader)?;
38749                            }
38750                        }
38751                    }
38752                    Event::Empty(e) => {
38753                        match e.local_name().as_ref() {
38754                            b"cell" => {
38755                                f_cell.push(ExternalCell::from_xml(reader, &e, true)?);
38756                                #[cfg(feature = "extra-children")]
38757                                {
38758                                    child_idx += 1;
38759                                }
38760                            }
38761                            #[cfg(feature = "extra-children")]
38762                            _ => {
38763                                // Capture unknown empty element for roundtrip
38764                                let elem = RawXmlElement::from_empty(&e);
38765                                extra_children.push(PositionedNode::new(
38766                                    child_idx,
38767                                    RawXmlNode::Element(elem),
38768                                ));
38769                                child_idx += 1;
38770                            }
38771                            #[cfg(not(feature = "extra-children"))]
38772                            _ => {}
38773                        }
38774                    }
38775                    Event::End(_) => break,
38776                    Event::Eof => break,
38777                    _ => {}
38778                }
38779                buf.clear();
38780            }
38781        }
38782
38783        Ok(Self {
38784            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
38785            cell: f_cell,
38786            #[cfg(feature = "extra-attrs")]
38787            extra_attrs,
38788            #[cfg(feature = "extra-children")]
38789            extra_children,
38790        })
38791    }
38792}
38793
38794impl FromXml for ExternalCell {
38795    fn from_xml<R: BufRead>(
38796        reader: &mut Reader<R>,
38797        start_tag: &BytesStart,
38798        is_empty: bool,
38799    ) -> Result<Self, ParseError> {
38800        let mut f_reference = None;
38801        let mut f_cell_type = None;
38802        let mut f_vm = None;
38803        let mut f_value = None;
38804        #[cfg(feature = "extra-attrs")]
38805        let mut extra_attrs = std::collections::HashMap::new();
38806        #[cfg(feature = "extra-children")]
38807        let mut extra_children = Vec::new();
38808        #[cfg(feature = "extra-children")]
38809        let mut child_idx: usize = 0;
38810
38811        // Parse attributes
38812        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38813            let val = String::from_utf8_lossy(&attr.value);
38814            match attr.key.local_name().as_ref() {
38815                b"r" => {
38816                    f_reference = Some(val.into_owned());
38817                }
38818                b"t" => {
38819                    f_cell_type = val.parse().ok();
38820                }
38821                b"vm" => {
38822                    f_vm = val.parse().ok();
38823                }
38824                #[cfg(feature = "extra-attrs")]
38825                unknown => {
38826                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38827                    extra_attrs.insert(key, val.into_owned());
38828                }
38829                #[cfg(not(feature = "extra-attrs"))]
38830                _ => {}
38831            }
38832        }
38833
38834        // Parse child elements
38835        if !is_empty {
38836            let mut buf = Vec::new();
38837            loop {
38838                match reader.read_event_into(&mut buf)? {
38839                    Event::Start(e) => {
38840                        match e.local_name().as_ref() {
38841                            b"v" => {
38842                                f_value = Some(read_text_content(reader)?);
38843                                #[cfg(feature = "extra-children")]
38844                                {
38845                                    child_idx += 1;
38846                                }
38847                            }
38848                            #[cfg(feature = "extra-children")]
38849                            _ => {
38850                                // Capture unknown element for roundtrip
38851                                let elem = RawXmlElement::from_reader(reader, &e)?;
38852                                extra_children.push(PositionedNode::new(
38853                                    child_idx,
38854                                    RawXmlNode::Element(elem),
38855                                ));
38856                                child_idx += 1;
38857                            }
38858                            #[cfg(not(feature = "extra-children"))]
38859                            _ => {
38860                                // Skip unknown element
38861                                skip_element(reader)?;
38862                            }
38863                        }
38864                    }
38865                    Event::Empty(e) => {
38866                        match e.local_name().as_ref() {
38867                            b"v" => {
38868                                f_value = Some(String::new());
38869                                #[cfg(feature = "extra-children")]
38870                                {
38871                                    child_idx += 1;
38872                                }
38873                            }
38874                            #[cfg(feature = "extra-children")]
38875                            _ => {
38876                                // Capture unknown empty element for roundtrip
38877                                let elem = RawXmlElement::from_empty(&e);
38878                                extra_children.push(PositionedNode::new(
38879                                    child_idx,
38880                                    RawXmlNode::Element(elem),
38881                                ));
38882                                child_idx += 1;
38883                            }
38884                            #[cfg(not(feature = "extra-children"))]
38885                            _ => {}
38886                        }
38887                    }
38888                    Event::End(_) => break,
38889                    Event::Eof => break,
38890                    _ => {}
38891                }
38892                buf.clear();
38893            }
38894        }
38895
38896        Ok(Self {
38897            reference: f_reference,
38898            cell_type: f_cell_type,
38899            vm: f_vm,
38900            value: f_value,
38901            #[cfg(feature = "extra-attrs")]
38902            extra_attrs,
38903            #[cfg(feature = "extra-children")]
38904            extra_children,
38905        })
38906    }
38907}
38908
38909impl FromXml for DdeLink {
38910    fn from_xml<R: BufRead>(
38911        reader: &mut Reader<R>,
38912        start_tag: &BytesStart,
38913        is_empty: bool,
38914    ) -> Result<Self, ParseError> {
38915        let mut f_dde_service: Option<XmlString> = None;
38916        let mut f_dde_topic: Option<XmlString> = None;
38917        let mut f_dde_items = None;
38918        #[cfg(feature = "extra-attrs")]
38919        let mut extra_attrs = std::collections::HashMap::new();
38920        #[cfg(feature = "extra-children")]
38921        let mut extra_children = Vec::new();
38922        #[cfg(feature = "extra-children")]
38923        let mut child_idx: usize = 0;
38924
38925        // Parse attributes
38926        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
38927            let val = String::from_utf8_lossy(&attr.value);
38928            match attr.key.local_name().as_ref() {
38929                b"ddeService" => {
38930                    f_dde_service = Some(val.into_owned());
38931                }
38932                b"ddeTopic" => {
38933                    f_dde_topic = Some(val.into_owned());
38934                }
38935                #[cfg(feature = "extra-attrs")]
38936                unknown => {
38937                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
38938                    extra_attrs.insert(key, val.into_owned());
38939                }
38940                #[cfg(not(feature = "extra-attrs"))]
38941                _ => {}
38942            }
38943        }
38944
38945        // Parse child elements
38946        if !is_empty {
38947            let mut buf = Vec::new();
38948            loop {
38949                match reader.read_event_into(&mut buf)? {
38950                    Event::Start(e) => {
38951                        match e.local_name().as_ref() {
38952                            b"ddeItems" => {
38953                                f_dde_items =
38954                                    Some(Box::new(DdeItems::from_xml(reader, &e, false)?));
38955                                #[cfg(feature = "extra-children")]
38956                                {
38957                                    child_idx += 1;
38958                                }
38959                            }
38960                            #[cfg(feature = "extra-children")]
38961                            _ => {
38962                                // Capture unknown element for roundtrip
38963                                let elem = RawXmlElement::from_reader(reader, &e)?;
38964                                extra_children.push(PositionedNode::new(
38965                                    child_idx,
38966                                    RawXmlNode::Element(elem),
38967                                ));
38968                                child_idx += 1;
38969                            }
38970                            #[cfg(not(feature = "extra-children"))]
38971                            _ => {
38972                                // Skip unknown element
38973                                skip_element(reader)?;
38974                            }
38975                        }
38976                    }
38977                    Event::Empty(e) => {
38978                        match e.local_name().as_ref() {
38979                            b"ddeItems" => {
38980                                f_dde_items = Some(Box::new(DdeItems::from_xml(reader, &e, true)?));
38981                                #[cfg(feature = "extra-children")]
38982                                {
38983                                    child_idx += 1;
38984                                }
38985                            }
38986                            #[cfg(feature = "extra-children")]
38987                            _ => {
38988                                // Capture unknown empty element for roundtrip
38989                                let elem = RawXmlElement::from_empty(&e);
38990                                extra_children.push(PositionedNode::new(
38991                                    child_idx,
38992                                    RawXmlNode::Element(elem),
38993                                ));
38994                                child_idx += 1;
38995                            }
38996                            #[cfg(not(feature = "extra-children"))]
38997                            _ => {}
38998                        }
38999                    }
39000                    Event::End(_) => break,
39001                    Event::Eof => break,
39002                    _ => {}
39003                }
39004                buf.clear();
39005            }
39006        }
39007
39008        Ok(Self {
39009            dde_service: f_dde_service
39010                .ok_or_else(|| ParseError::MissingAttribute("ddeService".to_string()))?,
39011            dde_topic: f_dde_topic
39012                .ok_or_else(|| ParseError::MissingAttribute("ddeTopic".to_string()))?,
39013            dde_items: f_dde_items,
39014            #[cfg(feature = "extra-attrs")]
39015            extra_attrs,
39016            #[cfg(feature = "extra-children")]
39017            extra_children,
39018        })
39019    }
39020}
39021
39022impl FromXml for DdeItems {
39023    fn from_xml<R: BufRead>(
39024        reader: &mut Reader<R>,
39025        start_tag: &BytesStart,
39026        is_empty: bool,
39027    ) -> Result<Self, ParseError> {
39028        let mut f_dde_item = Vec::new();
39029        #[cfg(feature = "extra-children")]
39030        let mut extra_children = Vec::new();
39031        #[cfg(feature = "extra-children")]
39032        let mut child_idx: usize = 0;
39033
39034        // Parse child elements
39035        if !is_empty {
39036            let mut buf = Vec::new();
39037            loop {
39038                match reader.read_event_into(&mut buf)? {
39039                    Event::Start(e) => {
39040                        match e.local_name().as_ref() {
39041                            b"ddeItem" => {
39042                                f_dde_item.push(DdeItem::from_xml(reader, &e, false)?);
39043                                #[cfg(feature = "extra-children")]
39044                                {
39045                                    child_idx += 1;
39046                                }
39047                            }
39048                            #[cfg(feature = "extra-children")]
39049                            _ => {
39050                                // Capture unknown element for roundtrip
39051                                let elem = RawXmlElement::from_reader(reader, &e)?;
39052                                extra_children.push(PositionedNode::new(
39053                                    child_idx,
39054                                    RawXmlNode::Element(elem),
39055                                ));
39056                                child_idx += 1;
39057                            }
39058                            #[cfg(not(feature = "extra-children"))]
39059                            _ => {
39060                                // Skip unknown element
39061                                skip_element(reader)?;
39062                            }
39063                        }
39064                    }
39065                    Event::Empty(e) => {
39066                        match e.local_name().as_ref() {
39067                            b"ddeItem" => {
39068                                f_dde_item.push(DdeItem::from_xml(reader, &e, true)?);
39069                                #[cfg(feature = "extra-children")]
39070                                {
39071                                    child_idx += 1;
39072                                }
39073                            }
39074                            #[cfg(feature = "extra-children")]
39075                            _ => {
39076                                // Capture unknown empty element for roundtrip
39077                                let elem = RawXmlElement::from_empty(&e);
39078                                extra_children.push(PositionedNode::new(
39079                                    child_idx,
39080                                    RawXmlNode::Element(elem),
39081                                ));
39082                                child_idx += 1;
39083                            }
39084                            #[cfg(not(feature = "extra-children"))]
39085                            _ => {}
39086                        }
39087                    }
39088                    Event::End(_) => break,
39089                    Event::Eof => break,
39090                    _ => {}
39091                }
39092                buf.clear();
39093            }
39094        }
39095
39096        Ok(Self {
39097            dde_item: f_dde_item,
39098            #[cfg(feature = "extra-children")]
39099            extra_children,
39100        })
39101    }
39102}
39103
39104impl FromXml for DdeItem {
39105    fn from_xml<R: BufRead>(
39106        reader: &mut Reader<R>,
39107        start_tag: &BytesStart,
39108        is_empty: bool,
39109    ) -> Result<Self, ParseError> {
39110        let mut f_name = None;
39111        let mut f_ole = None;
39112        let mut f_advise = None;
39113        let mut f_prefer_pic = None;
39114        let mut f_values = None;
39115        #[cfg(feature = "extra-attrs")]
39116        let mut extra_attrs = std::collections::HashMap::new();
39117        #[cfg(feature = "extra-children")]
39118        let mut extra_children = Vec::new();
39119        #[cfg(feature = "extra-children")]
39120        let mut child_idx: usize = 0;
39121
39122        // Parse attributes
39123        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39124            let val = String::from_utf8_lossy(&attr.value);
39125            match attr.key.local_name().as_ref() {
39126                b"name" => {
39127                    f_name = Some(val.into_owned());
39128                }
39129                b"ole" => {
39130                    f_ole = Some(val == "true" || val == "1");
39131                }
39132                b"advise" => {
39133                    f_advise = Some(val == "true" || val == "1");
39134                }
39135                b"preferPic" => {
39136                    f_prefer_pic = Some(val == "true" || val == "1");
39137                }
39138                #[cfg(feature = "extra-attrs")]
39139                unknown => {
39140                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39141                    extra_attrs.insert(key, val.into_owned());
39142                }
39143                #[cfg(not(feature = "extra-attrs"))]
39144                _ => {}
39145            }
39146        }
39147
39148        // Parse child elements
39149        if !is_empty {
39150            let mut buf = Vec::new();
39151            loop {
39152                match reader.read_event_into(&mut buf)? {
39153                    Event::Start(e) => {
39154                        match e.local_name().as_ref() {
39155                            b"values" => {
39156                                f_values =
39157                                    Some(Box::new(CTDdeValues::from_xml(reader, &e, false)?));
39158                                #[cfg(feature = "extra-children")]
39159                                {
39160                                    child_idx += 1;
39161                                }
39162                            }
39163                            #[cfg(feature = "extra-children")]
39164                            _ => {
39165                                // Capture unknown element for roundtrip
39166                                let elem = RawXmlElement::from_reader(reader, &e)?;
39167                                extra_children.push(PositionedNode::new(
39168                                    child_idx,
39169                                    RawXmlNode::Element(elem),
39170                                ));
39171                                child_idx += 1;
39172                            }
39173                            #[cfg(not(feature = "extra-children"))]
39174                            _ => {
39175                                // Skip unknown element
39176                                skip_element(reader)?;
39177                            }
39178                        }
39179                    }
39180                    Event::Empty(e) => {
39181                        match e.local_name().as_ref() {
39182                            b"values" => {
39183                                f_values = Some(Box::new(CTDdeValues::from_xml(reader, &e, true)?));
39184                                #[cfg(feature = "extra-children")]
39185                                {
39186                                    child_idx += 1;
39187                                }
39188                            }
39189                            #[cfg(feature = "extra-children")]
39190                            _ => {
39191                                // Capture unknown empty element for roundtrip
39192                                let elem = RawXmlElement::from_empty(&e);
39193                                extra_children.push(PositionedNode::new(
39194                                    child_idx,
39195                                    RawXmlNode::Element(elem),
39196                                ));
39197                                child_idx += 1;
39198                            }
39199                            #[cfg(not(feature = "extra-children"))]
39200                            _ => {}
39201                        }
39202                    }
39203                    Event::End(_) => break,
39204                    Event::Eof => break,
39205                    _ => {}
39206                }
39207                buf.clear();
39208            }
39209        }
39210
39211        Ok(Self {
39212            name: f_name,
39213            ole: f_ole,
39214            advise: f_advise,
39215            prefer_pic: f_prefer_pic,
39216            values: f_values,
39217            #[cfg(feature = "extra-attrs")]
39218            extra_attrs,
39219            #[cfg(feature = "extra-children")]
39220            extra_children,
39221        })
39222    }
39223}
39224
39225impl FromXml for CTDdeValues {
39226    fn from_xml<R: BufRead>(
39227        reader: &mut Reader<R>,
39228        start_tag: &BytesStart,
39229        is_empty: bool,
39230    ) -> Result<Self, ParseError> {
39231        let mut f_rows = None;
39232        let mut f_cols = None;
39233        let mut f_value = Vec::new();
39234        #[cfg(feature = "extra-attrs")]
39235        let mut extra_attrs = std::collections::HashMap::new();
39236        #[cfg(feature = "extra-children")]
39237        let mut extra_children = Vec::new();
39238        #[cfg(feature = "extra-children")]
39239        let mut child_idx: usize = 0;
39240
39241        // Parse attributes
39242        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39243            let val = String::from_utf8_lossy(&attr.value);
39244            match attr.key.local_name().as_ref() {
39245                b"rows" => {
39246                    f_rows = val.parse().ok();
39247                }
39248                b"cols" => {
39249                    f_cols = val.parse().ok();
39250                }
39251                #[cfg(feature = "extra-attrs")]
39252                unknown => {
39253                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39254                    extra_attrs.insert(key, val.into_owned());
39255                }
39256                #[cfg(not(feature = "extra-attrs"))]
39257                _ => {}
39258            }
39259        }
39260
39261        // Parse child elements
39262        if !is_empty {
39263            let mut buf = Vec::new();
39264            loop {
39265                match reader.read_event_into(&mut buf)? {
39266                    Event::Start(e) => {
39267                        match e.local_name().as_ref() {
39268                            b"value" => {
39269                                f_value.push(CTDdeValue::from_xml(reader, &e, false)?);
39270                                #[cfg(feature = "extra-children")]
39271                                {
39272                                    child_idx += 1;
39273                                }
39274                            }
39275                            #[cfg(feature = "extra-children")]
39276                            _ => {
39277                                // Capture unknown element for roundtrip
39278                                let elem = RawXmlElement::from_reader(reader, &e)?;
39279                                extra_children.push(PositionedNode::new(
39280                                    child_idx,
39281                                    RawXmlNode::Element(elem),
39282                                ));
39283                                child_idx += 1;
39284                            }
39285                            #[cfg(not(feature = "extra-children"))]
39286                            _ => {
39287                                // Skip unknown element
39288                                skip_element(reader)?;
39289                            }
39290                        }
39291                    }
39292                    Event::Empty(e) => {
39293                        match e.local_name().as_ref() {
39294                            b"value" => {
39295                                f_value.push(CTDdeValue::from_xml(reader, &e, true)?);
39296                                #[cfg(feature = "extra-children")]
39297                                {
39298                                    child_idx += 1;
39299                                }
39300                            }
39301                            #[cfg(feature = "extra-children")]
39302                            _ => {
39303                                // Capture unknown empty element for roundtrip
39304                                let elem = RawXmlElement::from_empty(&e);
39305                                extra_children.push(PositionedNode::new(
39306                                    child_idx,
39307                                    RawXmlNode::Element(elem),
39308                                ));
39309                                child_idx += 1;
39310                            }
39311                            #[cfg(not(feature = "extra-children"))]
39312                            _ => {}
39313                        }
39314                    }
39315                    Event::End(_) => break,
39316                    Event::Eof => break,
39317                    _ => {}
39318                }
39319                buf.clear();
39320            }
39321        }
39322
39323        Ok(Self {
39324            rows: f_rows,
39325            cols: f_cols,
39326            value: f_value,
39327            #[cfg(feature = "extra-attrs")]
39328            extra_attrs,
39329            #[cfg(feature = "extra-children")]
39330            extra_children,
39331        })
39332    }
39333}
39334
39335impl FromXml for CTDdeValue {
39336    fn from_xml<R: BufRead>(
39337        reader: &mut Reader<R>,
39338        start_tag: &BytesStart,
39339        is_empty: bool,
39340    ) -> Result<Self, ParseError> {
39341        let mut f_cell_type = None;
39342        let mut f_value: Option<XmlString> = None;
39343        #[cfg(feature = "extra-attrs")]
39344        let mut extra_attrs = std::collections::HashMap::new();
39345        #[cfg(feature = "extra-children")]
39346        let mut extra_children = Vec::new();
39347        #[cfg(feature = "extra-children")]
39348        let mut child_idx: usize = 0;
39349
39350        // Parse attributes
39351        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39352            let val = String::from_utf8_lossy(&attr.value);
39353            match attr.key.local_name().as_ref() {
39354                b"t" => {
39355                    f_cell_type = val.parse().ok();
39356                }
39357                #[cfg(feature = "extra-attrs")]
39358                unknown => {
39359                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39360                    extra_attrs.insert(key, val.into_owned());
39361                }
39362                #[cfg(not(feature = "extra-attrs"))]
39363                _ => {}
39364            }
39365        }
39366
39367        // Parse child elements
39368        if !is_empty {
39369            let mut buf = Vec::new();
39370            loop {
39371                match reader.read_event_into(&mut buf)? {
39372                    Event::Start(e) => {
39373                        match e.local_name().as_ref() {
39374                            b"val" => {
39375                                f_value = Some(read_text_content(reader)?);
39376                                #[cfg(feature = "extra-children")]
39377                                {
39378                                    child_idx += 1;
39379                                }
39380                            }
39381                            #[cfg(feature = "extra-children")]
39382                            _ => {
39383                                // Capture unknown element for roundtrip
39384                                let elem = RawXmlElement::from_reader(reader, &e)?;
39385                                extra_children.push(PositionedNode::new(
39386                                    child_idx,
39387                                    RawXmlNode::Element(elem),
39388                                ));
39389                                child_idx += 1;
39390                            }
39391                            #[cfg(not(feature = "extra-children"))]
39392                            _ => {
39393                                // Skip unknown element
39394                                skip_element(reader)?;
39395                            }
39396                        }
39397                    }
39398                    Event::Empty(e) => {
39399                        match e.local_name().as_ref() {
39400                            b"val" => {
39401                                f_value = Some(String::new());
39402                                #[cfg(feature = "extra-children")]
39403                                {
39404                                    child_idx += 1;
39405                                }
39406                            }
39407                            #[cfg(feature = "extra-children")]
39408                            _ => {
39409                                // Capture unknown empty element for roundtrip
39410                                let elem = RawXmlElement::from_empty(&e);
39411                                extra_children.push(PositionedNode::new(
39412                                    child_idx,
39413                                    RawXmlNode::Element(elem),
39414                                ));
39415                                child_idx += 1;
39416                            }
39417                            #[cfg(not(feature = "extra-children"))]
39418                            _ => {}
39419                        }
39420                    }
39421                    Event::End(_) => break,
39422                    Event::Eof => break,
39423                    _ => {}
39424                }
39425                buf.clear();
39426            }
39427        }
39428
39429        Ok(Self {
39430            cell_type: f_cell_type,
39431            value: f_value.ok_or_else(|| ParseError::MissingAttribute("val".to_string()))?,
39432            #[cfg(feature = "extra-attrs")]
39433            extra_attrs,
39434            #[cfg(feature = "extra-children")]
39435            extra_children,
39436        })
39437    }
39438}
39439
39440impl FromXml for OleLink {
39441    fn from_xml<R: BufRead>(
39442        reader: &mut Reader<R>,
39443        start_tag: &BytesStart,
39444        is_empty: bool,
39445    ) -> Result<Self, ParseError> {
39446        let mut f_id: Option<STRelationshipId> = None;
39447        let mut f_prog_id: Option<XmlString> = None;
39448        let mut f_ole_items = None;
39449        #[cfg(feature = "extra-attrs")]
39450        let mut extra_attrs = std::collections::HashMap::new();
39451        #[cfg(feature = "extra-children")]
39452        let mut extra_children = Vec::new();
39453        #[cfg(feature = "extra-children")]
39454        let mut child_idx: usize = 0;
39455
39456        // Parse attributes
39457        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39458            let val = String::from_utf8_lossy(&attr.value);
39459            match attr.key.local_name().as_ref() {
39460                b"id" => {
39461                    f_id = Some(val.into_owned());
39462                }
39463                b"progId" => {
39464                    f_prog_id = Some(val.into_owned());
39465                }
39466                #[cfg(feature = "extra-attrs")]
39467                unknown => {
39468                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39469                    extra_attrs.insert(key, val.into_owned());
39470                }
39471                #[cfg(not(feature = "extra-attrs"))]
39472                _ => {}
39473            }
39474        }
39475
39476        // Parse child elements
39477        if !is_empty {
39478            let mut buf = Vec::new();
39479            loop {
39480                match reader.read_event_into(&mut buf)? {
39481                    Event::Start(e) => {
39482                        match e.local_name().as_ref() {
39483                            b"oleItems" => {
39484                                f_ole_items =
39485                                    Some(Box::new(OleItems::from_xml(reader, &e, false)?));
39486                                #[cfg(feature = "extra-children")]
39487                                {
39488                                    child_idx += 1;
39489                                }
39490                            }
39491                            #[cfg(feature = "extra-children")]
39492                            _ => {
39493                                // Capture unknown element for roundtrip
39494                                let elem = RawXmlElement::from_reader(reader, &e)?;
39495                                extra_children.push(PositionedNode::new(
39496                                    child_idx,
39497                                    RawXmlNode::Element(elem),
39498                                ));
39499                                child_idx += 1;
39500                            }
39501                            #[cfg(not(feature = "extra-children"))]
39502                            _ => {
39503                                // Skip unknown element
39504                                skip_element(reader)?;
39505                            }
39506                        }
39507                    }
39508                    Event::Empty(e) => {
39509                        match e.local_name().as_ref() {
39510                            b"oleItems" => {
39511                                f_ole_items = Some(Box::new(OleItems::from_xml(reader, &e, true)?));
39512                                #[cfg(feature = "extra-children")]
39513                                {
39514                                    child_idx += 1;
39515                                }
39516                            }
39517                            #[cfg(feature = "extra-children")]
39518                            _ => {
39519                                // Capture unknown empty element for roundtrip
39520                                let elem = RawXmlElement::from_empty(&e);
39521                                extra_children.push(PositionedNode::new(
39522                                    child_idx,
39523                                    RawXmlNode::Element(elem),
39524                                ));
39525                                child_idx += 1;
39526                            }
39527                            #[cfg(not(feature = "extra-children"))]
39528                            _ => {}
39529                        }
39530                    }
39531                    Event::End(_) => break,
39532                    Event::Eof => break,
39533                    _ => {}
39534                }
39535                buf.clear();
39536            }
39537        }
39538
39539        Ok(Self {
39540            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
39541            prog_id: f_prog_id.ok_or_else(|| ParseError::MissingAttribute("progId".to_string()))?,
39542            ole_items: f_ole_items,
39543            #[cfg(feature = "extra-attrs")]
39544            extra_attrs,
39545            #[cfg(feature = "extra-children")]
39546            extra_children,
39547        })
39548    }
39549}
39550
39551impl FromXml for OleItems {
39552    fn from_xml<R: BufRead>(
39553        reader: &mut Reader<R>,
39554        start_tag: &BytesStart,
39555        is_empty: bool,
39556    ) -> Result<Self, ParseError> {
39557        let mut f_ole_item = Vec::new();
39558        #[cfg(feature = "extra-children")]
39559        let mut extra_children = Vec::new();
39560        #[cfg(feature = "extra-children")]
39561        let mut child_idx: usize = 0;
39562
39563        // Parse child elements
39564        if !is_empty {
39565            let mut buf = Vec::new();
39566            loop {
39567                match reader.read_event_into(&mut buf)? {
39568                    Event::Start(e) => {
39569                        match e.local_name().as_ref() {
39570                            b"oleItem" => {
39571                                f_ole_item.push(OleItem::from_xml(reader, &e, false)?);
39572                                #[cfg(feature = "extra-children")]
39573                                {
39574                                    child_idx += 1;
39575                                }
39576                            }
39577                            #[cfg(feature = "extra-children")]
39578                            _ => {
39579                                // Capture unknown element for roundtrip
39580                                let elem = RawXmlElement::from_reader(reader, &e)?;
39581                                extra_children.push(PositionedNode::new(
39582                                    child_idx,
39583                                    RawXmlNode::Element(elem),
39584                                ));
39585                                child_idx += 1;
39586                            }
39587                            #[cfg(not(feature = "extra-children"))]
39588                            _ => {
39589                                // Skip unknown element
39590                                skip_element(reader)?;
39591                            }
39592                        }
39593                    }
39594                    Event::Empty(e) => {
39595                        match e.local_name().as_ref() {
39596                            b"oleItem" => {
39597                                f_ole_item.push(OleItem::from_xml(reader, &e, true)?);
39598                                #[cfg(feature = "extra-children")]
39599                                {
39600                                    child_idx += 1;
39601                                }
39602                            }
39603                            #[cfg(feature = "extra-children")]
39604                            _ => {
39605                                // Capture unknown empty element for roundtrip
39606                                let elem = RawXmlElement::from_empty(&e);
39607                                extra_children.push(PositionedNode::new(
39608                                    child_idx,
39609                                    RawXmlNode::Element(elem),
39610                                ));
39611                                child_idx += 1;
39612                            }
39613                            #[cfg(not(feature = "extra-children"))]
39614                            _ => {}
39615                        }
39616                    }
39617                    Event::End(_) => break,
39618                    Event::Eof => break,
39619                    _ => {}
39620                }
39621                buf.clear();
39622            }
39623        }
39624
39625        Ok(Self {
39626            ole_item: f_ole_item,
39627            #[cfg(feature = "extra-children")]
39628            extra_children,
39629        })
39630    }
39631}
39632
39633impl FromXml for OleItem {
39634    fn from_xml<R: BufRead>(
39635        reader: &mut Reader<R>,
39636        start_tag: &BytesStart,
39637        is_empty: bool,
39638    ) -> Result<Self, ParseError> {
39639        let mut f_name: Option<XmlString> = None;
39640        let mut f_icon = None;
39641        let mut f_advise = None;
39642        let mut f_prefer_pic = None;
39643        #[cfg(feature = "extra-attrs")]
39644        let mut extra_attrs = std::collections::HashMap::new();
39645
39646        // Parse attributes
39647        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39648            let val = String::from_utf8_lossy(&attr.value);
39649            match attr.key.local_name().as_ref() {
39650                b"name" => {
39651                    f_name = Some(val.into_owned());
39652                }
39653                b"icon" => {
39654                    f_icon = Some(val == "true" || val == "1");
39655                }
39656                b"advise" => {
39657                    f_advise = Some(val == "true" || val == "1");
39658                }
39659                b"preferPic" => {
39660                    f_prefer_pic = Some(val == "true" || val == "1");
39661                }
39662                #[cfg(feature = "extra-attrs")]
39663                unknown => {
39664                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39665                    extra_attrs.insert(key, val.into_owned());
39666                }
39667                #[cfg(not(feature = "extra-attrs"))]
39668                _ => {}
39669            }
39670        }
39671
39672        if !is_empty {
39673            let mut buf = Vec::new();
39674            loop {
39675                match reader.read_event_into(&mut buf)? {
39676                    Event::End(_) => break,
39677                    Event::Eof => break,
39678                    _ => {}
39679                }
39680                buf.clear();
39681            }
39682        }
39683
39684        Ok(Self {
39685            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
39686            icon: f_icon,
39687            advise: f_advise,
39688            prefer_pic: f_prefer_pic,
39689            #[cfg(feature = "extra-attrs")]
39690            extra_attrs,
39691        })
39692    }
39693}
39694
39695impl FromXml for Table {
39696    fn from_xml<R: BufRead>(
39697        reader: &mut Reader<R>,
39698        start_tag: &BytesStart,
39699        is_empty: bool,
39700    ) -> Result<Self, ParseError> {
39701        #[cfg(feature = "sml-tables")]
39702        let mut f_id: Option<u32> = None;
39703        #[cfg(feature = "sml-tables")]
39704        let mut f_name = None;
39705        #[cfg(feature = "sml-tables")]
39706        let mut f_display_name: Option<XmlString> = None;
39707        #[cfg(feature = "sml-tables")]
39708        let mut f_comment = None;
39709        #[cfg(feature = "sml-tables")]
39710        let mut f_reference: Option<Reference> = None;
39711        #[cfg(feature = "sml-tables")]
39712        let mut f_table_type = None;
39713        #[cfg(feature = "sml-tables")]
39714        let mut f_header_row_count = None;
39715        #[cfg(feature = "sml-tables")]
39716        let mut f_insert_row = None;
39717        #[cfg(feature = "sml-tables")]
39718        let mut f_insert_row_shift = None;
39719        #[cfg(feature = "sml-tables")]
39720        let mut f_totals_row_count = None;
39721        #[cfg(feature = "sml-tables")]
39722        let mut f_totals_row_shown = None;
39723        #[cfg(feature = "sml-tables")]
39724        let mut f_published = None;
39725        #[cfg(feature = "sml-tables")]
39726        let mut f_header_row_dxf_id = None;
39727        #[cfg(feature = "sml-tables")]
39728        let mut f_data_dxf_id = None;
39729        #[cfg(feature = "sml-tables")]
39730        let mut f_totals_row_dxf_id = None;
39731        #[cfg(feature = "sml-tables")]
39732        let mut f_header_row_border_dxf_id = None;
39733        #[cfg(feature = "sml-tables")]
39734        let mut f_table_border_dxf_id = None;
39735        #[cfg(feature = "sml-tables")]
39736        let mut f_totals_row_border_dxf_id = None;
39737        #[cfg(feature = "sml-tables")]
39738        let mut f_header_row_cell_style = None;
39739        #[cfg(feature = "sml-tables")]
39740        let mut f_data_cell_style = None;
39741        #[cfg(feature = "sml-tables")]
39742        let mut f_totals_row_cell_style = None;
39743        #[cfg(feature = "sml-tables")]
39744        let mut f_connection_id = None;
39745        #[cfg(feature = "sml-tables")]
39746        let mut f_auto_filter = None;
39747        #[cfg(feature = "sml-tables")]
39748        let mut f_sort_state = None;
39749        #[cfg(feature = "sml-tables")]
39750        let mut f_table_columns: Option<Box<TableColumns>> = None;
39751        #[cfg(feature = "sml-tables")]
39752        let mut f_table_style_info = None;
39753        #[cfg(feature = "sml-extensions")]
39754        let mut f_extension_list = None;
39755        #[cfg(feature = "extra-attrs")]
39756        let mut extra_attrs = std::collections::HashMap::new();
39757        #[cfg(feature = "extra-children")]
39758        let mut extra_children = Vec::new();
39759        #[cfg(feature = "extra-children")]
39760        let mut child_idx: usize = 0;
39761
39762        // Parse attributes
39763        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
39764            let val = String::from_utf8_lossy(&attr.value);
39765            match attr.key.local_name().as_ref() {
39766                #[cfg(feature = "sml-tables")]
39767                b"id" => {
39768                    f_id = val.parse().ok();
39769                }
39770                #[cfg(feature = "sml-tables")]
39771                b"name" => {
39772                    f_name = Some(val.into_owned());
39773                }
39774                #[cfg(feature = "sml-tables")]
39775                b"displayName" => {
39776                    f_display_name = Some(val.into_owned());
39777                }
39778                #[cfg(feature = "sml-tables")]
39779                b"comment" => {
39780                    f_comment = Some(val.into_owned());
39781                }
39782                #[cfg(feature = "sml-tables")]
39783                b"ref" => {
39784                    f_reference = Some(val.into_owned());
39785                }
39786                #[cfg(feature = "sml-tables")]
39787                b"tableType" => {
39788                    f_table_type = val.parse().ok();
39789                }
39790                #[cfg(feature = "sml-tables")]
39791                b"headerRowCount" => {
39792                    f_header_row_count = val.parse().ok();
39793                }
39794                #[cfg(feature = "sml-tables")]
39795                b"insertRow" => {
39796                    f_insert_row = Some(val == "true" || val == "1");
39797                }
39798                #[cfg(feature = "sml-tables")]
39799                b"insertRowShift" => {
39800                    f_insert_row_shift = Some(val == "true" || val == "1");
39801                }
39802                #[cfg(feature = "sml-tables")]
39803                b"totalsRowCount" => {
39804                    f_totals_row_count = val.parse().ok();
39805                }
39806                #[cfg(feature = "sml-tables")]
39807                b"totalsRowShown" => {
39808                    f_totals_row_shown = Some(val == "true" || val == "1");
39809                }
39810                #[cfg(feature = "sml-tables")]
39811                b"published" => {
39812                    f_published = Some(val == "true" || val == "1");
39813                }
39814                #[cfg(feature = "sml-tables")]
39815                b"headerRowDxfId" => {
39816                    f_header_row_dxf_id = val.parse().ok();
39817                }
39818                #[cfg(feature = "sml-tables")]
39819                b"dataDxfId" => {
39820                    f_data_dxf_id = val.parse().ok();
39821                }
39822                #[cfg(feature = "sml-tables")]
39823                b"totalsRowDxfId" => {
39824                    f_totals_row_dxf_id = val.parse().ok();
39825                }
39826                #[cfg(feature = "sml-tables")]
39827                b"headerRowBorderDxfId" => {
39828                    f_header_row_border_dxf_id = val.parse().ok();
39829                }
39830                #[cfg(feature = "sml-tables")]
39831                b"tableBorderDxfId" => {
39832                    f_table_border_dxf_id = val.parse().ok();
39833                }
39834                #[cfg(feature = "sml-tables")]
39835                b"totalsRowBorderDxfId" => {
39836                    f_totals_row_border_dxf_id = val.parse().ok();
39837                }
39838                #[cfg(feature = "sml-tables")]
39839                b"headerRowCellStyle" => {
39840                    f_header_row_cell_style = Some(val.into_owned());
39841                }
39842                #[cfg(feature = "sml-tables")]
39843                b"dataCellStyle" => {
39844                    f_data_cell_style = Some(val.into_owned());
39845                }
39846                #[cfg(feature = "sml-tables")]
39847                b"totalsRowCellStyle" => {
39848                    f_totals_row_cell_style = Some(val.into_owned());
39849                }
39850                #[cfg(feature = "sml-tables")]
39851                b"connectionId" => {
39852                    f_connection_id = val.parse().ok();
39853                }
39854                #[cfg(feature = "extra-attrs")]
39855                unknown => {
39856                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
39857                    extra_attrs.insert(key, val.into_owned());
39858                }
39859                #[cfg(not(feature = "extra-attrs"))]
39860                _ => {}
39861            }
39862        }
39863
39864        // Parse child elements
39865        if !is_empty {
39866            let mut buf = Vec::new();
39867            loop {
39868                match reader.read_event_into(&mut buf)? {
39869                    Event::Start(e) => {
39870                        match e.local_name().as_ref() {
39871                            #[cfg(feature = "sml-tables")]
39872                            b"autoFilter" => {
39873                                f_auto_filter =
39874                                    Some(Box::new(AutoFilter::from_xml(reader, &e, false)?));
39875                                #[cfg(feature = "extra-children")]
39876                                {
39877                                    child_idx += 1;
39878                                }
39879                            }
39880                            #[cfg(feature = "sml-tables")]
39881                            b"sortState" => {
39882                                f_sort_state =
39883                                    Some(Box::new(SortState::from_xml(reader, &e, false)?));
39884                                #[cfg(feature = "extra-children")]
39885                                {
39886                                    child_idx += 1;
39887                                }
39888                            }
39889                            #[cfg(feature = "sml-tables")]
39890                            b"tableColumns" => {
39891                                f_table_columns =
39892                                    Some(Box::new(TableColumns::from_xml(reader, &e, false)?));
39893                                #[cfg(feature = "extra-children")]
39894                                {
39895                                    child_idx += 1;
39896                                }
39897                            }
39898                            #[cfg(feature = "sml-tables")]
39899                            b"tableStyleInfo" => {
39900                                f_table_style_info =
39901                                    Some(Box::new(TableStyleInfo::from_xml(reader, &e, false)?));
39902                                #[cfg(feature = "extra-children")]
39903                                {
39904                                    child_idx += 1;
39905                                }
39906                            }
39907                            #[cfg(feature = "sml-extensions")]
39908                            b"extLst" => {
39909                                f_extension_list =
39910                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
39911                                #[cfg(feature = "extra-children")]
39912                                {
39913                                    child_idx += 1;
39914                                }
39915                            }
39916                            #[cfg(feature = "extra-children")]
39917                            _ => {
39918                                // Capture unknown element for roundtrip
39919                                let elem = RawXmlElement::from_reader(reader, &e)?;
39920                                extra_children.push(PositionedNode::new(
39921                                    child_idx,
39922                                    RawXmlNode::Element(elem),
39923                                ));
39924                                child_idx += 1;
39925                            }
39926                            #[cfg(not(feature = "extra-children"))]
39927                            _ => {
39928                                // Skip unknown element
39929                                skip_element(reader)?;
39930                            }
39931                        }
39932                    }
39933                    Event::Empty(e) => {
39934                        match e.local_name().as_ref() {
39935                            #[cfg(feature = "sml-tables")]
39936                            b"autoFilter" => {
39937                                f_auto_filter =
39938                                    Some(Box::new(AutoFilter::from_xml(reader, &e, true)?));
39939                                #[cfg(feature = "extra-children")]
39940                                {
39941                                    child_idx += 1;
39942                                }
39943                            }
39944                            #[cfg(feature = "sml-tables")]
39945                            b"sortState" => {
39946                                f_sort_state =
39947                                    Some(Box::new(SortState::from_xml(reader, &e, true)?));
39948                                #[cfg(feature = "extra-children")]
39949                                {
39950                                    child_idx += 1;
39951                                }
39952                            }
39953                            #[cfg(feature = "sml-tables")]
39954                            b"tableColumns" => {
39955                                f_table_columns =
39956                                    Some(Box::new(TableColumns::from_xml(reader, &e, true)?));
39957                                #[cfg(feature = "extra-children")]
39958                                {
39959                                    child_idx += 1;
39960                                }
39961                            }
39962                            #[cfg(feature = "sml-tables")]
39963                            b"tableStyleInfo" => {
39964                                f_table_style_info =
39965                                    Some(Box::new(TableStyleInfo::from_xml(reader, &e, true)?));
39966                                #[cfg(feature = "extra-children")]
39967                                {
39968                                    child_idx += 1;
39969                                }
39970                            }
39971                            #[cfg(feature = "sml-extensions")]
39972                            b"extLst" => {
39973                                f_extension_list =
39974                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
39975                                #[cfg(feature = "extra-children")]
39976                                {
39977                                    child_idx += 1;
39978                                }
39979                            }
39980                            #[cfg(feature = "extra-children")]
39981                            _ => {
39982                                // Capture unknown empty element for roundtrip
39983                                let elem = RawXmlElement::from_empty(&e);
39984                                extra_children.push(PositionedNode::new(
39985                                    child_idx,
39986                                    RawXmlNode::Element(elem),
39987                                ));
39988                                child_idx += 1;
39989                            }
39990                            #[cfg(not(feature = "extra-children"))]
39991                            _ => {}
39992                        }
39993                    }
39994                    Event::End(_) => break,
39995                    Event::Eof => break,
39996                    _ => {}
39997                }
39998                buf.clear();
39999            }
40000        }
40001
40002        Ok(Self {
40003            #[cfg(feature = "sml-tables")]
40004            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
40005            #[cfg(feature = "sml-tables")]
40006            name: f_name,
40007            #[cfg(feature = "sml-tables")]
40008            display_name: f_display_name
40009                .ok_or_else(|| ParseError::MissingAttribute("displayName".to_string()))?,
40010            #[cfg(feature = "sml-tables")]
40011            comment: f_comment,
40012            #[cfg(feature = "sml-tables")]
40013            reference: f_reference
40014                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
40015            #[cfg(feature = "sml-tables")]
40016            table_type: f_table_type,
40017            #[cfg(feature = "sml-tables")]
40018            header_row_count: f_header_row_count,
40019            #[cfg(feature = "sml-tables")]
40020            insert_row: f_insert_row,
40021            #[cfg(feature = "sml-tables")]
40022            insert_row_shift: f_insert_row_shift,
40023            #[cfg(feature = "sml-tables")]
40024            totals_row_count: f_totals_row_count,
40025            #[cfg(feature = "sml-tables")]
40026            totals_row_shown: f_totals_row_shown,
40027            #[cfg(feature = "sml-tables")]
40028            published: f_published,
40029            #[cfg(feature = "sml-tables")]
40030            header_row_dxf_id: f_header_row_dxf_id,
40031            #[cfg(feature = "sml-tables")]
40032            data_dxf_id: f_data_dxf_id,
40033            #[cfg(feature = "sml-tables")]
40034            totals_row_dxf_id: f_totals_row_dxf_id,
40035            #[cfg(feature = "sml-tables")]
40036            header_row_border_dxf_id: f_header_row_border_dxf_id,
40037            #[cfg(feature = "sml-tables")]
40038            table_border_dxf_id: f_table_border_dxf_id,
40039            #[cfg(feature = "sml-tables")]
40040            totals_row_border_dxf_id: f_totals_row_border_dxf_id,
40041            #[cfg(feature = "sml-tables")]
40042            header_row_cell_style: f_header_row_cell_style,
40043            #[cfg(feature = "sml-tables")]
40044            data_cell_style: f_data_cell_style,
40045            #[cfg(feature = "sml-tables")]
40046            totals_row_cell_style: f_totals_row_cell_style,
40047            #[cfg(feature = "sml-tables")]
40048            connection_id: f_connection_id,
40049            #[cfg(feature = "sml-tables")]
40050            auto_filter: f_auto_filter,
40051            #[cfg(feature = "sml-tables")]
40052            sort_state: f_sort_state,
40053            #[cfg(feature = "sml-tables")]
40054            table_columns: f_table_columns
40055                .ok_or_else(|| ParseError::MissingAttribute("tableColumns".to_string()))?,
40056            #[cfg(feature = "sml-tables")]
40057            table_style_info: f_table_style_info,
40058            #[cfg(feature = "sml-extensions")]
40059            extension_list: f_extension_list,
40060            #[cfg(feature = "extra-attrs")]
40061            extra_attrs,
40062            #[cfg(feature = "extra-children")]
40063            extra_children,
40064        })
40065    }
40066}
40067
40068impl FromXml for TableStyleInfo {
40069    fn from_xml<R: BufRead>(
40070        reader: &mut Reader<R>,
40071        start_tag: &BytesStart,
40072        is_empty: bool,
40073    ) -> Result<Self, ParseError> {
40074        let mut f_name = None;
40075        let mut f_show_first_column = None;
40076        let mut f_show_last_column = None;
40077        let mut f_show_row_stripes = None;
40078        let mut f_show_column_stripes = None;
40079        #[cfg(feature = "extra-attrs")]
40080        let mut extra_attrs = std::collections::HashMap::new();
40081
40082        // Parse attributes
40083        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40084            let val = String::from_utf8_lossy(&attr.value);
40085            match attr.key.local_name().as_ref() {
40086                b"name" => {
40087                    f_name = Some(val.into_owned());
40088                }
40089                b"showFirstColumn" => {
40090                    f_show_first_column = Some(val == "true" || val == "1");
40091                }
40092                b"showLastColumn" => {
40093                    f_show_last_column = Some(val == "true" || val == "1");
40094                }
40095                b"showRowStripes" => {
40096                    f_show_row_stripes = Some(val == "true" || val == "1");
40097                }
40098                b"showColumnStripes" => {
40099                    f_show_column_stripes = Some(val == "true" || val == "1");
40100                }
40101                #[cfg(feature = "extra-attrs")]
40102                unknown => {
40103                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40104                    extra_attrs.insert(key, val.into_owned());
40105                }
40106                #[cfg(not(feature = "extra-attrs"))]
40107                _ => {}
40108            }
40109        }
40110
40111        if !is_empty {
40112            let mut buf = Vec::new();
40113            loop {
40114                match reader.read_event_into(&mut buf)? {
40115                    Event::End(_) => break,
40116                    Event::Eof => break,
40117                    _ => {}
40118                }
40119                buf.clear();
40120            }
40121        }
40122
40123        Ok(Self {
40124            name: f_name,
40125            show_first_column: f_show_first_column,
40126            show_last_column: f_show_last_column,
40127            show_row_stripes: f_show_row_stripes,
40128            show_column_stripes: f_show_column_stripes,
40129            #[cfg(feature = "extra-attrs")]
40130            extra_attrs,
40131        })
40132    }
40133}
40134
40135impl FromXml for TableColumns {
40136    fn from_xml<R: BufRead>(
40137        reader: &mut Reader<R>,
40138        start_tag: &BytesStart,
40139        is_empty: bool,
40140    ) -> Result<Self, ParseError> {
40141        let mut f_count = None;
40142        let mut f_table_column = Vec::new();
40143        #[cfg(feature = "extra-attrs")]
40144        let mut extra_attrs = std::collections::HashMap::new();
40145        #[cfg(feature = "extra-children")]
40146        let mut extra_children = Vec::new();
40147        #[cfg(feature = "extra-children")]
40148        let mut child_idx: usize = 0;
40149
40150        // Parse attributes
40151        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40152            let val = String::from_utf8_lossy(&attr.value);
40153            match attr.key.local_name().as_ref() {
40154                b"count" => {
40155                    f_count = val.parse().ok();
40156                }
40157                #[cfg(feature = "extra-attrs")]
40158                unknown => {
40159                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40160                    extra_attrs.insert(key, val.into_owned());
40161                }
40162                #[cfg(not(feature = "extra-attrs"))]
40163                _ => {}
40164            }
40165        }
40166
40167        // Parse child elements
40168        if !is_empty {
40169            let mut buf = Vec::new();
40170            loop {
40171                match reader.read_event_into(&mut buf)? {
40172                    Event::Start(e) => {
40173                        match e.local_name().as_ref() {
40174                            b"tableColumn" => {
40175                                f_table_column.push(TableColumn::from_xml(reader, &e, false)?);
40176                                #[cfg(feature = "extra-children")]
40177                                {
40178                                    child_idx += 1;
40179                                }
40180                            }
40181                            #[cfg(feature = "extra-children")]
40182                            _ => {
40183                                // Capture unknown element for roundtrip
40184                                let elem = RawXmlElement::from_reader(reader, &e)?;
40185                                extra_children.push(PositionedNode::new(
40186                                    child_idx,
40187                                    RawXmlNode::Element(elem),
40188                                ));
40189                                child_idx += 1;
40190                            }
40191                            #[cfg(not(feature = "extra-children"))]
40192                            _ => {
40193                                // Skip unknown element
40194                                skip_element(reader)?;
40195                            }
40196                        }
40197                    }
40198                    Event::Empty(e) => {
40199                        match e.local_name().as_ref() {
40200                            b"tableColumn" => {
40201                                f_table_column.push(TableColumn::from_xml(reader, &e, true)?);
40202                                #[cfg(feature = "extra-children")]
40203                                {
40204                                    child_idx += 1;
40205                                }
40206                            }
40207                            #[cfg(feature = "extra-children")]
40208                            _ => {
40209                                // Capture unknown empty element for roundtrip
40210                                let elem = RawXmlElement::from_empty(&e);
40211                                extra_children.push(PositionedNode::new(
40212                                    child_idx,
40213                                    RawXmlNode::Element(elem),
40214                                ));
40215                                child_idx += 1;
40216                            }
40217                            #[cfg(not(feature = "extra-children"))]
40218                            _ => {}
40219                        }
40220                    }
40221                    Event::End(_) => break,
40222                    Event::Eof => break,
40223                    _ => {}
40224                }
40225                buf.clear();
40226            }
40227        }
40228
40229        Ok(Self {
40230            count: f_count,
40231            table_column: f_table_column,
40232            #[cfg(feature = "extra-attrs")]
40233            extra_attrs,
40234            #[cfg(feature = "extra-children")]
40235            extra_children,
40236        })
40237    }
40238}
40239
40240impl FromXml for TableColumn {
40241    fn from_xml<R: BufRead>(
40242        reader: &mut Reader<R>,
40243        start_tag: &BytesStart,
40244        is_empty: bool,
40245    ) -> Result<Self, ParseError> {
40246        let mut f_id: Option<u32> = None;
40247        let mut f_unique_name = None;
40248        let mut f_name: Option<XmlString> = None;
40249        let mut f_totals_row_function = None;
40250        let mut f_totals_row_label = None;
40251        let mut f_query_table_field_id = None;
40252        let mut f_header_row_dxf_id = None;
40253        let mut f_data_dxf_id = None;
40254        let mut f_totals_row_dxf_id = None;
40255        let mut f_header_row_cell_style = None;
40256        let mut f_data_cell_style = None;
40257        let mut f_totals_row_cell_style = None;
40258        let mut f_calculated_column_formula = None;
40259        let mut f_totals_row_formula = None;
40260        let mut f_xml_column_pr = None;
40261        let mut f_extension_list = None;
40262        #[cfg(feature = "extra-attrs")]
40263        let mut extra_attrs = std::collections::HashMap::new();
40264        #[cfg(feature = "extra-children")]
40265        let mut extra_children = Vec::new();
40266        #[cfg(feature = "extra-children")]
40267        let mut child_idx: usize = 0;
40268
40269        // Parse attributes
40270        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40271            let val = String::from_utf8_lossy(&attr.value);
40272            match attr.key.local_name().as_ref() {
40273                b"id" => {
40274                    f_id = val.parse().ok();
40275                }
40276                b"uniqueName" => {
40277                    f_unique_name = Some(val.into_owned());
40278                }
40279                b"name" => {
40280                    f_name = Some(val.into_owned());
40281                }
40282                b"totalsRowFunction" => {
40283                    f_totals_row_function = val.parse().ok();
40284                }
40285                b"totalsRowLabel" => {
40286                    f_totals_row_label = Some(val.into_owned());
40287                }
40288                b"queryTableFieldId" => {
40289                    f_query_table_field_id = val.parse().ok();
40290                }
40291                b"headerRowDxfId" => {
40292                    f_header_row_dxf_id = val.parse().ok();
40293                }
40294                b"dataDxfId" => {
40295                    f_data_dxf_id = val.parse().ok();
40296                }
40297                b"totalsRowDxfId" => {
40298                    f_totals_row_dxf_id = val.parse().ok();
40299                }
40300                b"headerRowCellStyle" => {
40301                    f_header_row_cell_style = Some(val.into_owned());
40302                }
40303                b"dataCellStyle" => {
40304                    f_data_cell_style = Some(val.into_owned());
40305                }
40306                b"totalsRowCellStyle" => {
40307                    f_totals_row_cell_style = Some(val.into_owned());
40308                }
40309                #[cfg(feature = "extra-attrs")]
40310                unknown => {
40311                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40312                    extra_attrs.insert(key, val.into_owned());
40313                }
40314                #[cfg(not(feature = "extra-attrs"))]
40315                _ => {}
40316            }
40317        }
40318
40319        // Parse child elements
40320        if !is_empty {
40321            let mut buf = Vec::new();
40322            loop {
40323                match reader.read_event_into(&mut buf)? {
40324                    Event::Start(e) => {
40325                        match e.local_name().as_ref() {
40326                            b"calculatedColumnFormula" => {
40327                                f_calculated_column_formula =
40328                                    Some(Box::new(TableFormula::from_xml(reader, &e, false)?));
40329                                #[cfg(feature = "extra-children")]
40330                                {
40331                                    child_idx += 1;
40332                                }
40333                            }
40334                            b"totalsRowFormula" => {
40335                                f_totals_row_formula =
40336                                    Some(Box::new(TableFormula::from_xml(reader, &e, false)?));
40337                                #[cfg(feature = "extra-children")]
40338                                {
40339                                    child_idx += 1;
40340                                }
40341                            }
40342                            b"xmlColumnPr" => {
40343                                f_xml_column_pr = Some(Box::new(XmlColumnProperties::from_xml(
40344                                    reader, &e, false,
40345                                )?));
40346                                #[cfg(feature = "extra-children")]
40347                                {
40348                                    child_idx += 1;
40349                                }
40350                            }
40351                            b"extLst" => {
40352                                f_extension_list =
40353                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
40354                                #[cfg(feature = "extra-children")]
40355                                {
40356                                    child_idx += 1;
40357                                }
40358                            }
40359                            #[cfg(feature = "extra-children")]
40360                            _ => {
40361                                // Capture unknown element for roundtrip
40362                                let elem = RawXmlElement::from_reader(reader, &e)?;
40363                                extra_children.push(PositionedNode::new(
40364                                    child_idx,
40365                                    RawXmlNode::Element(elem),
40366                                ));
40367                                child_idx += 1;
40368                            }
40369                            #[cfg(not(feature = "extra-children"))]
40370                            _ => {
40371                                // Skip unknown element
40372                                skip_element(reader)?;
40373                            }
40374                        }
40375                    }
40376                    Event::Empty(e) => {
40377                        match e.local_name().as_ref() {
40378                            b"calculatedColumnFormula" => {
40379                                f_calculated_column_formula =
40380                                    Some(Box::new(TableFormula::from_xml(reader, &e, true)?));
40381                                #[cfg(feature = "extra-children")]
40382                                {
40383                                    child_idx += 1;
40384                                }
40385                            }
40386                            b"totalsRowFormula" => {
40387                                f_totals_row_formula =
40388                                    Some(Box::new(TableFormula::from_xml(reader, &e, true)?));
40389                                #[cfg(feature = "extra-children")]
40390                                {
40391                                    child_idx += 1;
40392                                }
40393                            }
40394                            b"xmlColumnPr" => {
40395                                f_xml_column_pr = Some(Box::new(XmlColumnProperties::from_xml(
40396                                    reader, &e, true,
40397                                )?));
40398                                #[cfg(feature = "extra-children")]
40399                                {
40400                                    child_idx += 1;
40401                                }
40402                            }
40403                            b"extLst" => {
40404                                f_extension_list =
40405                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
40406                                #[cfg(feature = "extra-children")]
40407                                {
40408                                    child_idx += 1;
40409                                }
40410                            }
40411                            #[cfg(feature = "extra-children")]
40412                            _ => {
40413                                // Capture unknown empty element for roundtrip
40414                                let elem = RawXmlElement::from_empty(&e);
40415                                extra_children.push(PositionedNode::new(
40416                                    child_idx,
40417                                    RawXmlNode::Element(elem),
40418                                ));
40419                                child_idx += 1;
40420                            }
40421                            #[cfg(not(feature = "extra-children"))]
40422                            _ => {}
40423                        }
40424                    }
40425                    Event::End(_) => break,
40426                    Event::Eof => break,
40427                    _ => {}
40428                }
40429                buf.clear();
40430            }
40431        }
40432
40433        Ok(Self {
40434            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
40435            unique_name: f_unique_name,
40436            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
40437            totals_row_function: f_totals_row_function,
40438            totals_row_label: f_totals_row_label,
40439            query_table_field_id: f_query_table_field_id,
40440            header_row_dxf_id: f_header_row_dxf_id,
40441            data_dxf_id: f_data_dxf_id,
40442            totals_row_dxf_id: f_totals_row_dxf_id,
40443            header_row_cell_style: f_header_row_cell_style,
40444            data_cell_style: f_data_cell_style,
40445            totals_row_cell_style: f_totals_row_cell_style,
40446            calculated_column_formula: f_calculated_column_formula,
40447            totals_row_formula: f_totals_row_formula,
40448            xml_column_pr: f_xml_column_pr,
40449            extension_list: f_extension_list,
40450            #[cfg(feature = "extra-attrs")]
40451            extra_attrs,
40452            #[cfg(feature = "extra-children")]
40453            extra_children,
40454        })
40455    }
40456}
40457
40458impl FromXml for TableFormula {
40459    fn from_xml<R: BufRead>(
40460        reader: &mut Reader<R>,
40461        start_tag: &BytesStart,
40462        is_empty: bool,
40463    ) -> Result<Self, ParseError> {
40464        let mut f_text = None;
40465        let mut f_array = None;
40466        #[cfg(feature = "extra-attrs")]
40467        let mut extra_attrs = std::collections::HashMap::new();
40468        #[cfg(feature = "extra-children")]
40469        let mut extra_children = Vec::new();
40470        #[cfg(feature = "extra-children")]
40471        let mut child_idx: usize = 0;
40472
40473        // Parse attributes
40474        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40475            let val = String::from_utf8_lossy(&attr.value);
40476            match attr.key.local_name().as_ref() {
40477                b"array" => {
40478                    f_array = Some(val == "true" || val == "1");
40479                }
40480                #[cfg(feature = "extra-attrs")]
40481                unknown => {
40482                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40483                    extra_attrs.insert(key, val.into_owned());
40484                }
40485                #[cfg(not(feature = "extra-attrs"))]
40486                _ => {}
40487            }
40488        }
40489
40490        // Parse child elements
40491        if !is_empty {
40492            let mut buf = Vec::new();
40493            loop {
40494                match reader.read_event_into(&mut buf)? {
40495                    Event::Start(e) => {
40496                        match e.local_name().as_ref() {
40497                            #[cfg(feature = "extra-children")]
40498                            _ => {
40499                                // Capture unknown element for roundtrip
40500                                let elem = RawXmlElement::from_reader(reader, &e)?;
40501                                extra_children.push(PositionedNode::new(
40502                                    child_idx,
40503                                    RawXmlNode::Element(elem),
40504                                ));
40505                                child_idx += 1;
40506                            }
40507                            #[cfg(not(feature = "extra-children"))]
40508                            _ => {
40509                                // Skip unknown element
40510                                skip_element(reader)?;
40511                            }
40512                        }
40513                    }
40514                    Event::Empty(e) => {
40515                        match e.local_name().as_ref() {
40516                            #[cfg(feature = "extra-children")]
40517                            _ => {
40518                                // Capture unknown empty element for roundtrip
40519                                let elem = RawXmlElement::from_empty(&e);
40520                                extra_children.push(PositionedNode::new(
40521                                    child_idx,
40522                                    RawXmlNode::Element(elem),
40523                                ));
40524                                child_idx += 1;
40525                            }
40526                            #[cfg(not(feature = "extra-children"))]
40527                            _ => {}
40528                        }
40529                    }
40530                    Event::Text(e) => {
40531                        let s = e.decode().unwrap_or_default();
40532                        f_text.get_or_insert_with(String::new).push_str(&s);
40533                    }
40534                    Event::GeneralRef(e) => {
40535                        let name = e.decode().unwrap_or_default();
40536                        if let Some(s) = quick_xml::escape::resolve_xml_entity(&name) {
40537                            f_text.get_or_insert_with(String::new).push_str(s);
40538                        }
40539                    }
40540                    Event::End(_) => break,
40541                    Event::Eof => break,
40542                    _ => {}
40543                }
40544                buf.clear();
40545            }
40546        }
40547
40548        Ok(Self {
40549            text: f_text,
40550            array: f_array,
40551            #[cfg(feature = "extra-attrs")]
40552            extra_attrs,
40553            #[cfg(feature = "extra-children")]
40554            extra_children,
40555        })
40556    }
40557}
40558
40559impl FromXml for XmlColumnProperties {
40560    fn from_xml<R: BufRead>(
40561        reader: &mut Reader<R>,
40562        start_tag: &BytesStart,
40563        is_empty: bool,
40564    ) -> Result<Self, ParseError> {
40565        let mut f_map_id: Option<u32> = None;
40566        let mut f_xpath: Option<XmlString> = None;
40567        let mut f_denormalized = None;
40568        let mut f_xml_data_type: Option<STXmlDataType> = None;
40569        let mut f_extension_list = None;
40570        #[cfg(feature = "extra-attrs")]
40571        let mut extra_attrs = std::collections::HashMap::new();
40572        #[cfg(feature = "extra-children")]
40573        let mut extra_children = Vec::new();
40574        #[cfg(feature = "extra-children")]
40575        let mut child_idx: usize = 0;
40576
40577        // Parse attributes
40578        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40579            let val = String::from_utf8_lossy(&attr.value);
40580            match attr.key.local_name().as_ref() {
40581                b"mapId" => {
40582                    f_map_id = val.parse().ok();
40583                }
40584                b"xpath" => {
40585                    f_xpath = Some(val.into_owned());
40586                }
40587                b"denormalized" => {
40588                    f_denormalized = Some(val == "true" || val == "1");
40589                }
40590                b"xmlDataType" => {
40591                    f_xml_data_type = Some(val.into_owned());
40592                }
40593                #[cfg(feature = "extra-attrs")]
40594                unknown => {
40595                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40596                    extra_attrs.insert(key, val.into_owned());
40597                }
40598                #[cfg(not(feature = "extra-attrs"))]
40599                _ => {}
40600            }
40601        }
40602
40603        // Parse child elements
40604        if !is_empty {
40605            let mut buf = Vec::new();
40606            loop {
40607                match reader.read_event_into(&mut buf)? {
40608                    Event::Start(e) => {
40609                        match e.local_name().as_ref() {
40610                            b"extLst" => {
40611                                f_extension_list =
40612                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
40613                                #[cfg(feature = "extra-children")]
40614                                {
40615                                    child_idx += 1;
40616                                }
40617                            }
40618                            #[cfg(feature = "extra-children")]
40619                            _ => {
40620                                // Capture unknown element for roundtrip
40621                                let elem = RawXmlElement::from_reader(reader, &e)?;
40622                                extra_children.push(PositionedNode::new(
40623                                    child_idx,
40624                                    RawXmlNode::Element(elem),
40625                                ));
40626                                child_idx += 1;
40627                            }
40628                            #[cfg(not(feature = "extra-children"))]
40629                            _ => {
40630                                // Skip unknown element
40631                                skip_element(reader)?;
40632                            }
40633                        }
40634                    }
40635                    Event::Empty(e) => {
40636                        match e.local_name().as_ref() {
40637                            b"extLst" => {
40638                                f_extension_list =
40639                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
40640                                #[cfg(feature = "extra-children")]
40641                                {
40642                                    child_idx += 1;
40643                                }
40644                            }
40645                            #[cfg(feature = "extra-children")]
40646                            _ => {
40647                                // Capture unknown empty element for roundtrip
40648                                let elem = RawXmlElement::from_empty(&e);
40649                                extra_children.push(PositionedNode::new(
40650                                    child_idx,
40651                                    RawXmlNode::Element(elem),
40652                                ));
40653                                child_idx += 1;
40654                            }
40655                            #[cfg(not(feature = "extra-children"))]
40656                            _ => {}
40657                        }
40658                    }
40659                    Event::End(_) => break,
40660                    Event::Eof => break,
40661                    _ => {}
40662                }
40663                buf.clear();
40664            }
40665        }
40666
40667        Ok(Self {
40668            map_id: f_map_id.ok_or_else(|| ParseError::MissingAttribute("mapId".to_string()))?,
40669            xpath: f_xpath.ok_or_else(|| ParseError::MissingAttribute("xpath".to_string()))?,
40670            denormalized: f_denormalized,
40671            xml_data_type: f_xml_data_type
40672                .ok_or_else(|| ParseError::MissingAttribute("xmlDataType".to_string()))?,
40673            extension_list: f_extension_list,
40674            #[cfg(feature = "extra-attrs")]
40675            extra_attrs,
40676            #[cfg(feature = "extra-children")]
40677            extra_children,
40678        })
40679    }
40680}
40681
40682impl FromXml for CTVolTypes {
40683    fn from_xml<R: BufRead>(
40684        reader: &mut Reader<R>,
40685        start_tag: &BytesStart,
40686        is_empty: bool,
40687    ) -> Result<Self, ParseError> {
40688        let mut f_vol_type = Vec::new();
40689        let mut f_extension_list = None;
40690        #[cfg(feature = "extra-children")]
40691        let mut extra_children = Vec::new();
40692        #[cfg(feature = "extra-children")]
40693        let mut child_idx: usize = 0;
40694
40695        // Parse child elements
40696        if !is_empty {
40697            let mut buf = Vec::new();
40698            loop {
40699                match reader.read_event_into(&mut buf)? {
40700                    Event::Start(e) => {
40701                        match e.local_name().as_ref() {
40702                            b"volType" => {
40703                                f_vol_type.push(CTVolType::from_xml(reader, &e, false)?);
40704                                #[cfg(feature = "extra-children")]
40705                                {
40706                                    child_idx += 1;
40707                                }
40708                            }
40709                            b"extLst" => {
40710                                f_extension_list =
40711                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
40712                                #[cfg(feature = "extra-children")]
40713                                {
40714                                    child_idx += 1;
40715                                }
40716                            }
40717                            #[cfg(feature = "extra-children")]
40718                            _ => {
40719                                // Capture unknown element for roundtrip
40720                                let elem = RawXmlElement::from_reader(reader, &e)?;
40721                                extra_children.push(PositionedNode::new(
40722                                    child_idx,
40723                                    RawXmlNode::Element(elem),
40724                                ));
40725                                child_idx += 1;
40726                            }
40727                            #[cfg(not(feature = "extra-children"))]
40728                            _ => {
40729                                // Skip unknown element
40730                                skip_element(reader)?;
40731                            }
40732                        }
40733                    }
40734                    Event::Empty(e) => {
40735                        match e.local_name().as_ref() {
40736                            b"volType" => {
40737                                f_vol_type.push(CTVolType::from_xml(reader, &e, true)?);
40738                                #[cfg(feature = "extra-children")]
40739                                {
40740                                    child_idx += 1;
40741                                }
40742                            }
40743                            b"extLst" => {
40744                                f_extension_list =
40745                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
40746                                #[cfg(feature = "extra-children")]
40747                                {
40748                                    child_idx += 1;
40749                                }
40750                            }
40751                            #[cfg(feature = "extra-children")]
40752                            _ => {
40753                                // Capture unknown empty element for roundtrip
40754                                let elem = RawXmlElement::from_empty(&e);
40755                                extra_children.push(PositionedNode::new(
40756                                    child_idx,
40757                                    RawXmlNode::Element(elem),
40758                                ));
40759                                child_idx += 1;
40760                            }
40761                            #[cfg(not(feature = "extra-children"))]
40762                            _ => {}
40763                        }
40764                    }
40765                    Event::End(_) => break,
40766                    Event::Eof => break,
40767                    _ => {}
40768                }
40769                buf.clear();
40770            }
40771        }
40772
40773        Ok(Self {
40774            vol_type: f_vol_type,
40775            extension_list: f_extension_list,
40776            #[cfg(feature = "extra-children")]
40777            extra_children,
40778        })
40779    }
40780}
40781
40782impl FromXml for CTVolType {
40783    fn from_xml<R: BufRead>(
40784        reader: &mut Reader<R>,
40785        start_tag: &BytesStart,
40786        is_empty: bool,
40787    ) -> Result<Self, ParseError> {
40788        let mut f_type: Option<STVolDepType> = None;
40789        let mut f_main = Vec::new();
40790        #[cfg(feature = "extra-attrs")]
40791        let mut extra_attrs = std::collections::HashMap::new();
40792        #[cfg(feature = "extra-children")]
40793        let mut extra_children = Vec::new();
40794        #[cfg(feature = "extra-children")]
40795        let mut child_idx: usize = 0;
40796
40797        // Parse attributes
40798        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40799            let val = String::from_utf8_lossy(&attr.value);
40800            match attr.key.local_name().as_ref() {
40801                b"type" => {
40802                    f_type = val.parse().ok();
40803                }
40804                #[cfg(feature = "extra-attrs")]
40805                unknown => {
40806                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40807                    extra_attrs.insert(key, val.into_owned());
40808                }
40809                #[cfg(not(feature = "extra-attrs"))]
40810                _ => {}
40811            }
40812        }
40813
40814        // Parse child elements
40815        if !is_empty {
40816            let mut buf = Vec::new();
40817            loop {
40818                match reader.read_event_into(&mut buf)? {
40819                    Event::Start(e) => {
40820                        match e.local_name().as_ref() {
40821                            b"main" => {
40822                                f_main.push(CTVolMain::from_xml(reader, &e, false)?);
40823                                #[cfg(feature = "extra-children")]
40824                                {
40825                                    child_idx += 1;
40826                                }
40827                            }
40828                            #[cfg(feature = "extra-children")]
40829                            _ => {
40830                                // Capture unknown element for roundtrip
40831                                let elem = RawXmlElement::from_reader(reader, &e)?;
40832                                extra_children.push(PositionedNode::new(
40833                                    child_idx,
40834                                    RawXmlNode::Element(elem),
40835                                ));
40836                                child_idx += 1;
40837                            }
40838                            #[cfg(not(feature = "extra-children"))]
40839                            _ => {
40840                                // Skip unknown element
40841                                skip_element(reader)?;
40842                            }
40843                        }
40844                    }
40845                    Event::Empty(e) => {
40846                        match e.local_name().as_ref() {
40847                            b"main" => {
40848                                f_main.push(CTVolMain::from_xml(reader, &e, true)?);
40849                                #[cfg(feature = "extra-children")]
40850                                {
40851                                    child_idx += 1;
40852                                }
40853                            }
40854                            #[cfg(feature = "extra-children")]
40855                            _ => {
40856                                // Capture unknown empty element for roundtrip
40857                                let elem = RawXmlElement::from_empty(&e);
40858                                extra_children.push(PositionedNode::new(
40859                                    child_idx,
40860                                    RawXmlNode::Element(elem),
40861                                ));
40862                                child_idx += 1;
40863                            }
40864                            #[cfg(not(feature = "extra-children"))]
40865                            _ => {}
40866                        }
40867                    }
40868                    Event::End(_) => break,
40869                    Event::Eof => break,
40870                    _ => {}
40871                }
40872                buf.clear();
40873            }
40874        }
40875
40876        Ok(Self {
40877            r#type: f_type.ok_or_else(|| ParseError::MissingAttribute("type".to_string()))?,
40878            main: f_main,
40879            #[cfg(feature = "extra-attrs")]
40880            extra_attrs,
40881            #[cfg(feature = "extra-children")]
40882            extra_children,
40883        })
40884    }
40885}
40886
40887impl FromXml for CTVolMain {
40888    fn from_xml<R: BufRead>(
40889        reader: &mut Reader<R>,
40890        start_tag: &BytesStart,
40891        is_empty: bool,
40892    ) -> Result<Self, ParseError> {
40893        let mut f_first: Option<XmlString> = None;
40894        let mut f_tp = Vec::new();
40895        #[cfg(feature = "extra-attrs")]
40896        let mut extra_attrs = std::collections::HashMap::new();
40897        #[cfg(feature = "extra-children")]
40898        let mut extra_children = Vec::new();
40899        #[cfg(feature = "extra-children")]
40900        let mut child_idx: usize = 0;
40901
40902        // Parse attributes
40903        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
40904            let val = String::from_utf8_lossy(&attr.value);
40905            match attr.key.local_name().as_ref() {
40906                b"first" => {
40907                    f_first = Some(val.into_owned());
40908                }
40909                #[cfg(feature = "extra-attrs")]
40910                unknown => {
40911                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
40912                    extra_attrs.insert(key, val.into_owned());
40913                }
40914                #[cfg(not(feature = "extra-attrs"))]
40915                _ => {}
40916            }
40917        }
40918
40919        // Parse child elements
40920        if !is_empty {
40921            let mut buf = Vec::new();
40922            loop {
40923                match reader.read_event_into(&mut buf)? {
40924                    Event::Start(e) => {
40925                        match e.local_name().as_ref() {
40926                            b"tp" => {
40927                                f_tp.push(CTVolTopic::from_xml(reader, &e, false)?);
40928                                #[cfg(feature = "extra-children")]
40929                                {
40930                                    child_idx += 1;
40931                                }
40932                            }
40933                            #[cfg(feature = "extra-children")]
40934                            _ => {
40935                                // Capture unknown element for roundtrip
40936                                let elem = RawXmlElement::from_reader(reader, &e)?;
40937                                extra_children.push(PositionedNode::new(
40938                                    child_idx,
40939                                    RawXmlNode::Element(elem),
40940                                ));
40941                                child_idx += 1;
40942                            }
40943                            #[cfg(not(feature = "extra-children"))]
40944                            _ => {
40945                                // Skip unknown element
40946                                skip_element(reader)?;
40947                            }
40948                        }
40949                    }
40950                    Event::Empty(e) => {
40951                        match e.local_name().as_ref() {
40952                            b"tp" => {
40953                                f_tp.push(CTVolTopic::from_xml(reader, &e, true)?);
40954                                #[cfg(feature = "extra-children")]
40955                                {
40956                                    child_idx += 1;
40957                                }
40958                            }
40959                            #[cfg(feature = "extra-children")]
40960                            _ => {
40961                                // Capture unknown empty element for roundtrip
40962                                let elem = RawXmlElement::from_empty(&e);
40963                                extra_children.push(PositionedNode::new(
40964                                    child_idx,
40965                                    RawXmlNode::Element(elem),
40966                                ));
40967                                child_idx += 1;
40968                            }
40969                            #[cfg(not(feature = "extra-children"))]
40970                            _ => {}
40971                        }
40972                    }
40973                    Event::End(_) => break,
40974                    Event::Eof => break,
40975                    _ => {}
40976                }
40977                buf.clear();
40978            }
40979        }
40980
40981        Ok(Self {
40982            first: f_first.ok_or_else(|| ParseError::MissingAttribute("first".to_string()))?,
40983            tp: f_tp,
40984            #[cfg(feature = "extra-attrs")]
40985            extra_attrs,
40986            #[cfg(feature = "extra-children")]
40987            extra_children,
40988        })
40989    }
40990}
40991
40992impl FromXml for CTVolTopic {
40993    fn from_xml<R: BufRead>(
40994        reader: &mut Reader<R>,
40995        start_tag: &BytesStart,
40996        is_empty: bool,
40997    ) -> Result<Self, ParseError> {
40998        let mut f_cell_type = None;
40999        let mut f_value: Option<XmlString> = None;
41000        let mut f_stp = Vec::new();
41001        let mut f_tr = Vec::new();
41002        #[cfg(feature = "extra-attrs")]
41003        let mut extra_attrs = std::collections::HashMap::new();
41004        #[cfg(feature = "extra-children")]
41005        let mut extra_children = Vec::new();
41006        #[cfg(feature = "extra-children")]
41007        let mut child_idx: usize = 0;
41008
41009        // Parse attributes
41010        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
41011            let val = String::from_utf8_lossy(&attr.value);
41012            match attr.key.local_name().as_ref() {
41013                b"t" => {
41014                    f_cell_type = val.parse().ok();
41015                }
41016                #[cfg(feature = "extra-attrs")]
41017                unknown => {
41018                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
41019                    extra_attrs.insert(key, val.into_owned());
41020                }
41021                #[cfg(not(feature = "extra-attrs"))]
41022                _ => {}
41023            }
41024        }
41025
41026        // Parse child elements
41027        if !is_empty {
41028            let mut buf = Vec::new();
41029            loop {
41030                match reader.read_event_into(&mut buf)? {
41031                    Event::Start(e) => {
41032                        match e.local_name().as_ref() {
41033                            b"v" => {
41034                                f_value = Some(read_text_content(reader)?);
41035                                #[cfg(feature = "extra-children")]
41036                                {
41037                                    child_idx += 1;
41038                                }
41039                            }
41040                            b"stp" => {
41041                                f_stp.push(read_text_content(reader)?);
41042                                #[cfg(feature = "extra-children")]
41043                                {
41044                                    child_idx += 1;
41045                                }
41046                            }
41047                            b"tr" => {
41048                                f_tr.push(CTVolTopicRef::from_xml(reader, &e, false)?);
41049                                #[cfg(feature = "extra-children")]
41050                                {
41051                                    child_idx += 1;
41052                                }
41053                            }
41054                            #[cfg(feature = "extra-children")]
41055                            _ => {
41056                                // Capture unknown element for roundtrip
41057                                let elem = RawXmlElement::from_reader(reader, &e)?;
41058                                extra_children.push(PositionedNode::new(
41059                                    child_idx,
41060                                    RawXmlNode::Element(elem),
41061                                ));
41062                                child_idx += 1;
41063                            }
41064                            #[cfg(not(feature = "extra-children"))]
41065                            _ => {
41066                                // Skip unknown element
41067                                skip_element(reader)?;
41068                            }
41069                        }
41070                    }
41071                    Event::Empty(e) => {
41072                        match e.local_name().as_ref() {
41073                            b"v" => {
41074                                f_value = Some(String::new());
41075                                #[cfg(feature = "extra-children")]
41076                                {
41077                                    child_idx += 1;
41078                                }
41079                            }
41080                            b"stp" => {
41081                                f_stp.push(String::new());
41082                                #[cfg(feature = "extra-children")]
41083                                {
41084                                    child_idx += 1;
41085                                }
41086                            }
41087                            b"tr" => {
41088                                f_tr.push(CTVolTopicRef::from_xml(reader, &e, true)?);
41089                                #[cfg(feature = "extra-children")]
41090                                {
41091                                    child_idx += 1;
41092                                }
41093                            }
41094                            #[cfg(feature = "extra-children")]
41095                            _ => {
41096                                // Capture unknown empty element for roundtrip
41097                                let elem = RawXmlElement::from_empty(&e);
41098                                extra_children.push(PositionedNode::new(
41099                                    child_idx,
41100                                    RawXmlNode::Element(elem),
41101                                ));
41102                                child_idx += 1;
41103                            }
41104                            #[cfg(not(feature = "extra-children"))]
41105                            _ => {}
41106                        }
41107                    }
41108                    Event::End(_) => break,
41109                    Event::Eof => break,
41110                    _ => {}
41111                }
41112                buf.clear();
41113            }
41114        }
41115
41116        Ok(Self {
41117            cell_type: f_cell_type,
41118            value: f_value.ok_or_else(|| ParseError::MissingAttribute("v".to_string()))?,
41119            stp: f_stp,
41120            tr: f_tr,
41121            #[cfg(feature = "extra-attrs")]
41122            extra_attrs,
41123            #[cfg(feature = "extra-children")]
41124            extra_children,
41125        })
41126    }
41127}
41128
41129impl FromXml for CTVolTopicRef {
41130    fn from_xml<R: BufRead>(
41131        reader: &mut Reader<R>,
41132        start_tag: &BytesStart,
41133        is_empty: bool,
41134    ) -> Result<Self, ParseError> {
41135        let mut f_reference: Option<CellRef> = None;
41136        let mut f_style_index: Option<u32> = None;
41137        #[cfg(feature = "extra-attrs")]
41138        let mut extra_attrs = std::collections::HashMap::new();
41139
41140        // Parse attributes
41141        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
41142            let val = String::from_utf8_lossy(&attr.value);
41143            match attr.key.local_name().as_ref() {
41144                b"r" => {
41145                    f_reference = Some(val.into_owned());
41146                }
41147                b"s" => {
41148                    f_style_index = val.parse().ok();
41149                }
41150                #[cfg(feature = "extra-attrs")]
41151                unknown => {
41152                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
41153                    extra_attrs.insert(key, val.into_owned());
41154                }
41155                #[cfg(not(feature = "extra-attrs"))]
41156                _ => {}
41157            }
41158        }
41159
41160        if !is_empty {
41161            let mut buf = Vec::new();
41162            loop {
41163                match reader.read_event_into(&mut buf)? {
41164                    Event::End(_) => break,
41165                    Event::Eof => break,
41166                    _ => {}
41167                }
41168                buf.clear();
41169            }
41170        }
41171
41172        Ok(Self {
41173            reference: f_reference.ok_or_else(|| ParseError::MissingAttribute("r".to_string()))?,
41174            style_index: f_style_index
41175                .ok_or_else(|| ParseError::MissingAttribute("s".to_string()))?,
41176            #[cfg(feature = "extra-attrs")]
41177            extra_attrs,
41178        })
41179    }
41180}
41181
41182impl FromXml for Workbook {
41183    fn from_xml<R: BufRead>(
41184        reader: &mut Reader<R>,
41185        start_tag: &BytesStart,
41186        is_empty: bool,
41187    ) -> Result<Self, ParseError> {
41188        let mut f_conformance = None;
41189        let mut f_file_version = None;
41190        #[cfg(feature = "sml-protection")]
41191        let mut f_file_sharing = None;
41192        let mut f_workbook_pr = None;
41193        #[cfg(feature = "sml-protection")]
41194        let mut f_workbook_protection = None;
41195        let mut f_book_views = None;
41196        let mut f_sheets: Option<Box<Sheets>> = None;
41197        #[cfg(feature = "sml-formulas-advanced")]
41198        let mut f_function_groups = None;
41199        #[cfg(feature = "sml-external")]
41200        let mut f_external_references = None;
41201        let mut f_defined_names = None;
41202        #[cfg(feature = "sml-formulas")]
41203        let mut f_calc_pr = None;
41204        #[cfg(feature = "sml-external")]
41205        let mut f_ole_size = None;
41206        #[cfg(feature = "sml-structure")]
41207        let mut f_custom_workbook_views = None;
41208        #[cfg(feature = "sml-pivot")]
41209        let mut f_pivot_caches = None;
41210        #[cfg(feature = "sml-metadata")]
41211        let mut f_smart_tag_pr = None;
41212        #[cfg(feature = "sml-metadata")]
41213        let mut f_smart_tag_types = None;
41214        #[cfg(feature = "sml-external")]
41215        let mut f_web_publishing = None;
41216        let mut f_file_recovery_pr = Vec::new();
41217        #[cfg(feature = "sml-external")]
41218        let mut f_web_publish_objects = None;
41219        #[cfg(feature = "sml-extensions")]
41220        let mut f_extension_list = None;
41221        #[cfg(feature = "extra-attrs")]
41222        let mut extra_attrs = std::collections::HashMap::new();
41223        #[cfg(feature = "extra-children")]
41224        let mut extra_children = Vec::new();
41225        #[cfg(feature = "extra-children")]
41226        let mut child_idx: usize = 0;
41227
41228        // Parse attributes
41229        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
41230            let val = String::from_utf8_lossy(&attr.value);
41231            match attr.key.local_name().as_ref() {
41232                b"conformance" => {
41233                    f_conformance = val.parse().ok();
41234                }
41235                #[cfg(feature = "extra-attrs")]
41236                unknown => {
41237                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
41238                    extra_attrs.insert(key, val.into_owned());
41239                }
41240                #[cfg(not(feature = "extra-attrs"))]
41241                _ => {}
41242            }
41243        }
41244
41245        // Parse child elements
41246        if !is_empty {
41247            let mut buf = Vec::new();
41248            loop {
41249                match reader.read_event_into(&mut buf)? {
41250                    Event::Start(e) => {
41251                        match e.local_name().as_ref() {
41252                            b"fileVersion" => {
41253                                f_file_version =
41254                                    Some(Box::new(FileVersion::from_xml(reader, &e, false)?));
41255                                #[cfg(feature = "extra-children")]
41256                                {
41257                                    child_idx += 1;
41258                                }
41259                            }
41260                            #[cfg(feature = "sml-protection")]
41261                            b"fileSharing" => {
41262                                f_file_sharing =
41263                                    Some(Box::new(FileSharing::from_xml(reader, &e, false)?));
41264                                #[cfg(feature = "extra-children")]
41265                                {
41266                                    child_idx += 1;
41267                                }
41268                            }
41269                            b"workbookPr" => {
41270                                f_workbook_pr = Some(Box::new(WorkbookProperties::from_xml(
41271                                    reader, &e, false,
41272                                )?));
41273                                #[cfg(feature = "extra-children")]
41274                                {
41275                                    child_idx += 1;
41276                                }
41277                            }
41278                            #[cfg(feature = "sml-protection")]
41279                            b"workbookProtection" => {
41280                                f_workbook_protection = Some(Box::new(
41281                                    WorkbookProtection::from_xml(reader, &e, false)?,
41282                                ));
41283                                #[cfg(feature = "extra-children")]
41284                                {
41285                                    child_idx += 1;
41286                                }
41287                            }
41288                            b"bookViews" => {
41289                                f_book_views =
41290                                    Some(Box::new(BookViews::from_xml(reader, &e, false)?));
41291                                #[cfg(feature = "extra-children")]
41292                                {
41293                                    child_idx += 1;
41294                                }
41295                            }
41296                            b"sheets" => {
41297                                f_sheets = Some(Box::new(Sheets::from_xml(reader, &e, false)?));
41298                                #[cfg(feature = "extra-children")]
41299                                {
41300                                    child_idx += 1;
41301                                }
41302                            }
41303                            #[cfg(feature = "sml-formulas-advanced")]
41304                            b"functionGroups" => {
41305                                f_function_groups =
41306                                    Some(Box::new(CTFunctionGroups::from_xml(reader, &e, false)?));
41307                                #[cfg(feature = "extra-children")]
41308                                {
41309                                    child_idx += 1;
41310                                }
41311                            }
41312                            #[cfg(feature = "sml-external")]
41313                            b"externalReferences" => {
41314                                f_external_references = Some(Box::new(
41315                                    ExternalReferences::from_xml(reader, &e, false)?,
41316                                ));
41317                                #[cfg(feature = "extra-children")]
41318                                {
41319                                    child_idx += 1;
41320                                }
41321                            }
41322                            b"definedNames" => {
41323                                f_defined_names =
41324                                    Some(Box::new(DefinedNames::from_xml(reader, &e, false)?));
41325                                #[cfg(feature = "extra-children")]
41326                                {
41327                                    child_idx += 1;
41328                                }
41329                            }
41330                            #[cfg(feature = "sml-formulas")]
41331                            b"calcPr" => {
41332                                f_calc_pr = Some(Box::new(CalculationProperties::from_xml(
41333                                    reader, &e, false,
41334                                )?));
41335                                #[cfg(feature = "extra-children")]
41336                                {
41337                                    child_idx += 1;
41338                                }
41339                            }
41340                            #[cfg(feature = "sml-external")]
41341                            b"oleSize" => {
41342                                f_ole_size =
41343                                    Some(Box::new(CTOleSize::from_xml(reader, &e, false)?));
41344                                #[cfg(feature = "extra-children")]
41345                                {
41346                                    child_idx += 1;
41347                                }
41348                            }
41349                            #[cfg(feature = "sml-structure")]
41350                            b"customWorkbookViews" => {
41351                                f_custom_workbook_views = Some(Box::new(
41352                                    CustomWorkbookViews::from_xml(reader, &e, false)?,
41353                                ));
41354                                #[cfg(feature = "extra-children")]
41355                                {
41356                                    child_idx += 1;
41357                                }
41358                            }
41359                            #[cfg(feature = "sml-pivot")]
41360                            b"pivotCaches" => {
41361                                f_pivot_caches =
41362                                    Some(Box::new(PivotCaches::from_xml(reader, &e, false)?));
41363                                #[cfg(feature = "extra-children")]
41364                                {
41365                                    child_idx += 1;
41366                                }
41367                            }
41368                            #[cfg(feature = "sml-metadata")]
41369                            b"smartTagPr" => {
41370                                f_smart_tag_pr =
41371                                    Some(Box::new(CTSmartTagPr::from_xml(reader, &e, false)?));
41372                                #[cfg(feature = "extra-children")]
41373                                {
41374                                    child_idx += 1;
41375                                }
41376                            }
41377                            #[cfg(feature = "sml-metadata")]
41378                            b"smartTagTypes" => {
41379                                f_smart_tag_types =
41380                                    Some(Box::new(CTSmartTagTypes::from_xml(reader, &e, false)?));
41381                                #[cfg(feature = "extra-children")]
41382                                {
41383                                    child_idx += 1;
41384                                }
41385                            }
41386                            #[cfg(feature = "sml-external")]
41387                            b"webPublishing" => {
41388                                f_web_publishing =
41389                                    Some(Box::new(WebPublishing::from_xml(reader, &e, false)?));
41390                                #[cfg(feature = "extra-children")]
41391                                {
41392                                    child_idx += 1;
41393                                }
41394                            }
41395                            b"fileRecoveryPr" => {
41396                                f_file_recovery_pr
41397                                    .push(FileRecoveryProperties::from_xml(reader, &e, false)?);
41398                                #[cfg(feature = "extra-children")]
41399                                {
41400                                    child_idx += 1;
41401                                }
41402                            }
41403                            #[cfg(feature = "sml-external")]
41404                            b"webPublishObjects" => {
41405                                f_web_publish_objects = Some(Box::new(
41406                                    CTWebPublishObjects::from_xml(reader, &e, false)?,
41407                                ));
41408                                #[cfg(feature = "extra-children")]
41409                                {
41410                                    child_idx += 1;
41411                                }
41412                            }
41413                            #[cfg(feature = "sml-extensions")]
41414                            b"extLst" => {
41415                                f_extension_list =
41416                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
41417                                #[cfg(feature = "extra-children")]
41418                                {
41419                                    child_idx += 1;
41420                                }
41421                            }
41422                            #[cfg(feature = "extra-children")]
41423                            _ => {
41424                                // Capture unknown element for roundtrip
41425                                let elem = RawXmlElement::from_reader(reader, &e)?;
41426                                extra_children.push(PositionedNode::new(
41427                                    child_idx,
41428                                    RawXmlNode::Element(elem),
41429                                ));
41430                                child_idx += 1;
41431                            }
41432                            #[cfg(not(feature = "extra-children"))]
41433                            _ => {
41434                                // Skip unknown element
41435                                skip_element(reader)?;
41436                            }
41437                        }
41438                    }
41439                    Event::Empty(e) => {
41440                        match e.local_name().as_ref() {
41441                            b"fileVersion" => {
41442                                f_file_version =
41443                                    Some(Box::new(FileVersion::from_xml(reader, &e, true)?));
41444                                #[cfg(feature = "extra-children")]
41445                                {
41446                                    child_idx += 1;
41447                                }
41448                            }
41449                            #[cfg(feature = "sml-protection")]
41450                            b"fileSharing" => {
41451                                f_file_sharing =
41452                                    Some(Box::new(FileSharing::from_xml(reader, &e, true)?));
41453                                #[cfg(feature = "extra-children")]
41454                                {
41455                                    child_idx += 1;
41456                                }
41457                            }
41458                            b"workbookPr" => {
41459                                f_workbook_pr =
41460                                    Some(Box::new(WorkbookProperties::from_xml(reader, &e, true)?));
41461                                #[cfg(feature = "extra-children")]
41462                                {
41463                                    child_idx += 1;
41464                                }
41465                            }
41466                            #[cfg(feature = "sml-protection")]
41467                            b"workbookProtection" => {
41468                                f_workbook_protection =
41469                                    Some(Box::new(WorkbookProtection::from_xml(reader, &e, true)?));
41470                                #[cfg(feature = "extra-children")]
41471                                {
41472                                    child_idx += 1;
41473                                }
41474                            }
41475                            b"bookViews" => {
41476                                f_book_views =
41477                                    Some(Box::new(BookViews::from_xml(reader, &e, true)?));
41478                                #[cfg(feature = "extra-children")]
41479                                {
41480                                    child_idx += 1;
41481                                }
41482                            }
41483                            b"sheets" => {
41484                                f_sheets = Some(Box::new(Sheets::from_xml(reader, &e, true)?));
41485                                #[cfg(feature = "extra-children")]
41486                                {
41487                                    child_idx += 1;
41488                                }
41489                            }
41490                            #[cfg(feature = "sml-formulas-advanced")]
41491                            b"functionGroups" => {
41492                                f_function_groups =
41493                                    Some(Box::new(CTFunctionGroups::from_xml(reader, &e, true)?));
41494                                #[cfg(feature = "extra-children")]
41495                                {
41496                                    child_idx += 1;
41497                                }
41498                            }
41499                            #[cfg(feature = "sml-external")]
41500                            b"externalReferences" => {
41501                                f_external_references =
41502                                    Some(Box::new(ExternalReferences::from_xml(reader, &e, true)?));
41503                                #[cfg(feature = "extra-children")]
41504                                {
41505                                    child_idx += 1;
41506                                }
41507                            }
41508                            b"definedNames" => {
41509                                f_defined_names =
41510                                    Some(Box::new(DefinedNames::from_xml(reader, &e, true)?));
41511                                #[cfg(feature = "extra-children")]
41512                                {
41513                                    child_idx += 1;
41514                                }
41515                            }
41516                            #[cfg(feature = "sml-formulas")]
41517                            b"calcPr" => {
41518                                f_calc_pr = Some(Box::new(CalculationProperties::from_xml(
41519                                    reader, &e, true,
41520                                )?));
41521                                #[cfg(feature = "extra-children")]
41522                                {
41523                                    child_idx += 1;
41524                                }
41525                            }
41526                            #[cfg(feature = "sml-external")]
41527                            b"oleSize" => {
41528                                f_ole_size = Some(Box::new(CTOleSize::from_xml(reader, &e, true)?));
41529                                #[cfg(feature = "extra-children")]
41530                                {
41531                                    child_idx += 1;
41532                                }
41533                            }
41534                            #[cfg(feature = "sml-structure")]
41535                            b"customWorkbookViews" => {
41536                                f_custom_workbook_views = Some(Box::new(
41537                                    CustomWorkbookViews::from_xml(reader, &e, true)?,
41538                                ));
41539                                #[cfg(feature = "extra-children")]
41540                                {
41541                                    child_idx += 1;
41542                                }
41543                            }
41544                            #[cfg(feature = "sml-pivot")]
41545                            b"pivotCaches" => {
41546                                f_pivot_caches =
41547                                    Some(Box::new(PivotCaches::from_xml(reader, &e, true)?));
41548                                #[cfg(feature = "extra-children")]
41549                                {
41550                                    child_idx += 1;
41551                                }
41552                            }
41553                            #[cfg(feature = "sml-metadata")]
41554                            b"smartTagPr" => {
41555                                f_smart_tag_pr =
41556                                    Some(Box::new(CTSmartTagPr::from_xml(reader, &e, true)?));
41557                                #[cfg(feature = "extra-children")]
41558                                {
41559                                    child_idx += 1;
41560                                }
41561                            }
41562                            #[cfg(feature = "sml-metadata")]
41563                            b"smartTagTypes" => {
41564                                f_smart_tag_types =
41565                                    Some(Box::new(CTSmartTagTypes::from_xml(reader, &e, true)?));
41566                                #[cfg(feature = "extra-children")]
41567                                {
41568                                    child_idx += 1;
41569                                }
41570                            }
41571                            #[cfg(feature = "sml-external")]
41572                            b"webPublishing" => {
41573                                f_web_publishing =
41574                                    Some(Box::new(WebPublishing::from_xml(reader, &e, true)?));
41575                                #[cfg(feature = "extra-children")]
41576                                {
41577                                    child_idx += 1;
41578                                }
41579                            }
41580                            b"fileRecoveryPr" => {
41581                                f_file_recovery_pr
41582                                    .push(FileRecoveryProperties::from_xml(reader, &e, true)?);
41583                                #[cfg(feature = "extra-children")]
41584                                {
41585                                    child_idx += 1;
41586                                }
41587                            }
41588                            #[cfg(feature = "sml-external")]
41589                            b"webPublishObjects" => {
41590                                f_web_publish_objects = Some(Box::new(
41591                                    CTWebPublishObjects::from_xml(reader, &e, true)?,
41592                                ));
41593                                #[cfg(feature = "extra-children")]
41594                                {
41595                                    child_idx += 1;
41596                                }
41597                            }
41598                            #[cfg(feature = "sml-extensions")]
41599                            b"extLst" => {
41600                                f_extension_list =
41601                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
41602                                #[cfg(feature = "extra-children")]
41603                                {
41604                                    child_idx += 1;
41605                                }
41606                            }
41607                            #[cfg(feature = "extra-children")]
41608                            _ => {
41609                                // Capture unknown empty element for roundtrip
41610                                let elem = RawXmlElement::from_empty(&e);
41611                                extra_children.push(PositionedNode::new(
41612                                    child_idx,
41613                                    RawXmlNode::Element(elem),
41614                                ));
41615                                child_idx += 1;
41616                            }
41617                            #[cfg(not(feature = "extra-children"))]
41618                            _ => {}
41619                        }
41620                    }
41621                    Event::End(_) => break,
41622                    Event::Eof => break,
41623                    _ => {}
41624                }
41625                buf.clear();
41626            }
41627        }
41628
41629        Ok(Self {
41630            conformance: f_conformance,
41631            file_version: f_file_version,
41632            #[cfg(feature = "sml-protection")]
41633            file_sharing: f_file_sharing,
41634            workbook_pr: f_workbook_pr,
41635            #[cfg(feature = "sml-protection")]
41636            workbook_protection: f_workbook_protection,
41637            book_views: f_book_views,
41638            sheets: f_sheets.ok_or_else(|| ParseError::MissingAttribute("sheets".to_string()))?,
41639            #[cfg(feature = "sml-formulas-advanced")]
41640            function_groups: f_function_groups,
41641            #[cfg(feature = "sml-external")]
41642            external_references: f_external_references,
41643            defined_names: f_defined_names,
41644            #[cfg(feature = "sml-formulas")]
41645            calc_pr: f_calc_pr,
41646            #[cfg(feature = "sml-external")]
41647            ole_size: f_ole_size,
41648            #[cfg(feature = "sml-structure")]
41649            custom_workbook_views: f_custom_workbook_views,
41650            #[cfg(feature = "sml-pivot")]
41651            pivot_caches: f_pivot_caches,
41652            #[cfg(feature = "sml-metadata")]
41653            smart_tag_pr: f_smart_tag_pr,
41654            #[cfg(feature = "sml-metadata")]
41655            smart_tag_types: f_smart_tag_types,
41656            #[cfg(feature = "sml-external")]
41657            web_publishing: f_web_publishing,
41658            file_recovery_pr: f_file_recovery_pr,
41659            #[cfg(feature = "sml-external")]
41660            web_publish_objects: f_web_publish_objects,
41661            #[cfg(feature = "sml-extensions")]
41662            extension_list: f_extension_list,
41663            #[cfg(feature = "extra-attrs")]
41664            extra_attrs,
41665            #[cfg(feature = "extra-children")]
41666            extra_children,
41667        })
41668    }
41669}
41670
41671impl FromXml for FileVersion {
41672    fn from_xml<R: BufRead>(
41673        reader: &mut Reader<R>,
41674        start_tag: &BytesStart,
41675        is_empty: bool,
41676    ) -> Result<Self, ParseError> {
41677        let mut f_app_name = None;
41678        let mut f_last_edited = None;
41679        let mut f_lowest_edited = None;
41680        let mut f_rup_build = None;
41681        let mut f_code_name = None;
41682        #[cfg(feature = "extra-attrs")]
41683        let mut extra_attrs = std::collections::HashMap::new();
41684
41685        // Parse attributes
41686        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
41687            let val = String::from_utf8_lossy(&attr.value);
41688            match attr.key.local_name().as_ref() {
41689                b"appName" => {
41690                    f_app_name = Some(val.into_owned());
41691                }
41692                b"lastEdited" => {
41693                    f_last_edited = Some(val.into_owned());
41694                }
41695                b"lowestEdited" => {
41696                    f_lowest_edited = Some(val.into_owned());
41697                }
41698                b"rupBuild" => {
41699                    f_rup_build = Some(val.into_owned());
41700                }
41701                b"codeName" => {
41702                    f_code_name = Some(val.into_owned());
41703                }
41704                #[cfg(feature = "extra-attrs")]
41705                unknown => {
41706                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
41707                    extra_attrs.insert(key, val.into_owned());
41708                }
41709                #[cfg(not(feature = "extra-attrs"))]
41710                _ => {}
41711            }
41712        }
41713
41714        if !is_empty {
41715            let mut buf = Vec::new();
41716            loop {
41717                match reader.read_event_into(&mut buf)? {
41718                    Event::End(_) => break,
41719                    Event::Eof => break,
41720                    _ => {}
41721                }
41722                buf.clear();
41723            }
41724        }
41725
41726        Ok(Self {
41727            app_name: f_app_name,
41728            last_edited: f_last_edited,
41729            lowest_edited: f_lowest_edited,
41730            rup_build: f_rup_build,
41731            code_name: f_code_name,
41732            #[cfg(feature = "extra-attrs")]
41733            extra_attrs,
41734        })
41735    }
41736}
41737
41738impl FromXml for BookViews {
41739    fn from_xml<R: BufRead>(
41740        reader: &mut Reader<R>,
41741        start_tag: &BytesStart,
41742        is_empty: bool,
41743    ) -> Result<Self, ParseError> {
41744        let mut f_workbook_view = Vec::new();
41745        #[cfg(feature = "extra-children")]
41746        let mut extra_children = Vec::new();
41747        #[cfg(feature = "extra-children")]
41748        let mut child_idx: usize = 0;
41749
41750        // Parse child elements
41751        if !is_empty {
41752            let mut buf = Vec::new();
41753            loop {
41754                match reader.read_event_into(&mut buf)? {
41755                    Event::Start(e) => {
41756                        match e.local_name().as_ref() {
41757                            b"workbookView" => {
41758                                f_workbook_view.push(BookView::from_xml(reader, &e, false)?);
41759                                #[cfg(feature = "extra-children")]
41760                                {
41761                                    child_idx += 1;
41762                                }
41763                            }
41764                            #[cfg(feature = "extra-children")]
41765                            _ => {
41766                                // Capture unknown element for roundtrip
41767                                let elem = RawXmlElement::from_reader(reader, &e)?;
41768                                extra_children.push(PositionedNode::new(
41769                                    child_idx,
41770                                    RawXmlNode::Element(elem),
41771                                ));
41772                                child_idx += 1;
41773                            }
41774                            #[cfg(not(feature = "extra-children"))]
41775                            _ => {
41776                                // Skip unknown element
41777                                skip_element(reader)?;
41778                            }
41779                        }
41780                    }
41781                    Event::Empty(e) => {
41782                        match e.local_name().as_ref() {
41783                            b"workbookView" => {
41784                                f_workbook_view.push(BookView::from_xml(reader, &e, true)?);
41785                                #[cfg(feature = "extra-children")]
41786                                {
41787                                    child_idx += 1;
41788                                }
41789                            }
41790                            #[cfg(feature = "extra-children")]
41791                            _ => {
41792                                // Capture unknown empty element for roundtrip
41793                                let elem = RawXmlElement::from_empty(&e);
41794                                extra_children.push(PositionedNode::new(
41795                                    child_idx,
41796                                    RawXmlNode::Element(elem),
41797                                ));
41798                                child_idx += 1;
41799                            }
41800                            #[cfg(not(feature = "extra-children"))]
41801                            _ => {}
41802                        }
41803                    }
41804                    Event::End(_) => break,
41805                    Event::Eof => break,
41806                    _ => {}
41807                }
41808                buf.clear();
41809            }
41810        }
41811
41812        Ok(Self {
41813            workbook_view: f_workbook_view,
41814            #[cfg(feature = "extra-children")]
41815            extra_children,
41816        })
41817    }
41818}
41819
41820impl FromXml for BookView {
41821    fn from_xml<R: BufRead>(
41822        reader: &mut Reader<R>,
41823        start_tag: &BytesStart,
41824        is_empty: bool,
41825    ) -> Result<Self, ParseError> {
41826        #[cfg(feature = "sml-structure")]
41827        let mut f_visibility = None;
41828        #[cfg(feature = "sml-structure")]
41829        let mut f_minimized = None;
41830        #[cfg(feature = "sml-structure")]
41831        let mut f_show_horizontal_scroll = None;
41832        #[cfg(feature = "sml-structure")]
41833        let mut f_show_vertical_scroll = None;
41834        #[cfg(feature = "sml-structure")]
41835        let mut f_show_sheet_tabs = None;
41836        #[cfg(feature = "sml-structure")]
41837        let mut f_x_window = None;
41838        #[cfg(feature = "sml-structure")]
41839        let mut f_y_window = None;
41840        #[cfg(feature = "sml-structure")]
41841        let mut f_window_width = None;
41842        #[cfg(feature = "sml-structure")]
41843        let mut f_window_height = None;
41844        #[cfg(feature = "sml-structure")]
41845        let mut f_tab_ratio = None;
41846        #[cfg(feature = "sml-structure")]
41847        let mut f_first_sheet = None;
41848        let mut f_active_tab = None;
41849        #[cfg(feature = "sml-filtering")]
41850        let mut f_auto_filter_date_grouping = None;
41851        #[cfg(feature = "sml-extensions")]
41852        let mut f_extension_list = None;
41853        #[cfg(feature = "extra-attrs")]
41854        let mut extra_attrs = std::collections::HashMap::new();
41855        #[cfg(feature = "extra-children")]
41856        let mut extra_children = Vec::new();
41857        #[cfg(feature = "extra-children")]
41858        let mut child_idx: usize = 0;
41859
41860        // Parse attributes
41861        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
41862            let val = String::from_utf8_lossy(&attr.value);
41863            match attr.key.local_name().as_ref() {
41864                #[cfg(feature = "sml-structure")]
41865                b"visibility" => {
41866                    f_visibility = val.parse().ok();
41867                }
41868                #[cfg(feature = "sml-structure")]
41869                b"minimized" => {
41870                    f_minimized = Some(val == "true" || val == "1");
41871                }
41872                #[cfg(feature = "sml-structure")]
41873                b"showHorizontalScroll" => {
41874                    f_show_horizontal_scroll = Some(val == "true" || val == "1");
41875                }
41876                #[cfg(feature = "sml-structure")]
41877                b"showVerticalScroll" => {
41878                    f_show_vertical_scroll = Some(val == "true" || val == "1");
41879                }
41880                #[cfg(feature = "sml-structure")]
41881                b"showSheetTabs" => {
41882                    f_show_sheet_tabs = Some(val == "true" || val == "1");
41883                }
41884                #[cfg(feature = "sml-structure")]
41885                b"xWindow" => {
41886                    f_x_window = val.parse().ok();
41887                }
41888                #[cfg(feature = "sml-structure")]
41889                b"yWindow" => {
41890                    f_y_window = val.parse().ok();
41891                }
41892                #[cfg(feature = "sml-structure")]
41893                b"windowWidth" => {
41894                    f_window_width = val.parse().ok();
41895                }
41896                #[cfg(feature = "sml-structure")]
41897                b"windowHeight" => {
41898                    f_window_height = val.parse().ok();
41899                }
41900                #[cfg(feature = "sml-structure")]
41901                b"tabRatio" => {
41902                    f_tab_ratio = val.parse().ok();
41903                }
41904                #[cfg(feature = "sml-structure")]
41905                b"firstSheet" => {
41906                    f_first_sheet = val.parse().ok();
41907                }
41908                b"activeTab" => {
41909                    f_active_tab = val.parse().ok();
41910                }
41911                #[cfg(feature = "sml-filtering")]
41912                b"autoFilterDateGrouping" => {
41913                    f_auto_filter_date_grouping = Some(val == "true" || val == "1");
41914                }
41915                #[cfg(feature = "extra-attrs")]
41916                unknown => {
41917                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
41918                    extra_attrs.insert(key, val.into_owned());
41919                }
41920                #[cfg(not(feature = "extra-attrs"))]
41921                _ => {}
41922            }
41923        }
41924
41925        // Parse child elements
41926        if !is_empty {
41927            let mut buf = Vec::new();
41928            loop {
41929                match reader.read_event_into(&mut buf)? {
41930                    Event::Start(e) => {
41931                        match e.local_name().as_ref() {
41932                            #[cfg(feature = "sml-extensions")]
41933                            b"extLst" => {
41934                                f_extension_list =
41935                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
41936                                #[cfg(feature = "extra-children")]
41937                                {
41938                                    child_idx += 1;
41939                                }
41940                            }
41941                            #[cfg(feature = "extra-children")]
41942                            _ => {
41943                                // Capture unknown element for roundtrip
41944                                let elem = RawXmlElement::from_reader(reader, &e)?;
41945                                extra_children.push(PositionedNode::new(
41946                                    child_idx,
41947                                    RawXmlNode::Element(elem),
41948                                ));
41949                                child_idx += 1;
41950                            }
41951                            #[cfg(not(feature = "extra-children"))]
41952                            _ => {
41953                                // Skip unknown element
41954                                skip_element(reader)?;
41955                            }
41956                        }
41957                    }
41958                    Event::Empty(e) => {
41959                        match e.local_name().as_ref() {
41960                            #[cfg(feature = "sml-extensions")]
41961                            b"extLst" => {
41962                                f_extension_list =
41963                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
41964                                #[cfg(feature = "extra-children")]
41965                                {
41966                                    child_idx += 1;
41967                                }
41968                            }
41969                            #[cfg(feature = "extra-children")]
41970                            _ => {
41971                                // Capture unknown empty element for roundtrip
41972                                let elem = RawXmlElement::from_empty(&e);
41973                                extra_children.push(PositionedNode::new(
41974                                    child_idx,
41975                                    RawXmlNode::Element(elem),
41976                                ));
41977                                child_idx += 1;
41978                            }
41979                            #[cfg(not(feature = "extra-children"))]
41980                            _ => {}
41981                        }
41982                    }
41983                    Event::End(_) => break,
41984                    Event::Eof => break,
41985                    _ => {}
41986                }
41987                buf.clear();
41988            }
41989        }
41990
41991        Ok(Self {
41992            #[cfg(feature = "sml-structure")]
41993            visibility: f_visibility,
41994            #[cfg(feature = "sml-structure")]
41995            minimized: f_minimized,
41996            #[cfg(feature = "sml-structure")]
41997            show_horizontal_scroll: f_show_horizontal_scroll,
41998            #[cfg(feature = "sml-structure")]
41999            show_vertical_scroll: f_show_vertical_scroll,
42000            #[cfg(feature = "sml-structure")]
42001            show_sheet_tabs: f_show_sheet_tabs,
42002            #[cfg(feature = "sml-structure")]
42003            x_window: f_x_window,
42004            #[cfg(feature = "sml-structure")]
42005            y_window: f_y_window,
42006            #[cfg(feature = "sml-structure")]
42007            window_width: f_window_width,
42008            #[cfg(feature = "sml-structure")]
42009            window_height: f_window_height,
42010            #[cfg(feature = "sml-structure")]
42011            tab_ratio: f_tab_ratio,
42012            #[cfg(feature = "sml-structure")]
42013            first_sheet: f_first_sheet,
42014            active_tab: f_active_tab,
42015            #[cfg(feature = "sml-filtering")]
42016            auto_filter_date_grouping: f_auto_filter_date_grouping,
42017            #[cfg(feature = "sml-extensions")]
42018            extension_list: f_extension_list,
42019            #[cfg(feature = "extra-attrs")]
42020            extra_attrs,
42021            #[cfg(feature = "extra-children")]
42022            extra_children,
42023        })
42024    }
42025}
42026
42027impl FromXml for CustomWorkbookViews {
42028    fn from_xml<R: BufRead>(
42029        reader: &mut Reader<R>,
42030        start_tag: &BytesStart,
42031        is_empty: bool,
42032    ) -> Result<Self, ParseError> {
42033        let mut f_custom_workbook_view = Vec::new();
42034        #[cfg(feature = "extra-children")]
42035        let mut extra_children = Vec::new();
42036        #[cfg(feature = "extra-children")]
42037        let mut child_idx: usize = 0;
42038
42039        // Parse child elements
42040        if !is_empty {
42041            let mut buf = Vec::new();
42042            loop {
42043                match reader.read_event_into(&mut buf)? {
42044                    Event::Start(e) => {
42045                        match e.local_name().as_ref() {
42046                            b"customWorkbookView" => {
42047                                f_custom_workbook_view
42048                                    .push(CustomWorkbookView::from_xml(reader, &e, false)?);
42049                                #[cfg(feature = "extra-children")]
42050                                {
42051                                    child_idx += 1;
42052                                }
42053                            }
42054                            #[cfg(feature = "extra-children")]
42055                            _ => {
42056                                // Capture unknown element for roundtrip
42057                                let elem = RawXmlElement::from_reader(reader, &e)?;
42058                                extra_children.push(PositionedNode::new(
42059                                    child_idx,
42060                                    RawXmlNode::Element(elem),
42061                                ));
42062                                child_idx += 1;
42063                            }
42064                            #[cfg(not(feature = "extra-children"))]
42065                            _ => {
42066                                // Skip unknown element
42067                                skip_element(reader)?;
42068                            }
42069                        }
42070                    }
42071                    Event::Empty(e) => {
42072                        match e.local_name().as_ref() {
42073                            b"customWorkbookView" => {
42074                                f_custom_workbook_view
42075                                    .push(CustomWorkbookView::from_xml(reader, &e, true)?);
42076                                #[cfg(feature = "extra-children")]
42077                                {
42078                                    child_idx += 1;
42079                                }
42080                            }
42081                            #[cfg(feature = "extra-children")]
42082                            _ => {
42083                                // Capture unknown empty element for roundtrip
42084                                let elem = RawXmlElement::from_empty(&e);
42085                                extra_children.push(PositionedNode::new(
42086                                    child_idx,
42087                                    RawXmlNode::Element(elem),
42088                                ));
42089                                child_idx += 1;
42090                            }
42091                            #[cfg(not(feature = "extra-children"))]
42092                            _ => {}
42093                        }
42094                    }
42095                    Event::End(_) => break,
42096                    Event::Eof => break,
42097                    _ => {}
42098                }
42099                buf.clear();
42100            }
42101        }
42102
42103        Ok(Self {
42104            custom_workbook_view: f_custom_workbook_view,
42105            #[cfg(feature = "extra-children")]
42106            extra_children,
42107        })
42108    }
42109}
42110
42111impl FromXml for CustomWorkbookView {
42112    fn from_xml<R: BufRead>(
42113        reader: &mut Reader<R>,
42114        start_tag: &BytesStart,
42115        is_empty: bool,
42116    ) -> Result<Self, ParseError> {
42117        let mut f_name: Option<XmlString> = None;
42118        let mut f_guid: Option<Guid> = None;
42119        let mut f_auto_update = None;
42120        let mut f_merge_interval = None;
42121        let mut f_changes_saved_win = None;
42122        let mut f_only_sync = None;
42123        let mut f_personal_view = None;
42124        let mut f_include_print_settings = None;
42125        let mut f_include_hidden_row_col = None;
42126        let mut f_maximized = None;
42127        let mut f_minimized = None;
42128        let mut f_show_horizontal_scroll = None;
42129        let mut f_show_vertical_scroll = None;
42130        let mut f_show_sheet_tabs = None;
42131        let mut f_x_window = None;
42132        let mut f_y_window = None;
42133        let mut f_window_width: Option<u32> = None;
42134        let mut f_window_height: Option<u32> = None;
42135        let mut f_tab_ratio = None;
42136        let mut f_active_sheet_id: Option<u32> = None;
42137        let mut f_show_formula_bar = None;
42138        let mut f_show_statusbar = None;
42139        let mut f_show_comments = None;
42140        let mut f_show_objects = None;
42141        let mut f_extension_list = None;
42142        #[cfg(feature = "extra-attrs")]
42143        let mut extra_attrs = std::collections::HashMap::new();
42144        #[cfg(feature = "extra-children")]
42145        let mut extra_children = Vec::new();
42146        #[cfg(feature = "extra-children")]
42147        let mut child_idx: usize = 0;
42148
42149        // Parse attributes
42150        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42151            let val = String::from_utf8_lossy(&attr.value);
42152            match attr.key.local_name().as_ref() {
42153                b"name" => {
42154                    f_name = Some(val.into_owned());
42155                }
42156                b"guid" => {
42157                    f_guid = Some(val.into_owned());
42158                }
42159                b"autoUpdate" => {
42160                    f_auto_update = Some(val == "true" || val == "1");
42161                }
42162                b"mergeInterval" => {
42163                    f_merge_interval = val.parse().ok();
42164                }
42165                b"changesSavedWin" => {
42166                    f_changes_saved_win = Some(val == "true" || val == "1");
42167                }
42168                b"onlySync" => {
42169                    f_only_sync = Some(val == "true" || val == "1");
42170                }
42171                b"personalView" => {
42172                    f_personal_view = Some(val == "true" || val == "1");
42173                }
42174                b"includePrintSettings" => {
42175                    f_include_print_settings = Some(val == "true" || val == "1");
42176                }
42177                b"includeHiddenRowCol" => {
42178                    f_include_hidden_row_col = Some(val == "true" || val == "1");
42179                }
42180                b"maximized" => {
42181                    f_maximized = Some(val == "true" || val == "1");
42182                }
42183                b"minimized" => {
42184                    f_minimized = Some(val == "true" || val == "1");
42185                }
42186                b"showHorizontalScroll" => {
42187                    f_show_horizontal_scroll = Some(val == "true" || val == "1");
42188                }
42189                b"showVerticalScroll" => {
42190                    f_show_vertical_scroll = Some(val == "true" || val == "1");
42191                }
42192                b"showSheetTabs" => {
42193                    f_show_sheet_tabs = Some(val == "true" || val == "1");
42194                }
42195                b"xWindow" => {
42196                    f_x_window = val.parse().ok();
42197                }
42198                b"yWindow" => {
42199                    f_y_window = val.parse().ok();
42200                }
42201                b"windowWidth" => {
42202                    f_window_width = val.parse().ok();
42203                }
42204                b"windowHeight" => {
42205                    f_window_height = val.parse().ok();
42206                }
42207                b"tabRatio" => {
42208                    f_tab_ratio = val.parse().ok();
42209                }
42210                b"activeSheetId" => {
42211                    f_active_sheet_id = val.parse().ok();
42212                }
42213                b"showFormulaBar" => {
42214                    f_show_formula_bar = Some(val == "true" || val == "1");
42215                }
42216                b"showStatusbar" => {
42217                    f_show_statusbar = Some(val == "true" || val == "1");
42218                }
42219                b"showComments" => {
42220                    f_show_comments = val.parse().ok();
42221                }
42222                b"showObjects" => {
42223                    f_show_objects = val.parse().ok();
42224                }
42225                #[cfg(feature = "extra-attrs")]
42226                unknown => {
42227                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42228                    extra_attrs.insert(key, val.into_owned());
42229                }
42230                #[cfg(not(feature = "extra-attrs"))]
42231                _ => {}
42232            }
42233        }
42234
42235        // Parse child elements
42236        if !is_empty {
42237            let mut buf = Vec::new();
42238            loop {
42239                match reader.read_event_into(&mut buf)? {
42240                    Event::Start(e) => {
42241                        match e.local_name().as_ref() {
42242                            b"extLst" => {
42243                                f_extension_list =
42244                                    Some(Box::new(ExtensionList::from_xml(reader, &e, false)?));
42245                                #[cfg(feature = "extra-children")]
42246                                {
42247                                    child_idx += 1;
42248                                }
42249                            }
42250                            #[cfg(feature = "extra-children")]
42251                            _ => {
42252                                // Capture unknown element for roundtrip
42253                                let elem = RawXmlElement::from_reader(reader, &e)?;
42254                                extra_children.push(PositionedNode::new(
42255                                    child_idx,
42256                                    RawXmlNode::Element(elem),
42257                                ));
42258                                child_idx += 1;
42259                            }
42260                            #[cfg(not(feature = "extra-children"))]
42261                            _ => {
42262                                // Skip unknown element
42263                                skip_element(reader)?;
42264                            }
42265                        }
42266                    }
42267                    Event::Empty(e) => {
42268                        match e.local_name().as_ref() {
42269                            b"extLst" => {
42270                                f_extension_list =
42271                                    Some(Box::new(ExtensionList::from_xml(reader, &e, true)?));
42272                                #[cfg(feature = "extra-children")]
42273                                {
42274                                    child_idx += 1;
42275                                }
42276                            }
42277                            #[cfg(feature = "extra-children")]
42278                            _ => {
42279                                // Capture unknown empty element for roundtrip
42280                                let elem = RawXmlElement::from_empty(&e);
42281                                extra_children.push(PositionedNode::new(
42282                                    child_idx,
42283                                    RawXmlNode::Element(elem),
42284                                ));
42285                                child_idx += 1;
42286                            }
42287                            #[cfg(not(feature = "extra-children"))]
42288                            _ => {}
42289                        }
42290                    }
42291                    Event::End(_) => break,
42292                    Event::Eof => break,
42293                    _ => {}
42294                }
42295                buf.clear();
42296            }
42297        }
42298
42299        Ok(Self {
42300            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
42301            guid: f_guid.ok_or_else(|| ParseError::MissingAttribute("guid".to_string()))?,
42302            auto_update: f_auto_update,
42303            merge_interval: f_merge_interval,
42304            changes_saved_win: f_changes_saved_win,
42305            only_sync: f_only_sync,
42306            personal_view: f_personal_view,
42307            include_print_settings: f_include_print_settings,
42308            include_hidden_row_col: f_include_hidden_row_col,
42309            maximized: f_maximized,
42310            minimized: f_minimized,
42311            show_horizontal_scroll: f_show_horizontal_scroll,
42312            show_vertical_scroll: f_show_vertical_scroll,
42313            show_sheet_tabs: f_show_sheet_tabs,
42314            x_window: f_x_window,
42315            y_window: f_y_window,
42316            window_width: f_window_width
42317                .ok_or_else(|| ParseError::MissingAttribute("windowWidth".to_string()))?,
42318            window_height: f_window_height
42319                .ok_or_else(|| ParseError::MissingAttribute("windowHeight".to_string()))?,
42320            tab_ratio: f_tab_ratio,
42321            active_sheet_id: f_active_sheet_id
42322                .ok_or_else(|| ParseError::MissingAttribute("activeSheetId".to_string()))?,
42323            show_formula_bar: f_show_formula_bar,
42324            show_statusbar: f_show_statusbar,
42325            show_comments: f_show_comments,
42326            show_objects: f_show_objects,
42327            extension_list: f_extension_list,
42328            #[cfg(feature = "extra-attrs")]
42329            extra_attrs,
42330            #[cfg(feature = "extra-children")]
42331            extra_children,
42332        })
42333    }
42334}
42335
42336impl FromXml for Sheets {
42337    fn from_xml<R: BufRead>(
42338        reader: &mut Reader<R>,
42339        start_tag: &BytesStart,
42340        is_empty: bool,
42341    ) -> Result<Self, ParseError> {
42342        let mut f_sheet = Vec::new();
42343        #[cfg(feature = "extra-children")]
42344        let mut extra_children = Vec::new();
42345        #[cfg(feature = "extra-children")]
42346        let mut child_idx: usize = 0;
42347
42348        // Parse child elements
42349        if !is_empty {
42350            let mut buf = Vec::new();
42351            loop {
42352                match reader.read_event_into(&mut buf)? {
42353                    Event::Start(e) => {
42354                        match e.local_name().as_ref() {
42355                            b"sheet" => {
42356                                f_sheet.push(Sheet::from_xml(reader, &e, false)?);
42357                                #[cfg(feature = "extra-children")]
42358                                {
42359                                    child_idx += 1;
42360                                }
42361                            }
42362                            #[cfg(feature = "extra-children")]
42363                            _ => {
42364                                // Capture unknown element for roundtrip
42365                                let elem = RawXmlElement::from_reader(reader, &e)?;
42366                                extra_children.push(PositionedNode::new(
42367                                    child_idx,
42368                                    RawXmlNode::Element(elem),
42369                                ));
42370                                child_idx += 1;
42371                            }
42372                            #[cfg(not(feature = "extra-children"))]
42373                            _ => {
42374                                // Skip unknown element
42375                                skip_element(reader)?;
42376                            }
42377                        }
42378                    }
42379                    Event::Empty(e) => {
42380                        match e.local_name().as_ref() {
42381                            b"sheet" => {
42382                                f_sheet.push(Sheet::from_xml(reader, &e, true)?);
42383                                #[cfg(feature = "extra-children")]
42384                                {
42385                                    child_idx += 1;
42386                                }
42387                            }
42388                            #[cfg(feature = "extra-children")]
42389                            _ => {
42390                                // Capture unknown empty element for roundtrip
42391                                let elem = RawXmlElement::from_empty(&e);
42392                                extra_children.push(PositionedNode::new(
42393                                    child_idx,
42394                                    RawXmlNode::Element(elem),
42395                                ));
42396                                child_idx += 1;
42397                            }
42398                            #[cfg(not(feature = "extra-children"))]
42399                            _ => {}
42400                        }
42401                    }
42402                    Event::End(_) => break,
42403                    Event::Eof => break,
42404                    _ => {}
42405                }
42406                buf.clear();
42407            }
42408        }
42409
42410        Ok(Self {
42411            sheet: f_sheet,
42412            #[cfg(feature = "extra-children")]
42413            extra_children,
42414        })
42415    }
42416}
42417
42418impl FromXml for Sheet {
42419    fn from_xml<R: BufRead>(
42420        reader: &mut Reader<R>,
42421        start_tag: &BytesStart,
42422        is_empty: bool,
42423    ) -> Result<Self, ParseError> {
42424        let mut f_name: Option<XmlString> = None;
42425        let mut f_sheet_id: Option<u32> = None;
42426        #[cfg(feature = "sml-structure")]
42427        let mut f_state = None;
42428        let mut f_id: Option<STRelationshipId> = None;
42429        #[cfg(feature = "extra-attrs")]
42430        let mut extra_attrs = std::collections::HashMap::new();
42431
42432        // Parse attributes
42433        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42434            let val = String::from_utf8_lossy(&attr.value);
42435            match attr.key.local_name().as_ref() {
42436                b"name" => {
42437                    f_name = Some(val.into_owned());
42438                }
42439                b"sheetId" => {
42440                    f_sheet_id = val.parse().ok();
42441                }
42442                #[cfg(feature = "sml-structure")]
42443                b"state" => {
42444                    f_state = val.parse().ok();
42445                }
42446                b"id" => {
42447                    f_id = Some(val.into_owned());
42448                }
42449                #[cfg(feature = "extra-attrs")]
42450                unknown => {
42451                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42452                    extra_attrs.insert(key, val.into_owned());
42453                }
42454                #[cfg(not(feature = "extra-attrs"))]
42455                _ => {}
42456            }
42457        }
42458
42459        if !is_empty {
42460            let mut buf = Vec::new();
42461            loop {
42462                match reader.read_event_into(&mut buf)? {
42463                    Event::End(_) => break,
42464                    Event::Eof => break,
42465                    _ => {}
42466                }
42467                buf.clear();
42468            }
42469        }
42470
42471        Ok(Self {
42472            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
42473            sheet_id: f_sheet_id
42474                .ok_or_else(|| ParseError::MissingAttribute("sheetId".to_string()))?,
42475            #[cfg(feature = "sml-structure")]
42476            state: f_state,
42477            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
42478            #[cfg(feature = "extra-attrs")]
42479            extra_attrs,
42480        })
42481    }
42482}
42483
42484impl FromXml for WorkbookProperties {
42485    fn from_xml<R: BufRead>(
42486        reader: &mut Reader<R>,
42487        start_tag: &BytesStart,
42488        is_empty: bool,
42489    ) -> Result<Self, ParseError> {
42490        let mut f_date1904 = None;
42491        let mut f_show_objects = None;
42492        let mut f_show_border_unselected_tables = None;
42493        let mut f_filter_privacy = None;
42494        let mut f_prompted_solutions = None;
42495        let mut f_show_ink_annotation = None;
42496        let mut f_backup_file = None;
42497        let mut f_save_external_link_values = None;
42498        let mut f_update_links = None;
42499        let mut f_code_name = None;
42500        let mut f_hide_pivot_field_list = None;
42501        let mut f_show_pivot_chart_filter = None;
42502        let mut f_allow_refresh_query = None;
42503        let mut f_publish_items = None;
42504        let mut f_check_compatibility = None;
42505        let mut f_auto_compress_pictures = None;
42506        let mut f_refresh_all_connections = None;
42507        let mut f_default_theme_version = None;
42508        #[cfg(feature = "extra-attrs")]
42509        let mut extra_attrs = std::collections::HashMap::new();
42510
42511        // Parse attributes
42512        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42513            let val = String::from_utf8_lossy(&attr.value);
42514            match attr.key.local_name().as_ref() {
42515                b"date1904" => {
42516                    f_date1904 = Some(val == "true" || val == "1");
42517                }
42518                b"showObjects" => {
42519                    f_show_objects = val.parse().ok();
42520                }
42521                b"showBorderUnselectedTables" => {
42522                    f_show_border_unselected_tables = Some(val == "true" || val == "1");
42523                }
42524                b"filterPrivacy" => {
42525                    f_filter_privacy = Some(val == "true" || val == "1");
42526                }
42527                b"promptedSolutions" => {
42528                    f_prompted_solutions = Some(val == "true" || val == "1");
42529                }
42530                b"showInkAnnotation" => {
42531                    f_show_ink_annotation = Some(val == "true" || val == "1");
42532                }
42533                b"backupFile" => {
42534                    f_backup_file = Some(val == "true" || val == "1");
42535                }
42536                b"saveExternalLinkValues" => {
42537                    f_save_external_link_values = Some(val == "true" || val == "1");
42538                }
42539                b"updateLinks" => {
42540                    f_update_links = val.parse().ok();
42541                }
42542                b"codeName" => {
42543                    f_code_name = Some(val.into_owned());
42544                }
42545                b"hidePivotFieldList" => {
42546                    f_hide_pivot_field_list = Some(val == "true" || val == "1");
42547                }
42548                b"showPivotChartFilter" => {
42549                    f_show_pivot_chart_filter = Some(val == "true" || val == "1");
42550                }
42551                b"allowRefreshQuery" => {
42552                    f_allow_refresh_query = Some(val == "true" || val == "1");
42553                }
42554                b"publishItems" => {
42555                    f_publish_items = Some(val == "true" || val == "1");
42556                }
42557                b"checkCompatibility" => {
42558                    f_check_compatibility = Some(val == "true" || val == "1");
42559                }
42560                b"autoCompressPictures" => {
42561                    f_auto_compress_pictures = Some(val == "true" || val == "1");
42562                }
42563                b"refreshAllConnections" => {
42564                    f_refresh_all_connections = Some(val == "true" || val == "1");
42565                }
42566                b"defaultThemeVersion" => {
42567                    f_default_theme_version = val.parse().ok();
42568                }
42569                #[cfg(feature = "extra-attrs")]
42570                unknown => {
42571                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42572                    extra_attrs.insert(key, val.into_owned());
42573                }
42574                #[cfg(not(feature = "extra-attrs"))]
42575                _ => {}
42576            }
42577        }
42578
42579        if !is_empty {
42580            let mut buf = Vec::new();
42581            loop {
42582                match reader.read_event_into(&mut buf)? {
42583                    Event::End(_) => break,
42584                    Event::Eof => break,
42585                    _ => {}
42586                }
42587                buf.clear();
42588            }
42589        }
42590
42591        Ok(Self {
42592            date1904: f_date1904,
42593            show_objects: f_show_objects,
42594            show_border_unselected_tables: f_show_border_unselected_tables,
42595            filter_privacy: f_filter_privacy,
42596            prompted_solutions: f_prompted_solutions,
42597            show_ink_annotation: f_show_ink_annotation,
42598            backup_file: f_backup_file,
42599            save_external_link_values: f_save_external_link_values,
42600            update_links: f_update_links,
42601            code_name: f_code_name,
42602            hide_pivot_field_list: f_hide_pivot_field_list,
42603            show_pivot_chart_filter: f_show_pivot_chart_filter,
42604            allow_refresh_query: f_allow_refresh_query,
42605            publish_items: f_publish_items,
42606            check_compatibility: f_check_compatibility,
42607            auto_compress_pictures: f_auto_compress_pictures,
42608            refresh_all_connections: f_refresh_all_connections,
42609            default_theme_version: f_default_theme_version,
42610            #[cfg(feature = "extra-attrs")]
42611            extra_attrs,
42612        })
42613    }
42614}
42615
42616impl FromXml for CTSmartTagPr {
42617    fn from_xml<R: BufRead>(
42618        reader: &mut Reader<R>,
42619        start_tag: &BytesStart,
42620        is_empty: bool,
42621    ) -> Result<Self, ParseError> {
42622        let mut f_embed = None;
42623        let mut f_show = None;
42624        #[cfg(feature = "extra-attrs")]
42625        let mut extra_attrs = std::collections::HashMap::new();
42626
42627        // Parse attributes
42628        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42629            let val = String::from_utf8_lossy(&attr.value);
42630            match attr.key.local_name().as_ref() {
42631                b"embed" => {
42632                    f_embed = Some(val == "true" || val == "1");
42633                }
42634                b"show" => {
42635                    f_show = val.parse().ok();
42636                }
42637                #[cfg(feature = "extra-attrs")]
42638                unknown => {
42639                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42640                    extra_attrs.insert(key, val.into_owned());
42641                }
42642                #[cfg(not(feature = "extra-attrs"))]
42643                _ => {}
42644            }
42645        }
42646
42647        if !is_empty {
42648            let mut buf = Vec::new();
42649            loop {
42650                match reader.read_event_into(&mut buf)? {
42651                    Event::End(_) => break,
42652                    Event::Eof => break,
42653                    _ => {}
42654                }
42655                buf.clear();
42656            }
42657        }
42658
42659        Ok(Self {
42660            embed: f_embed,
42661            show: f_show,
42662            #[cfg(feature = "extra-attrs")]
42663            extra_attrs,
42664        })
42665    }
42666}
42667
42668impl FromXml for CTSmartTagTypes {
42669    fn from_xml<R: BufRead>(
42670        reader: &mut Reader<R>,
42671        start_tag: &BytesStart,
42672        is_empty: bool,
42673    ) -> Result<Self, ParseError> {
42674        let mut f_smart_tag_type = Vec::new();
42675        #[cfg(feature = "extra-children")]
42676        let mut extra_children = Vec::new();
42677        #[cfg(feature = "extra-children")]
42678        let mut child_idx: usize = 0;
42679
42680        // Parse child elements
42681        if !is_empty {
42682            let mut buf = Vec::new();
42683            loop {
42684                match reader.read_event_into(&mut buf)? {
42685                    Event::Start(e) => {
42686                        match e.local_name().as_ref() {
42687                            b"smartTagType" => {
42688                                f_smart_tag_type.push(CTSmartTagType::from_xml(reader, &e, false)?);
42689                                #[cfg(feature = "extra-children")]
42690                                {
42691                                    child_idx += 1;
42692                                }
42693                            }
42694                            #[cfg(feature = "extra-children")]
42695                            _ => {
42696                                // Capture unknown element for roundtrip
42697                                let elem = RawXmlElement::from_reader(reader, &e)?;
42698                                extra_children.push(PositionedNode::new(
42699                                    child_idx,
42700                                    RawXmlNode::Element(elem),
42701                                ));
42702                                child_idx += 1;
42703                            }
42704                            #[cfg(not(feature = "extra-children"))]
42705                            _ => {
42706                                // Skip unknown element
42707                                skip_element(reader)?;
42708                            }
42709                        }
42710                    }
42711                    Event::Empty(e) => {
42712                        match e.local_name().as_ref() {
42713                            b"smartTagType" => {
42714                                f_smart_tag_type.push(CTSmartTagType::from_xml(reader, &e, true)?);
42715                                #[cfg(feature = "extra-children")]
42716                                {
42717                                    child_idx += 1;
42718                                }
42719                            }
42720                            #[cfg(feature = "extra-children")]
42721                            _ => {
42722                                // Capture unknown empty element for roundtrip
42723                                let elem = RawXmlElement::from_empty(&e);
42724                                extra_children.push(PositionedNode::new(
42725                                    child_idx,
42726                                    RawXmlNode::Element(elem),
42727                                ));
42728                                child_idx += 1;
42729                            }
42730                            #[cfg(not(feature = "extra-children"))]
42731                            _ => {}
42732                        }
42733                    }
42734                    Event::End(_) => break,
42735                    Event::Eof => break,
42736                    _ => {}
42737                }
42738                buf.clear();
42739            }
42740        }
42741
42742        Ok(Self {
42743            smart_tag_type: f_smart_tag_type,
42744            #[cfg(feature = "extra-children")]
42745            extra_children,
42746        })
42747    }
42748}
42749
42750impl FromXml for CTSmartTagType {
42751    fn from_xml<R: BufRead>(
42752        reader: &mut Reader<R>,
42753        start_tag: &BytesStart,
42754        is_empty: bool,
42755    ) -> Result<Self, ParseError> {
42756        let mut f_namespace_uri = None;
42757        let mut f_name = None;
42758        let mut f_url = None;
42759        #[cfg(feature = "extra-attrs")]
42760        let mut extra_attrs = std::collections::HashMap::new();
42761
42762        // Parse attributes
42763        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42764            let val = String::from_utf8_lossy(&attr.value);
42765            match attr.key.local_name().as_ref() {
42766                b"namespaceUri" => {
42767                    f_namespace_uri = Some(val.into_owned());
42768                }
42769                b"name" => {
42770                    f_name = Some(val.into_owned());
42771                }
42772                b"url" => {
42773                    f_url = Some(val.into_owned());
42774                }
42775                #[cfg(feature = "extra-attrs")]
42776                unknown => {
42777                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42778                    extra_attrs.insert(key, val.into_owned());
42779                }
42780                #[cfg(not(feature = "extra-attrs"))]
42781                _ => {}
42782            }
42783        }
42784
42785        if !is_empty {
42786            let mut buf = Vec::new();
42787            loop {
42788                match reader.read_event_into(&mut buf)? {
42789                    Event::End(_) => break,
42790                    Event::Eof => break,
42791                    _ => {}
42792                }
42793                buf.clear();
42794            }
42795        }
42796
42797        Ok(Self {
42798            namespace_uri: f_namespace_uri,
42799            name: f_name,
42800            url: f_url,
42801            #[cfg(feature = "extra-attrs")]
42802            extra_attrs,
42803        })
42804    }
42805}
42806
42807impl FromXml for FileRecoveryProperties {
42808    fn from_xml<R: BufRead>(
42809        reader: &mut Reader<R>,
42810        start_tag: &BytesStart,
42811        is_empty: bool,
42812    ) -> Result<Self, ParseError> {
42813        let mut f_auto_recover = None;
42814        let mut f_crash_save = None;
42815        let mut f_data_extract_load = None;
42816        let mut f_repair_load = None;
42817        #[cfg(feature = "extra-attrs")]
42818        let mut extra_attrs = std::collections::HashMap::new();
42819
42820        // Parse attributes
42821        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42822            let val = String::from_utf8_lossy(&attr.value);
42823            match attr.key.local_name().as_ref() {
42824                b"autoRecover" => {
42825                    f_auto_recover = Some(val == "true" || val == "1");
42826                }
42827                b"crashSave" => {
42828                    f_crash_save = Some(val == "true" || val == "1");
42829                }
42830                b"dataExtractLoad" => {
42831                    f_data_extract_load = Some(val == "true" || val == "1");
42832                }
42833                b"repairLoad" => {
42834                    f_repair_load = Some(val == "true" || val == "1");
42835                }
42836                #[cfg(feature = "extra-attrs")]
42837                unknown => {
42838                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42839                    extra_attrs.insert(key, val.into_owned());
42840                }
42841                #[cfg(not(feature = "extra-attrs"))]
42842                _ => {}
42843            }
42844        }
42845
42846        if !is_empty {
42847            let mut buf = Vec::new();
42848            loop {
42849                match reader.read_event_into(&mut buf)? {
42850                    Event::End(_) => break,
42851                    Event::Eof => break,
42852                    _ => {}
42853                }
42854                buf.clear();
42855            }
42856        }
42857
42858        Ok(Self {
42859            auto_recover: f_auto_recover,
42860            crash_save: f_crash_save,
42861            data_extract_load: f_data_extract_load,
42862            repair_load: f_repair_load,
42863            #[cfg(feature = "extra-attrs")]
42864            extra_attrs,
42865        })
42866    }
42867}
42868
42869impl FromXml for CalculationProperties {
42870    fn from_xml<R: BufRead>(
42871        reader: &mut Reader<R>,
42872        start_tag: &BytesStart,
42873        is_empty: bool,
42874    ) -> Result<Self, ParseError> {
42875        #[cfg(feature = "sml-formulas")]
42876        let mut f_calc_id = None;
42877        #[cfg(feature = "sml-formulas")]
42878        let mut f_calc_mode = None;
42879        #[cfg(feature = "sml-formulas")]
42880        let mut f_full_calc_on_load = None;
42881        #[cfg(feature = "sml-formulas")]
42882        let mut f_ref_mode = None;
42883        #[cfg(feature = "sml-formulas-advanced")]
42884        let mut f_iterate = None;
42885        #[cfg(feature = "sml-formulas-advanced")]
42886        let mut f_iterate_count = None;
42887        #[cfg(feature = "sml-formulas-advanced")]
42888        let mut f_iterate_delta = None;
42889        #[cfg(feature = "sml-formulas")]
42890        let mut f_full_precision = None;
42891        #[cfg(feature = "sml-formulas")]
42892        let mut f_calc_completed = None;
42893        #[cfg(feature = "sml-formulas")]
42894        let mut f_calc_on_save = None;
42895        #[cfg(feature = "sml-formulas-advanced")]
42896        let mut f_concurrent_calc = None;
42897        #[cfg(feature = "sml-formulas-advanced")]
42898        let mut f_concurrent_manual_count = None;
42899        #[cfg(feature = "sml-formulas")]
42900        let mut f_force_full_calc = None;
42901        #[cfg(feature = "extra-attrs")]
42902        let mut extra_attrs = std::collections::HashMap::new();
42903
42904        // Parse attributes
42905        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
42906            let val = String::from_utf8_lossy(&attr.value);
42907            match attr.key.local_name().as_ref() {
42908                #[cfg(feature = "sml-formulas")]
42909                b"calcId" => {
42910                    f_calc_id = val.parse().ok();
42911                }
42912                #[cfg(feature = "sml-formulas")]
42913                b"calcMode" => {
42914                    f_calc_mode = val.parse().ok();
42915                }
42916                #[cfg(feature = "sml-formulas")]
42917                b"fullCalcOnLoad" => {
42918                    f_full_calc_on_load = Some(val == "true" || val == "1");
42919                }
42920                #[cfg(feature = "sml-formulas")]
42921                b"refMode" => {
42922                    f_ref_mode = val.parse().ok();
42923                }
42924                #[cfg(feature = "sml-formulas-advanced")]
42925                b"iterate" => {
42926                    f_iterate = Some(val == "true" || val == "1");
42927                }
42928                #[cfg(feature = "sml-formulas-advanced")]
42929                b"iterateCount" => {
42930                    f_iterate_count = val.parse().ok();
42931                }
42932                #[cfg(feature = "sml-formulas-advanced")]
42933                b"iterateDelta" => {
42934                    f_iterate_delta = val.parse().ok();
42935                }
42936                #[cfg(feature = "sml-formulas")]
42937                b"fullPrecision" => {
42938                    f_full_precision = Some(val == "true" || val == "1");
42939                }
42940                #[cfg(feature = "sml-formulas")]
42941                b"calcCompleted" => {
42942                    f_calc_completed = Some(val == "true" || val == "1");
42943                }
42944                #[cfg(feature = "sml-formulas")]
42945                b"calcOnSave" => {
42946                    f_calc_on_save = Some(val == "true" || val == "1");
42947                }
42948                #[cfg(feature = "sml-formulas-advanced")]
42949                b"concurrentCalc" => {
42950                    f_concurrent_calc = Some(val == "true" || val == "1");
42951                }
42952                #[cfg(feature = "sml-formulas-advanced")]
42953                b"concurrentManualCount" => {
42954                    f_concurrent_manual_count = val.parse().ok();
42955                }
42956                #[cfg(feature = "sml-formulas")]
42957                b"forceFullCalc" => {
42958                    f_force_full_calc = Some(val == "true" || val == "1");
42959                }
42960                #[cfg(feature = "extra-attrs")]
42961                unknown => {
42962                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
42963                    extra_attrs.insert(key, val.into_owned());
42964                }
42965                #[cfg(not(feature = "extra-attrs"))]
42966                _ => {}
42967            }
42968        }
42969
42970        if !is_empty {
42971            let mut buf = Vec::new();
42972            loop {
42973                match reader.read_event_into(&mut buf)? {
42974                    Event::End(_) => break,
42975                    Event::Eof => break,
42976                    _ => {}
42977                }
42978                buf.clear();
42979            }
42980        }
42981
42982        Ok(Self {
42983            #[cfg(feature = "sml-formulas")]
42984            calc_id: f_calc_id,
42985            #[cfg(feature = "sml-formulas")]
42986            calc_mode: f_calc_mode,
42987            #[cfg(feature = "sml-formulas")]
42988            full_calc_on_load: f_full_calc_on_load,
42989            #[cfg(feature = "sml-formulas")]
42990            ref_mode: f_ref_mode,
42991            #[cfg(feature = "sml-formulas-advanced")]
42992            iterate: f_iterate,
42993            #[cfg(feature = "sml-formulas-advanced")]
42994            iterate_count: f_iterate_count,
42995            #[cfg(feature = "sml-formulas-advanced")]
42996            iterate_delta: f_iterate_delta,
42997            #[cfg(feature = "sml-formulas")]
42998            full_precision: f_full_precision,
42999            #[cfg(feature = "sml-formulas")]
43000            calc_completed: f_calc_completed,
43001            #[cfg(feature = "sml-formulas")]
43002            calc_on_save: f_calc_on_save,
43003            #[cfg(feature = "sml-formulas-advanced")]
43004            concurrent_calc: f_concurrent_calc,
43005            #[cfg(feature = "sml-formulas-advanced")]
43006            concurrent_manual_count: f_concurrent_manual_count,
43007            #[cfg(feature = "sml-formulas")]
43008            force_full_calc: f_force_full_calc,
43009            #[cfg(feature = "extra-attrs")]
43010            extra_attrs,
43011        })
43012    }
43013}
43014
43015impl FromXml for DefinedNames {
43016    fn from_xml<R: BufRead>(
43017        reader: &mut Reader<R>,
43018        start_tag: &BytesStart,
43019        is_empty: bool,
43020    ) -> Result<Self, ParseError> {
43021        let mut f_defined_name = Vec::new();
43022        #[cfg(feature = "extra-children")]
43023        let mut extra_children = Vec::new();
43024        #[cfg(feature = "extra-children")]
43025        let mut child_idx: usize = 0;
43026
43027        // Parse child elements
43028        if !is_empty {
43029            let mut buf = Vec::new();
43030            loop {
43031                match reader.read_event_into(&mut buf)? {
43032                    Event::Start(e) => {
43033                        match e.local_name().as_ref() {
43034                            b"definedName" => {
43035                                f_defined_name.push(DefinedName::from_xml(reader, &e, false)?);
43036                                #[cfg(feature = "extra-children")]
43037                                {
43038                                    child_idx += 1;
43039                                }
43040                            }
43041                            #[cfg(feature = "extra-children")]
43042                            _ => {
43043                                // Capture unknown element for roundtrip
43044                                let elem = RawXmlElement::from_reader(reader, &e)?;
43045                                extra_children.push(PositionedNode::new(
43046                                    child_idx,
43047                                    RawXmlNode::Element(elem),
43048                                ));
43049                                child_idx += 1;
43050                            }
43051                            #[cfg(not(feature = "extra-children"))]
43052                            _ => {
43053                                // Skip unknown element
43054                                skip_element(reader)?;
43055                            }
43056                        }
43057                    }
43058                    Event::Empty(e) => {
43059                        match e.local_name().as_ref() {
43060                            b"definedName" => {
43061                                f_defined_name.push(DefinedName::from_xml(reader, &e, true)?);
43062                                #[cfg(feature = "extra-children")]
43063                                {
43064                                    child_idx += 1;
43065                                }
43066                            }
43067                            #[cfg(feature = "extra-children")]
43068                            _ => {
43069                                // Capture unknown empty element for roundtrip
43070                                let elem = RawXmlElement::from_empty(&e);
43071                                extra_children.push(PositionedNode::new(
43072                                    child_idx,
43073                                    RawXmlNode::Element(elem),
43074                                ));
43075                                child_idx += 1;
43076                            }
43077                            #[cfg(not(feature = "extra-children"))]
43078                            _ => {}
43079                        }
43080                    }
43081                    Event::End(_) => break,
43082                    Event::Eof => break,
43083                    _ => {}
43084                }
43085                buf.clear();
43086            }
43087        }
43088
43089        Ok(Self {
43090            defined_name: f_defined_name,
43091            #[cfg(feature = "extra-children")]
43092            extra_children,
43093        })
43094    }
43095}
43096
43097impl FromXml for DefinedName {
43098    fn from_xml<R: BufRead>(
43099        reader: &mut Reader<R>,
43100        start_tag: &BytesStart,
43101        is_empty: bool,
43102    ) -> Result<Self, ParseError> {
43103        let mut f_text = None;
43104        let mut f_name: Option<XmlString> = None;
43105        let mut f_comment = None;
43106        #[cfg(feature = "sml-formulas-advanced")]
43107        let mut f_custom_menu = None;
43108        let mut f_description = None;
43109        #[cfg(feature = "sml-formulas-advanced")]
43110        let mut f_help = None;
43111        #[cfg(feature = "sml-formulas-advanced")]
43112        let mut f_status_bar = None;
43113        let mut f_local_sheet_id = None;
43114        #[cfg(feature = "sml-structure")]
43115        let mut f_hidden = None;
43116        #[cfg(feature = "sml-formulas-advanced")]
43117        let mut f_function = None;
43118        #[cfg(feature = "sml-formulas-advanced")]
43119        let mut f_vb_procedure = None;
43120        #[cfg(feature = "sml-formulas-advanced")]
43121        let mut f_xlm = None;
43122        #[cfg(feature = "sml-formulas-advanced")]
43123        let mut f_function_group_id = None;
43124        #[cfg(feature = "sml-formulas-advanced")]
43125        let mut f_shortcut_key = None;
43126        #[cfg(feature = "sml-external")]
43127        let mut f_publish_to_server = None;
43128        #[cfg(feature = "sml-formulas-advanced")]
43129        let mut f_workbook_parameter = None;
43130        #[cfg(feature = "extra-attrs")]
43131        let mut extra_attrs = std::collections::HashMap::new();
43132        #[cfg(feature = "extra-children")]
43133        let mut extra_children = Vec::new();
43134        #[cfg(feature = "extra-children")]
43135        let mut child_idx: usize = 0;
43136
43137        // Parse attributes
43138        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43139            let val = String::from_utf8_lossy(&attr.value);
43140            match attr.key.local_name().as_ref() {
43141                b"name" => {
43142                    f_name = Some(val.into_owned());
43143                }
43144                b"comment" => {
43145                    f_comment = Some(val.into_owned());
43146                }
43147                #[cfg(feature = "sml-formulas-advanced")]
43148                b"customMenu" => {
43149                    f_custom_menu = Some(val.into_owned());
43150                }
43151                b"description" => {
43152                    f_description = Some(val.into_owned());
43153                }
43154                #[cfg(feature = "sml-formulas-advanced")]
43155                b"help" => {
43156                    f_help = Some(val.into_owned());
43157                }
43158                #[cfg(feature = "sml-formulas-advanced")]
43159                b"statusBar" => {
43160                    f_status_bar = Some(val.into_owned());
43161                }
43162                b"localSheetId" => {
43163                    f_local_sheet_id = val.parse().ok();
43164                }
43165                #[cfg(feature = "sml-structure")]
43166                b"hidden" => {
43167                    f_hidden = Some(val == "true" || val == "1");
43168                }
43169                #[cfg(feature = "sml-formulas-advanced")]
43170                b"function" => {
43171                    f_function = Some(val == "true" || val == "1");
43172                }
43173                #[cfg(feature = "sml-formulas-advanced")]
43174                b"vbProcedure" => {
43175                    f_vb_procedure = Some(val == "true" || val == "1");
43176                }
43177                #[cfg(feature = "sml-formulas-advanced")]
43178                b"xlm" => {
43179                    f_xlm = Some(val == "true" || val == "1");
43180                }
43181                #[cfg(feature = "sml-formulas-advanced")]
43182                b"functionGroupId" => {
43183                    f_function_group_id = val.parse().ok();
43184                }
43185                #[cfg(feature = "sml-formulas-advanced")]
43186                b"shortcutKey" => {
43187                    f_shortcut_key = Some(val.into_owned());
43188                }
43189                #[cfg(feature = "sml-external")]
43190                b"publishToServer" => {
43191                    f_publish_to_server = Some(val == "true" || val == "1");
43192                }
43193                #[cfg(feature = "sml-formulas-advanced")]
43194                b"workbookParameter" => {
43195                    f_workbook_parameter = Some(val == "true" || val == "1");
43196                }
43197                #[cfg(feature = "extra-attrs")]
43198                unknown => {
43199                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43200                    extra_attrs.insert(key, val.into_owned());
43201                }
43202                #[cfg(not(feature = "extra-attrs"))]
43203                _ => {}
43204            }
43205        }
43206
43207        // Parse child elements
43208        if !is_empty {
43209            let mut buf = Vec::new();
43210            loop {
43211                match reader.read_event_into(&mut buf)? {
43212                    Event::Start(e) => {
43213                        match e.local_name().as_ref() {
43214                            #[cfg(feature = "extra-children")]
43215                            _ => {
43216                                // Capture unknown element for roundtrip
43217                                let elem = RawXmlElement::from_reader(reader, &e)?;
43218                                extra_children.push(PositionedNode::new(
43219                                    child_idx,
43220                                    RawXmlNode::Element(elem),
43221                                ));
43222                                child_idx += 1;
43223                            }
43224                            #[cfg(not(feature = "extra-children"))]
43225                            _ => {
43226                                // Skip unknown element
43227                                skip_element(reader)?;
43228                            }
43229                        }
43230                    }
43231                    Event::Empty(e) => {
43232                        match e.local_name().as_ref() {
43233                            #[cfg(feature = "extra-children")]
43234                            _ => {
43235                                // Capture unknown empty element for roundtrip
43236                                let elem = RawXmlElement::from_empty(&e);
43237                                extra_children.push(PositionedNode::new(
43238                                    child_idx,
43239                                    RawXmlNode::Element(elem),
43240                                ));
43241                                child_idx += 1;
43242                            }
43243                            #[cfg(not(feature = "extra-children"))]
43244                            _ => {}
43245                        }
43246                    }
43247                    Event::Text(e) => {
43248                        let s = e.decode().unwrap_or_default();
43249                        f_text.get_or_insert_with(String::new).push_str(&s);
43250                    }
43251                    Event::GeneralRef(e) => {
43252                        let name = e.decode().unwrap_or_default();
43253                        if let Some(s) = quick_xml::escape::resolve_xml_entity(&name) {
43254                            f_text.get_or_insert_with(String::new).push_str(s);
43255                        }
43256                    }
43257                    Event::End(_) => break,
43258                    Event::Eof => break,
43259                    _ => {}
43260                }
43261                buf.clear();
43262            }
43263        }
43264
43265        Ok(Self {
43266            text: f_text,
43267            name: f_name.ok_or_else(|| ParseError::MissingAttribute("name".to_string()))?,
43268            comment: f_comment,
43269            #[cfg(feature = "sml-formulas-advanced")]
43270            custom_menu: f_custom_menu,
43271            description: f_description,
43272            #[cfg(feature = "sml-formulas-advanced")]
43273            help: f_help,
43274            #[cfg(feature = "sml-formulas-advanced")]
43275            status_bar: f_status_bar,
43276            local_sheet_id: f_local_sheet_id,
43277            #[cfg(feature = "sml-structure")]
43278            hidden: f_hidden,
43279            #[cfg(feature = "sml-formulas-advanced")]
43280            function: f_function,
43281            #[cfg(feature = "sml-formulas-advanced")]
43282            vb_procedure: f_vb_procedure,
43283            #[cfg(feature = "sml-formulas-advanced")]
43284            xlm: f_xlm,
43285            #[cfg(feature = "sml-formulas-advanced")]
43286            function_group_id: f_function_group_id,
43287            #[cfg(feature = "sml-formulas-advanced")]
43288            shortcut_key: f_shortcut_key,
43289            #[cfg(feature = "sml-external")]
43290            publish_to_server: f_publish_to_server,
43291            #[cfg(feature = "sml-formulas-advanced")]
43292            workbook_parameter: f_workbook_parameter,
43293            #[cfg(feature = "extra-attrs")]
43294            extra_attrs,
43295            #[cfg(feature = "extra-children")]
43296            extra_children,
43297        })
43298    }
43299}
43300
43301impl FromXml for ExternalReferences {
43302    fn from_xml<R: BufRead>(
43303        reader: &mut Reader<R>,
43304        start_tag: &BytesStart,
43305        is_empty: bool,
43306    ) -> Result<Self, ParseError> {
43307        let mut f_external_reference = Vec::new();
43308        #[cfg(feature = "extra-children")]
43309        let mut extra_children = Vec::new();
43310        #[cfg(feature = "extra-children")]
43311        let mut child_idx: usize = 0;
43312
43313        // Parse child elements
43314        if !is_empty {
43315            let mut buf = Vec::new();
43316            loop {
43317                match reader.read_event_into(&mut buf)? {
43318                    Event::Start(e) => {
43319                        match e.local_name().as_ref() {
43320                            b"externalReference" => {
43321                                f_external_reference
43322                                    .push(ExternalReference::from_xml(reader, &e, false)?);
43323                                #[cfg(feature = "extra-children")]
43324                                {
43325                                    child_idx += 1;
43326                                }
43327                            }
43328                            #[cfg(feature = "extra-children")]
43329                            _ => {
43330                                // Capture unknown element for roundtrip
43331                                let elem = RawXmlElement::from_reader(reader, &e)?;
43332                                extra_children.push(PositionedNode::new(
43333                                    child_idx,
43334                                    RawXmlNode::Element(elem),
43335                                ));
43336                                child_idx += 1;
43337                            }
43338                            #[cfg(not(feature = "extra-children"))]
43339                            _ => {
43340                                // Skip unknown element
43341                                skip_element(reader)?;
43342                            }
43343                        }
43344                    }
43345                    Event::Empty(e) => {
43346                        match e.local_name().as_ref() {
43347                            b"externalReference" => {
43348                                f_external_reference
43349                                    .push(ExternalReference::from_xml(reader, &e, true)?);
43350                                #[cfg(feature = "extra-children")]
43351                                {
43352                                    child_idx += 1;
43353                                }
43354                            }
43355                            #[cfg(feature = "extra-children")]
43356                            _ => {
43357                                // Capture unknown empty element for roundtrip
43358                                let elem = RawXmlElement::from_empty(&e);
43359                                extra_children.push(PositionedNode::new(
43360                                    child_idx,
43361                                    RawXmlNode::Element(elem),
43362                                ));
43363                                child_idx += 1;
43364                            }
43365                            #[cfg(not(feature = "extra-children"))]
43366                            _ => {}
43367                        }
43368                    }
43369                    Event::End(_) => break,
43370                    Event::Eof => break,
43371                    _ => {}
43372                }
43373                buf.clear();
43374            }
43375        }
43376
43377        Ok(Self {
43378            external_reference: f_external_reference,
43379            #[cfg(feature = "extra-children")]
43380            extra_children,
43381        })
43382    }
43383}
43384
43385impl FromXml for ExternalReference {
43386    fn from_xml<R: BufRead>(
43387        reader: &mut Reader<R>,
43388        start_tag: &BytesStart,
43389        is_empty: bool,
43390    ) -> Result<Self, ParseError> {
43391        let mut f_id: Option<STRelationshipId> = None;
43392        #[cfg(feature = "extra-attrs")]
43393        let mut extra_attrs = std::collections::HashMap::new();
43394
43395        // Parse attributes
43396        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43397            let val = String::from_utf8_lossy(&attr.value);
43398            match attr.key.local_name().as_ref() {
43399                b"id" => {
43400                    f_id = Some(val.into_owned());
43401                }
43402                #[cfg(feature = "extra-attrs")]
43403                unknown => {
43404                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43405                    extra_attrs.insert(key, val.into_owned());
43406                }
43407                #[cfg(not(feature = "extra-attrs"))]
43408                _ => {}
43409            }
43410        }
43411
43412        if !is_empty {
43413            let mut buf = Vec::new();
43414            loop {
43415                match reader.read_event_into(&mut buf)? {
43416                    Event::End(_) => break,
43417                    Event::Eof => break,
43418                    _ => {}
43419                }
43420                buf.clear();
43421            }
43422        }
43423
43424        Ok(Self {
43425            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
43426            #[cfg(feature = "extra-attrs")]
43427            extra_attrs,
43428        })
43429    }
43430}
43431
43432impl FromXml for SheetBackgroundPicture {
43433    fn from_xml<R: BufRead>(
43434        reader: &mut Reader<R>,
43435        start_tag: &BytesStart,
43436        is_empty: bool,
43437    ) -> Result<Self, ParseError> {
43438        let mut f_id: Option<STRelationshipId> = None;
43439        #[cfg(feature = "extra-attrs")]
43440        let mut extra_attrs = std::collections::HashMap::new();
43441
43442        // Parse attributes
43443        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43444            let val = String::from_utf8_lossy(&attr.value);
43445            match attr.key.local_name().as_ref() {
43446                b"id" => {
43447                    f_id = Some(val.into_owned());
43448                }
43449                #[cfg(feature = "extra-attrs")]
43450                unknown => {
43451                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43452                    extra_attrs.insert(key, val.into_owned());
43453                }
43454                #[cfg(not(feature = "extra-attrs"))]
43455                _ => {}
43456            }
43457        }
43458
43459        if !is_empty {
43460            let mut buf = Vec::new();
43461            loop {
43462                match reader.read_event_into(&mut buf)? {
43463                    Event::End(_) => break,
43464                    Event::Eof => break,
43465                    _ => {}
43466                }
43467                buf.clear();
43468            }
43469        }
43470
43471        Ok(Self {
43472            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
43473            #[cfg(feature = "extra-attrs")]
43474            extra_attrs,
43475        })
43476    }
43477}
43478
43479impl FromXml for PivotCaches {
43480    fn from_xml<R: BufRead>(
43481        reader: &mut Reader<R>,
43482        start_tag: &BytesStart,
43483        is_empty: bool,
43484    ) -> Result<Self, ParseError> {
43485        let mut f_pivot_cache = Vec::new();
43486        #[cfg(feature = "extra-children")]
43487        let mut extra_children = Vec::new();
43488        #[cfg(feature = "extra-children")]
43489        let mut child_idx: usize = 0;
43490
43491        // Parse child elements
43492        if !is_empty {
43493            let mut buf = Vec::new();
43494            loop {
43495                match reader.read_event_into(&mut buf)? {
43496                    Event::Start(e) => {
43497                        match e.local_name().as_ref() {
43498                            b"pivotCache" => {
43499                                f_pivot_cache.push(CTPivotCache::from_xml(reader, &e, false)?);
43500                                #[cfg(feature = "extra-children")]
43501                                {
43502                                    child_idx += 1;
43503                                }
43504                            }
43505                            #[cfg(feature = "extra-children")]
43506                            _ => {
43507                                // Capture unknown element for roundtrip
43508                                let elem = RawXmlElement::from_reader(reader, &e)?;
43509                                extra_children.push(PositionedNode::new(
43510                                    child_idx,
43511                                    RawXmlNode::Element(elem),
43512                                ));
43513                                child_idx += 1;
43514                            }
43515                            #[cfg(not(feature = "extra-children"))]
43516                            _ => {
43517                                // Skip unknown element
43518                                skip_element(reader)?;
43519                            }
43520                        }
43521                    }
43522                    Event::Empty(e) => {
43523                        match e.local_name().as_ref() {
43524                            b"pivotCache" => {
43525                                f_pivot_cache.push(CTPivotCache::from_xml(reader, &e, true)?);
43526                                #[cfg(feature = "extra-children")]
43527                                {
43528                                    child_idx += 1;
43529                                }
43530                            }
43531                            #[cfg(feature = "extra-children")]
43532                            _ => {
43533                                // Capture unknown empty element for roundtrip
43534                                let elem = RawXmlElement::from_empty(&e);
43535                                extra_children.push(PositionedNode::new(
43536                                    child_idx,
43537                                    RawXmlNode::Element(elem),
43538                                ));
43539                                child_idx += 1;
43540                            }
43541                            #[cfg(not(feature = "extra-children"))]
43542                            _ => {}
43543                        }
43544                    }
43545                    Event::End(_) => break,
43546                    Event::Eof => break,
43547                    _ => {}
43548                }
43549                buf.clear();
43550            }
43551        }
43552
43553        Ok(Self {
43554            pivot_cache: f_pivot_cache,
43555            #[cfg(feature = "extra-children")]
43556            extra_children,
43557        })
43558    }
43559}
43560
43561impl FromXml for CTPivotCache {
43562    fn from_xml<R: BufRead>(
43563        reader: &mut Reader<R>,
43564        start_tag: &BytesStart,
43565        is_empty: bool,
43566    ) -> Result<Self, ParseError> {
43567        let mut f_cache_id: Option<u32> = None;
43568        let mut f_id: Option<STRelationshipId> = None;
43569        #[cfg(feature = "extra-attrs")]
43570        let mut extra_attrs = std::collections::HashMap::new();
43571
43572        // Parse attributes
43573        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43574            let val = String::from_utf8_lossy(&attr.value);
43575            match attr.key.local_name().as_ref() {
43576                b"cacheId" => {
43577                    f_cache_id = val.parse().ok();
43578                }
43579                b"id" => {
43580                    f_id = Some(val.into_owned());
43581                }
43582                #[cfg(feature = "extra-attrs")]
43583                unknown => {
43584                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43585                    extra_attrs.insert(key, val.into_owned());
43586                }
43587                #[cfg(not(feature = "extra-attrs"))]
43588                _ => {}
43589            }
43590        }
43591
43592        if !is_empty {
43593            let mut buf = Vec::new();
43594            loop {
43595                match reader.read_event_into(&mut buf)? {
43596                    Event::End(_) => break,
43597                    Event::Eof => break,
43598                    _ => {}
43599                }
43600                buf.clear();
43601            }
43602        }
43603
43604        Ok(Self {
43605            cache_id: f_cache_id
43606                .ok_or_else(|| ParseError::MissingAttribute("cacheId".to_string()))?,
43607            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
43608            #[cfg(feature = "extra-attrs")]
43609            extra_attrs,
43610        })
43611    }
43612}
43613
43614impl FromXml for FileSharing {
43615    fn from_xml<R: BufRead>(
43616        reader: &mut Reader<R>,
43617        start_tag: &BytesStart,
43618        is_empty: bool,
43619    ) -> Result<Self, ParseError> {
43620        let mut f_read_only_recommended = None;
43621        let mut f_user_name = None;
43622        let mut f_reservation_password = None;
43623        let mut f_algorithm_name = None;
43624        let mut f_hash_value = None;
43625        let mut f_salt_value = None;
43626        let mut f_spin_count = None;
43627        #[cfg(feature = "extra-attrs")]
43628        let mut extra_attrs = std::collections::HashMap::new();
43629
43630        // Parse attributes
43631        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43632            let val = String::from_utf8_lossy(&attr.value);
43633            match attr.key.local_name().as_ref() {
43634                b"readOnlyRecommended" => {
43635                    f_read_only_recommended = Some(val == "true" || val == "1");
43636                }
43637                b"userName" => {
43638                    f_user_name = Some(val.into_owned());
43639                }
43640                b"reservationPassword" => {
43641                    f_reservation_password = decode_hex(&val);
43642                }
43643                b"algorithmName" => {
43644                    f_algorithm_name = Some(val.into_owned());
43645                }
43646                b"hashValue" => {
43647                    f_hash_value = decode_base64(&val);
43648                }
43649                b"saltValue" => {
43650                    f_salt_value = decode_base64(&val);
43651                }
43652                b"spinCount" => {
43653                    f_spin_count = val.parse().ok();
43654                }
43655                #[cfg(feature = "extra-attrs")]
43656                unknown => {
43657                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43658                    extra_attrs.insert(key, val.into_owned());
43659                }
43660                #[cfg(not(feature = "extra-attrs"))]
43661                _ => {}
43662            }
43663        }
43664
43665        if !is_empty {
43666            let mut buf = Vec::new();
43667            loop {
43668                match reader.read_event_into(&mut buf)? {
43669                    Event::End(_) => break,
43670                    Event::Eof => break,
43671                    _ => {}
43672                }
43673                buf.clear();
43674            }
43675        }
43676
43677        Ok(Self {
43678            read_only_recommended: f_read_only_recommended,
43679            user_name: f_user_name,
43680            reservation_password: f_reservation_password,
43681            algorithm_name: f_algorithm_name,
43682            hash_value: f_hash_value,
43683            salt_value: f_salt_value,
43684            spin_count: f_spin_count,
43685            #[cfg(feature = "extra-attrs")]
43686            extra_attrs,
43687        })
43688    }
43689}
43690
43691impl FromXml for CTOleSize {
43692    fn from_xml<R: BufRead>(
43693        reader: &mut Reader<R>,
43694        start_tag: &BytesStart,
43695        is_empty: bool,
43696    ) -> Result<Self, ParseError> {
43697        let mut f_reference: Option<Reference> = None;
43698        #[cfg(feature = "extra-attrs")]
43699        let mut extra_attrs = std::collections::HashMap::new();
43700
43701        // Parse attributes
43702        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43703            let val = String::from_utf8_lossy(&attr.value);
43704            match attr.key.local_name().as_ref() {
43705                b"ref" => {
43706                    f_reference = Some(val.into_owned());
43707                }
43708                #[cfg(feature = "extra-attrs")]
43709                unknown => {
43710                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43711                    extra_attrs.insert(key, val.into_owned());
43712                }
43713                #[cfg(not(feature = "extra-attrs"))]
43714                _ => {}
43715            }
43716        }
43717
43718        if !is_empty {
43719            let mut buf = Vec::new();
43720            loop {
43721                match reader.read_event_into(&mut buf)? {
43722                    Event::End(_) => break,
43723                    Event::Eof => break,
43724                    _ => {}
43725                }
43726                buf.clear();
43727            }
43728        }
43729
43730        Ok(Self {
43731            reference: f_reference
43732                .ok_or_else(|| ParseError::MissingAttribute("ref".to_string()))?,
43733            #[cfg(feature = "extra-attrs")]
43734            extra_attrs,
43735        })
43736    }
43737}
43738
43739impl FromXml for WorkbookProtection {
43740    fn from_xml<R: BufRead>(
43741        reader: &mut Reader<R>,
43742        start_tag: &BytesStart,
43743        is_empty: bool,
43744    ) -> Result<Self, ParseError> {
43745        let mut f_workbook_password = None;
43746        let mut f_workbook_password_character_set = None;
43747        let mut f_revisions_password = None;
43748        let mut f_revisions_password_character_set = None;
43749        let mut f_lock_structure = None;
43750        let mut f_lock_windows = None;
43751        let mut f_lock_revision = None;
43752        let mut f_revisions_algorithm_name = None;
43753        let mut f_revisions_hash_value = None;
43754        let mut f_revisions_salt_value = None;
43755        let mut f_revisions_spin_count = None;
43756        let mut f_workbook_algorithm_name = None;
43757        let mut f_workbook_hash_value = None;
43758        let mut f_workbook_salt_value = None;
43759        let mut f_workbook_spin_count = None;
43760        #[cfg(feature = "extra-attrs")]
43761        let mut extra_attrs = std::collections::HashMap::new();
43762
43763        // Parse attributes
43764        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43765            let val = String::from_utf8_lossy(&attr.value);
43766            match attr.key.local_name().as_ref() {
43767                b"workbookPassword" => {
43768                    f_workbook_password = decode_hex(&val);
43769                }
43770                b"workbookPasswordCharacterSet" => {
43771                    f_workbook_password_character_set = Some(val.into_owned());
43772                }
43773                b"revisionsPassword" => {
43774                    f_revisions_password = decode_hex(&val);
43775                }
43776                b"revisionsPasswordCharacterSet" => {
43777                    f_revisions_password_character_set = Some(val.into_owned());
43778                }
43779                b"lockStructure" => {
43780                    f_lock_structure = Some(val == "true" || val == "1");
43781                }
43782                b"lockWindows" => {
43783                    f_lock_windows = Some(val == "true" || val == "1");
43784                }
43785                b"lockRevision" => {
43786                    f_lock_revision = Some(val == "true" || val == "1");
43787                }
43788                b"revisionsAlgorithmName" => {
43789                    f_revisions_algorithm_name = Some(val.into_owned());
43790                }
43791                b"revisionsHashValue" => {
43792                    f_revisions_hash_value = decode_base64(&val);
43793                }
43794                b"revisionsSaltValue" => {
43795                    f_revisions_salt_value = decode_base64(&val);
43796                }
43797                b"revisionsSpinCount" => {
43798                    f_revisions_spin_count = val.parse().ok();
43799                }
43800                b"workbookAlgorithmName" => {
43801                    f_workbook_algorithm_name = Some(val.into_owned());
43802                }
43803                b"workbookHashValue" => {
43804                    f_workbook_hash_value = decode_base64(&val);
43805                }
43806                b"workbookSaltValue" => {
43807                    f_workbook_salt_value = decode_base64(&val);
43808                }
43809                b"workbookSpinCount" => {
43810                    f_workbook_spin_count = val.parse().ok();
43811                }
43812                #[cfg(feature = "extra-attrs")]
43813                unknown => {
43814                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43815                    extra_attrs.insert(key, val.into_owned());
43816                }
43817                #[cfg(not(feature = "extra-attrs"))]
43818                _ => {}
43819            }
43820        }
43821
43822        if !is_empty {
43823            let mut buf = Vec::new();
43824            loop {
43825                match reader.read_event_into(&mut buf)? {
43826                    Event::End(_) => break,
43827                    Event::Eof => break,
43828                    _ => {}
43829                }
43830                buf.clear();
43831            }
43832        }
43833
43834        Ok(Self {
43835            workbook_password: f_workbook_password,
43836            workbook_password_character_set: f_workbook_password_character_set,
43837            revisions_password: f_revisions_password,
43838            revisions_password_character_set: f_revisions_password_character_set,
43839            lock_structure: f_lock_structure,
43840            lock_windows: f_lock_windows,
43841            lock_revision: f_lock_revision,
43842            revisions_algorithm_name: f_revisions_algorithm_name,
43843            revisions_hash_value: f_revisions_hash_value,
43844            revisions_salt_value: f_revisions_salt_value,
43845            revisions_spin_count: f_revisions_spin_count,
43846            workbook_algorithm_name: f_workbook_algorithm_name,
43847            workbook_hash_value: f_workbook_hash_value,
43848            workbook_salt_value: f_workbook_salt_value,
43849            workbook_spin_count: f_workbook_spin_count,
43850            #[cfg(feature = "extra-attrs")]
43851            extra_attrs,
43852        })
43853    }
43854}
43855
43856impl FromXml for WebPublishing {
43857    fn from_xml<R: BufRead>(
43858        reader: &mut Reader<R>,
43859        start_tag: &BytesStart,
43860        is_empty: bool,
43861    ) -> Result<Self, ParseError> {
43862        let mut f_css = None;
43863        let mut f_thicket = None;
43864        let mut f_long_file_names = None;
43865        let mut f_vml = None;
43866        let mut f_allow_png = None;
43867        let mut f_target_screen_size = None;
43868        let mut f_dpi = None;
43869        let mut f_code_page = None;
43870        let mut f_character_set = None;
43871        #[cfg(feature = "extra-attrs")]
43872        let mut extra_attrs = std::collections::HashMap::new();
43873
43874        // Parse attributes
43875        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43876            let val = String::from_utf8_lossy(&attr.value);
43877            match attr.key.local_name().as_ref() {
43878                b"css" => {
43879                    f_css = Some(val == "true" || val == "1");
43880                }
43881                b"thicket" => {
43882                    f_thicket = Some(val == "true" || val == "1");
43883                }
43884                b"longFileNames" => {
43885                    f_long_file_names = Some(val == "true" || val == "1");
43886                }
43887                b"vml" => {
43888                    f_vml = Some(val == "true" || val == "1");
43889                }
43890                b"allowPng" => {
43891                    f_allow_png = Some(val == "true" || val == "1");
43892                }
43893                b"targetScreenSize" => {
43894                    f_target_screen_size = val.parse().ok();
43895                }
43896                b"dpi" => {
43897                    f_dpi = val.parse().ok();
43898                }
43899                b"codePage" => {
43900                    f_code_page = val.parse().ok();
43901                }
43902                b"characterSet" => {
43903                    f_character_set = Some(val.into_owned());
43904                }
43905                #[cfg(feature = "extra-attrs")]
43906                unknown => {
43907                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43908                    extra_attrs.insert(key, val.into_owned());
43909                }
43910                #[cfg(not(feature = "extra-attrs"))]
43911                _ => {}
43912            }
43913        }
43914
43915        if !is_empty {
43916            let mut buf = Vec::new();
43917            loop {
43918                match reader.read_event_into(&mut buf)? {
43919                    Event::End(_) => break,
43920                    Event::Eof => break,
43921                    _ => {}
43922                }
43923                buf.clear();
43924            }
43925        }
43926
43927        Ok(Self {
43928            css: f_css,
43929            thicket: f_thicket,
43930            long_file_names: f_long_file_names,
43931            vml: f_vml,
43932            allow_png: f_allow_png,
43933            target_screen_size: f_target_screen_size,
43934            dpi: f_dpi,
43935            code_page: f_code_page,
43936            character_set: f_character_set,
43937            #[cfg(feature = "extra-attrs")]
43938            extra_attrs,
43939        })
43940    }
43941}
43942
43943impl FromXml for CTFunctionGroups {
43944    fn from_xml<R: BufRead>(
43945        reader: &mut Reader<R>,
43946        start_tag: &BytesStart,
43947        is_empty: bool,
43948    ) -> Result<Self, ParseError> {
43949        let mut f_built_in_group_count = None;
43950        let mut f_function_group = Vec::new();
43951        #[cfg(feature = "extra-attrs")]
43952        let mut extra_attrs = std::collections::HashMap::new();
43953        #[cfg(feature = "extra-children")]
43954        let mut extra_children = Vec::new();
43955        #[cfg(feature = "extra-children")]
43956        let mut child_idx: usize = 0;
43957
43958        // Parse attributes
43959        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
43960            let val = String::from_utf8_lossy(&attr.value);
43961            match attr.key.local_name().as_ref() {
43962                b"builtInGroupCount" => {
43963                    f_built_in_group_count = val.parse().ok();
43964                }
43965                #[cfg(feature = "extra-attrs")]
43966                unknown => {
43967                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
43968                    extra_attrs.insert(key, val.into_owned());
43969                }
43970                #[cfg(not(feature = "extra-attrs"))]
43971                _ => {}
43972            }
43973        }
43974
43975        // Parse child elements
43976        if !is_empty {
43977            let mut buf = Vec::new();
43978            loop {
43979                match reader.read_event_into(&mut buf)? {
43980                    Event::Start(e) => {
43981                        match e.local_name().as_ref() {
43982                            b"functionGroup" => {
43983                                f_function_group
43984                                    .push(CTFunctionGroup::from_xml(reader, &e, false)?);
43985                                #[cfg(feature = "extra-children")]
43986                                {
43987                                    child_idx += 1;
43988                                }
43989                            }
43990                            #[cfg(feature = "extra-children")]
43991                            _ => {
43992                                // Capture unknown element for roundtrip
43993                                let elem = RawXmlElement::from_reader(reader, &e)?;
43994                                extra_children.push(PositionedNode::new(
43995                                    child_idx,
43996                                    RawXmlNode::Element(elem),
43997                                ));
43998                                child_idx += 1;
43999                            }
44000                            #[cfg(not(feature = "extra-children"))]
44001                            _ => {
44002                                // Skip unknown element
44003                                skip_element(reader)?;
44004                            }
44005                        }
44006                    }
44007                    Event::Empty(e) => {
44008                        match e.local_name().as_ref() {
44009                            b"functionGroup" => {
44010                                f_function_group.push(CTFunctionGroup::from_xml(reader, &e, true)?);
44011                                #[cfg(feature = "extra-children")]
44012                                {
44013                                    child_idx += 1;
44014                                }
44015                            }
44016                            #[cfg(feature = "extra-children")]
44017                            _ => {
44018                                // Capture unknown empty element for roundtrip
44019                                let elem = RawXmlElement::from_empty(&e);
44020                                extra_children.push(PositionedNode::new(
44021                                    child_idx,
44022                                    RawXmlNode::Element(elem),
44023                                ));
44024                                child_idx += 1;
44025                            }
44026                            #[cfg(not(feature = "extra-children"))]
44027                            _ => {}
44028                        }
44029                    }
44030                    Event::End(_) => break,
44031                    Event::Eof => break,
44032                    _ => {}
44033                }
44034                buf.clear();
44035            }
44036        }
44037
44038        Ok(Self {
44039            built_in_group_count: f_built_in_group_count,
44040            function_group: f_function_group,
44041            #[cfg(feature = "extra-attrs")]
44042            extra_attrs,
44043            #[cfg(feature = "extra-children")]
44044            extra_children,
44045        })
44046    }
44047}
44048
44049impl FromXml for CTFunctionGroup {
44050    fn from_xml<R: BufRead>(
44051        reader: &mut Reader<R>,
44052        start_tag: &BytesStart,
44053        is_empty: bool,
44054    ) -> Result<Self, ParseError> {
44055        let mut f_name = None;
44056        #[cfg(feature = "extra-attrs")]
44057        let mut extra_attrs = std::collections::HashMap::new();
44058
44059        // Parse attributes
44060        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
44061            let val = String::from_utf8_lossy(&attr.value);
44062            match attr.key.local_name().as_ref() {
44063                b"name" => {
44064                    f_name = Some(val.into_owned());
44065                }
44066                #[cfg(feature = "extra-attrs")]
44067                unknown => {
44068                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
44069                    extra_attrs.insert(key, val.into_owned());
44070                }
44071                #[cfg(not(feature = "extra-attrs"))]
44072                _ => {}
44073            }
44074        }
44075
44076        if !is_empty {
44077            let mut buf = Vec::new();
44078            loop {
44079                match reader.read_event_into(&mut buf)? {
44080                    Event::End(_) => break,
44081                    Event::Eof => break,
44082                    _ => {}
44083                }
44084                buf.clear();
44085            }
44086        }
44087
44088        Ok(Self {
44089            name: f_name,
44090            #[cfg(feature = "extra-attrs")]
44091            extra_attrs,
44092        })
44093    }
44094}
44095
44096impl FromXml for CTWebPublishObjects {
44097    fn from_xml<R: BufRead>(
44098        reader: &mut Reader<R>,
44099        start_tag: &BytesStart,
44100        is_empty: bool,
44101    ) -> Result<Self, ParseError> {
44102        let mut f_count = None;
44103        let mut f_web_publish_object = Vec::new();
44104        #[cfg(feature = "extra-attrs")]
44105        let mut extra_attrs = std::collections::HashMap::new();
44106        #[cfg(feature = "extra-children")]
44107        let mut extra_children = Vec::new();
44108        #[cfg(feature = "extra-children")]
44109        let mut child_idx: usize = 0;
44110
44111        // Parse attributes
44112        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
44113            let val = String::from_utf8_lossy(&attr.value);
44114            match attr.key.local_name().as_ref() {
44115                b"count" => {
44116                    f_count = val.parse().ok();
44117                }
44118                #[cfg(feature = "extra-attrs")]
44119                unknown => {
44120                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
44121                    extra_attrs.insert(key, val.into_owned());
44122                }
44123                #[cfg(not(feature = "extra-attrs"))]
44124                _ => {}
44125            }
44126        }
44127
44128        // Parse child elements
44129        if !is_empty {
44130            let mut buf = Vec::new();
44131            loop {
44132                match reader.read_event_into(&mut buf)? {
44133                    Event::Start(e) => {
44134                        match e.local_name().as_ref() {
44135                            b"webPublishObject" => {
44136                                f_web_publish_object
44137                                    .push(CTWebPublishObject::from_xml(reader, &e, false)?);
44138                                #[cfg(feature = "extra-children")]
44139                                {
44140                                    child_idx += 1;
44141                                }
44142                            }
44143                            #[cfg(feature = "extra-children")]
44144                            _ => {
44145                                // Capture unknown element for roundtrip
44146                                let elem = RawXmlElement::from_reader(reader, &e)?;
44147                                extra_children.push(PositionedNode::new(
44148                                    child_idx,
44149                                    RawXmlNode::Element(elem),
44150                                ));
44151                                child_idx += 1;
44152                            }
44153                            #[cfg(not(feature = "extra-children"))]
44154                            _ => {
44155                                // Skip unknown element
44156                                skip_element(reader)?;
44157                            }
44158                        }
44159                    }
44160                    Event::Empty(e) => {
44161                        match e.local_name().as_ref() {
44162                            b"webPublishObject" => {
44163                                f_web_publish_object
44164                                    .push(CTWebPublishObject::from_xml(reader, &e, true)?);
44165                                #[cfg(feature = "extra-children")]
44166                                {
44167                                    child_idx += 1;
44168                                }
44169                            }
44170                            #[cfg(feature = "extra-children")]
44171                            _ => {
44172                                // Capture unknown empty element for roundtrip
44173                                let elem = RawXmlElement::from_empty(&e);
44174                                extra_children.push(PositionedNode::new(
44175                                    child_idx,
44176                                    RawXmlNode::Element(elem),
44177                                ));
44178                                child_idx += 1;
44179                            }
44180                            #[cfg(not(feature = "extra-children"))]
44181                            _ => {}
44182                        }
44183                    }
44184                    Event::End(_) => break,
44185                    Event::Eof => break,
44186                    _ => {}
44187                }
44188                buf.clear();
44189            }
44190        }
44191
44192        Ok(Self {
44193            count: f_count,
44194            web_publish_object: f_web_publish_object,
44195            #[cfg(feature = "extra-attrs")]
44196            extra_attrs,
44197            #[cfg(feature = "extra-children")]
44198            extra_children,
44199        })
44200    }
44201}
44202
44203impl FromXml for CTWebPublishObject {
44204    fn from_xml<R: BufRead>(
44205        reader: &mut Reader<R>,
44206        start_tag: &BytesStart,
44207        is_empty: bool,
44208    ) -> Result<Self, ParseError> {
44209        let mut f_id: Option<u32> = None;
44210        let mut f_div_id: Option<XmlString> = None;
44211        let mut f_source_object = None;
44212        let mut f_destination_file: Option<XmlString> = None;
44213        let mut f_title = None;
44214        let mut f_auto_republish = None;
44215        #[cfg(feature = "extra-attrs")]
44216        let mut extra_attrs = std::collections::HashMap::new();
44217
44218        // Parse attributes
44219        for attr in start_tag.attributes().filter_map(|a| a.ok()) {
44220            let val = String::from_utf8_lossy(&attr.value);
44221            match attr.key.local_name().as_ref() {
44222                b"id" => {
44223                    f_id = val.parse().ok();
44224                }
44225                b"divId" => {
44226                    f_div_id = Some(val.into_owned());
44227                }
44228                b"sourceObject" => {
44229                    f_source_object = Some(val.into_owned());
44230                }
44231                b"destinationFile" => {
44232                    f_destination_file = Some(val.into_owned());
44233                }
44234                b"title" => {
44235                    f_title = Some(val.into_owned());
44236                }
44237                b"autoRepublish" => {
44238                    f_auto_republish = Some(val == "true" || val == "1");
44239                }
44240                #[cfg(feature = "extra-attrs")]
44241                unknown => {
44242                    let key = String::from_utf8_lossy(attr.key.as_ref()).into_owned();
44243                    extra_attrs.insert(key, val.into_owned());
44244                }
44245                #[cfg(not(feature = "extra-attrs"))]
44246                _ => {}
44247            }
44248        }
44249
44250        if !is_empty {
44251            let mut buf = Vec::new();
44252            loop {
44253                match reader.read_event_into(&mut buf)? {
44254                    Event::End(_) => break,
44255                    Event::Eof => break,
44256                    _ => {}
44257                }
44258                buf.clear();
44259            }
44260        }
44261
44262        Ok(Self {
44263            id: f_id.ok_or_else(|| ParseError::MissingAttribute("id".to_string()))?,
44264            div_id: f_div_id.ok_or_else(|| ParseError::MissingAttribute("divId".to_string()))?,
44265            source_object: f_source_object,
44266            destination_file: f_destination_file
44267                .ok_or_else(|| ParseError::MissingAttribute("destinationFile".to_string()))?,
44268            title: f_title,
44269            auto_republish: f_auto_republish,
44270            #[cfg(feature = "extra-attrs")]
44271            extra_attrs,
44272        })
44273    }
44274}