/// <summary> /// Read the LDML file at the root element and populate the writing system. /// </summary> /// <param name="element">Root element</param> /// <param name="ws">Writing System to populate</param> /// <remarks> /// For elements that have * annotation in the LDML spec, we use the extensions NonAltElement /// and NonAltElements to ignore the elements that have the alt attribute. /// </remarks> private void ReadLdml(XElement element, WritingSystemDefinition ws) { Debug.Assert(element != null); Debug.Assert(ws != null); if (element.Name != "ldml") throw new ApplicationException("Unable to load writing system definition: Missing <ldml> tag."); ResetWritingSystemDefinition(ws); XElement identityElem = element.Element("identity"); if (identityElem != null) ReadIdentityElement(identityElem, ws); // Check for the proper LDML version after reading identity element so that we have the proper language tag if an error occurs. foreach (XElement specialElem in element.NonAltElements("special")) CheckVersion(specialElem, ws); XElement charactersElem = element.Element("characters"); if (charactersElem != null) ReadCharactersElement(charactersElem, ws); XElement delimitersElem = element.Element("delimiters"); if (delimitersElem != null) ReadDelimitersElement(delimitersElem, ws); XElement layoutElem = element.Element("layout"); if (layoutElem != null) ReadLayoutElement(layoutElem, ws); XElement numbersElem = element.Element("numbers"); if (numbersElem != null) ReadNumbersElement(numbersElem, ws); XElement collationsElem = element.Element("collations"); if (collationsElem != null) ReadCollationsElement(collationsElem, ws); foreach (XElement specialElem in element.NonAltElements("special")) ReadTopLevelSpecialElement(specialElem, ws); // Validate collations after all of them have been read in (for self-referencing imports) foreach (CollationDefinition cd in ws.Collations) { string message; cd.Validate(out message); } ws.Id = string.Empty; ws.AcceptChanges(); }