FeatureValues LoadSynFeats(XmlNode node, FeatureSystem featSys) { FeatureValues fvs = new FeatureValues(); if (node != null) { XmlNodeList featValList = node.SelectNodes("FeatureValueList[@isActive='yes']"); foreach (XmlNode featValNode in featValList) { XmlElement featValElem = featValNode as XmlElement; string featId = featValElem.GetAttribute("feature"); Feature feature = featSys.GetFeature(featId); if (feature == null) throw CreateUndefinedObjectException(string.Format(HCStrings.kstidUnknownFeat, featId), featId); string valueIdsStr = featValElem.GetAttribute("values"); if (!string.IsNullOrEmpty(valueIdsStr)) { string[] valueIds = valueIdsStr.Split(' '); foreach (string valueId in valueIds) { FeatureValue value = feature.GetPossibleValue(valueId); if (value == null) throw CreateUndefinedObjectException(string.Format(HCStrings.kstidUnknownFeatValue, valueId, featId), valueId); fvs.Add(feature, new ClosedValueInstance(value)); } } else { fvs.Add(feature, LoadSynFeats(featValNode, featSys)); } } } return fvs; }
Feature LoadFeature(XmlElement featDefNode, XmlElement featSysNode, FeatureSystem featSys) { XmlElement featElem = featDefNode.SelectSingleNode("Feature") as XmlElement; string featId = featElem.GetAttribute("id"); Feature feature = featSys.GetFeature(featId); if (feature != null) return feature; string featureName = featElem.InnerText; string defValId = featElem.GetAttribute("defaultValue"); feature = new Feature(featId, featureName, m_curMorpher); XmlNode valueListNode = featDefNode.SelectSingleNode("ValueList"); if (valueListNode != null) { XmlNodeList valueList = valueListNode.SelectNodes("Value"); foreach (XmlNode valueNode in valueList) { XmlElement valueElem = valueNode as XmlElement; string valueId = valueElem.GetAttribute("id"); FeatureValue value = new FeatureValue(valueId, valueElem.InnerText, m_curMorpher); try { featSys.AddValue(value); feature.AddPossibleValue(value); } catch (InvalidOperationException ioe) { throw new LoadException(LoadException.LoadErrorType.TOO_MANY_FEATURE_VALUES, this, HCStrings.kstidTooManyFeatValues, ioe); } } if (!string.IsNullOrEmpty(defValId)) feature.DefaultValue = new ClosedValueInstance(feature.GetPossibleValue(defValId)); } else { XmlElement featListElem = featDefNode.SelectSingleNode("FeatureList") as XmlElement; string featDefIdsStr = featListElem.GetAttribute("features"); string[] featDefIds = featDefIdsStr.Split(' '); foreach (string featDefId in featDefIds) { XmlNode subFeatDefNode = featSysNode.SelectSingleNode(string.Format("FeatureDefinition[@id = '{0}']", featDefId)); Feature subFeature = LoadFeature(subFeatDefNode as XmlElement, featSysNode, featSys); feature.AddSubFeature(subFeature); } } featSys.AddFeature(feature); return feature; }
private FeatureStruct LoadFeatureStruct(XElement elem, FeatureSystem featSys) { var fs = new FeatureStruct(); foreach (XElement featValElem in elem.Elements("FeatureValue").Where(IsActive)) { Feature feature = featSys.GetFeature((string) featValElem.Attribute("feature")); var valueIDsStr = (string) featValElem.Attribute("symbolValues"); if (!string.IsNullOrEmpty(valueIDsStr)) { var sf = (SymbolicFeature) feature; fs.AddValue(sf, valueIDsStr.Split(' ').Select(id => sf.PossibleSymbols[id])); } else { var cf = (ComplexFeature) feature; fs.AddValue(cf, LoadFeatureStruct(featValElem, featSys)); } } return fs; }