/// <summary>
        /// Populates this <see cref="Spirometer"/> instance from the data in the XML.
        /// </summary>
        /// 
        /// <param name="typeSpecificXml">
        /// The XML to get the spirometer data from.
        /// </param>
        /// 
        /// <exception cref="InvalidOperationException">
        /// The first node in the <paramref name="typeSpecificXml"/> parameter 
        /// is not a spirometer node.
        /// </exception>
        /// 
        protected override void ParseXml(IXPathNavigable typeSpecificXml)
        {
            XPathNavigator spirometerNav =
                typeSpecificXml.CreateNavigator().SelectSingleNode(
                    "spirometer");

            Validator.ThrowInvalidIfNull(spirometerNav, "SpirometerUnexpectedNode");

            _when = new HealthServiceDateTime();
            _when.ParseXml(spirometerNav.SelectSingleNode("when"));

            _forcedExpiratoryVolume =
                XPathHelper.GetOptNavValue<FlowMeasurement>(
                    spirometerNav,
                    "fev1");

            _peakExpiratoryFlow =
                XPathHelper.GetOptNavValue<FlowMeasurement>(
                    spirometerNav,
                    "pef");

            XPathNodeIterator warningsIterator =
                spirometerNav.Select("warning");

            foreach (XPathNavigator warningNav in warningsIterator)
            {
                _warnings.Add(warningNav.Value);
            }

            XPathNodeIterator problemsIterator =
                spirometerNav.Select("problem");

            foreach (XPathNavigator problemNav in problemsIterator)
            {
                _problems.Add(problemNav.Value);
            }

            XPathNavigator fevOverFvcNav =
                spirometerNav.SelectSingleNode("FEVoverFVC");

            if (fevOverFvcNav != null)
            {
                _fevOverFvc = fevOverFvcNav.ValueAsDouble;
            }

            XPathNavigator fef25to75Nav =
                spirometerNav.SelectSingleNode("FEF25to75");

            if (fef25to75Nav != null)
            {
                _fef25to75 = fef25to75Nav.ValueAsDouble;
            }

            XPathNavigator fef25to50Nav =
                spirometerNav.SelectSingleNode("FEF25to50");

            if (fef25to50Nav != null)
            {
                _fef25to50 = fef25to50Nav.ValueAsDouble;
            }

            XPathNavigator fif25to75Nav =
                spirometerNav.SelectSingleNode("FIF25to75");

            if (fif25to75Nav != null)
            {
                _fif25to75 = fif25to75Nav.ValueAsDouble;
            }

            XPathNavigator fif25to50Nav =
                spirometerNav.SelectSingleNode("FIF25to50");

            if (fif25to50Nav != null)
            {
                _fif25to50 = fif25to50Nav.ValueAsDouble;
            }

            XPathNavigator fetNav =
                spirometerNav.SelectSingleNode("FET");

            if (fetNav != null)
            {
                _fet = fetNav.ValueAsDouble;
            }

            _svc =
                XPathHelper.GetOptNavValue<VolumeMeasurement>(
                    spirometerNav,
                    "SVC");

            _tv =
                XPathHelper.GetOptNavValue<VolumeMeasurement>(
                    spirometerNav,
                    "TV");

            _mvv =
                XPathHelper.GetOptNavValue<FlowMeasurement>(
                    spirometerNav,
                    "MVV");
        }
        /// <summary>
        /// Populates this <see cref="PeakFlow"/> instance from the data in the XML.
        /// </summary>
        /// 
        /// <param name="typeSpecificXml">
        /// The XML to get the peack flow data from.
        /// </param>
        /// 
        /// <exception cref="InvalidOperationException">
        /// The first node in the <paramref name="typeSpecificXml"/> parameter 
        /// is not a peak-flow node.
        /// </exception>
        /// 
        protected override void ParseXml(IXPathNavigable typeSpecificXml)
        {
            XPathNavigator itemNav =
                typeSpecificXml.CreateNavigator().SelectSingleNode(
                    "peak-flow");

            Validator.ThrowInvalidIfNull(itemNav, "PeakFlowUnexpectedNode");

            _when = new ApproximateDateTime();
            _when.ParseXml(itemNav.SelectSingleNode("when"));

            _peakExpiratoryFlow =
                XPathHelper.GetOptNavValue<FlowMeasurement>(
                    itemNav,
                    "pef");

            _fev1 =
                XPathHelper.GetOptNavValue<VolumeMeasurement>(
                    itemNav,
                    "fev1");

            _fev6 =
                XPathHelper.GetOptNavValue<VolumeMeasurement>(
                    itemNav,
                    "fev6");

            _measurementFlags.Clear();
            XPathNodeIterator measurementFlagsIterator = itemNav.Select("measurement-flags");
            foreach (XPathNavigator flagNav in measurementFlagsIterator)
            {
                CodableValue flag = new CodableValue();
                flag.ParseXml(flagNav);

                _measurementFlags.Add(flag);
            }
        }