/// <summary>
 /// Compare the PhonemePair, used by List.Sort() method.
 /// </summary>
 /// <param name="firstPair">Source PhonemePair.</param>
 /// <param name="secondPair">Destination PhonemPair.</param>
 /// <returns>Compare result.</returns>        
 private static int Compare(PhonemePair firstPair, PhonemePair secondPair)
 {
     return string.CompareOrdinal(firstPair.ThirdPartyPhoneme,
         secondPair.ThirdPartyPhoneme);
 }
        /// <summary>
        /// Read phoneme mapping file.
        /// </summary>
        /// <param name="mapFileName">Mapping file name.</param>
        public void LoadXml(string mapFileName)
        {
            _pairs = new List<PhonemePair>();

            XmlDocument dom = new XmlDocument();
            dom.Load(mapFileName);

            if (dom.DocumentElement.HasAttribute("sourceLanguage"))
            {
                _sourceLanguage = Localor.StringToLanguage(dom.DocumentElement.GetAttribute("sourceLanguage"));
            }
            else
            {
                _sourceLanguage = Language.Neutral;
            }

            if (dom.DocumentElement.HasAttribute("targetLanguage"))
            {
                _targetLanguage = Localor.StringToLanguage(dom.DocumentElement.GetAttribute("targetLanguage"));
            }
            else
            {
                _targetLanguage = Language.Neutral;
            }

            foreach (XmlNode node in dom.DocumentElement.SelectNodes("map"))
            {
                XmlElement phonemeEle = (XmlElement)node.SelectSingleNode("phoneme");
                string thirdPartyPhoneme = phonemeEle.InnerText;
                if (string.IsNullOrEmpty(thirdPartyPhoneme))
                {
                    string message = string.Format(CultureInfo.InvariantCulture,
                        "Phoneme can't be empty!");
                    throw new InvalidDataException(message);
                }

                XmlElement idEle = (XmlElement)node.SelectSingleNode("id");
                string enginePhoneme = idEle.InnerText;
                if (string.IsNullOrEmpty(enginePhoneme))
                {
                    string message = string.Format(CultureInfo.InvariantCulture,
                        "Id can't be empty!");
                    throw new InvalidDataException(message);
                }

                PhonemePair pair = new PhonemePair();
                pair.ThirdPartyPhoneme = thirdPartyPhoneme;
                pair.EnginePhoneme = enginePhoneme;

                _pairs.Add(pair);
            }
        }