private ExtractionValue _getNodeValue(NodeBase nodeBase, string sourceText) { if (nodeBase.Type == NodeType.Leaf) { return(new ExtractionValue(nodeBase.As <Leaf>().Token.Text, ValueType.String, nodeBase.SemanticId)); } var subNode = nodeBase.As <Node>(); if (subNode.IsPossibleList) { var list = new List <ExtractionValue>(); foreach (var childBase in subNode.Children) { var value = _getNodeValue(childBase, sourceText); if (value.Type == ValueType.List) { list.AddRange(value.GetValue <List <ExtractionValue> >()); } else { list.Add(value); } } return(new ExtractionValue(list, ValueType.List, nodeBase.SemanticId)); } // Если есть шаблон, то извлекаем словарь по шаблону // иначе возвращаем текст данной ветки if (subNode.Rule.HasTemplate) { var dic = _extract(subNode, sourceText); // Если есть в словаре есть только одно значение и оно с ключем Value, то возвращаем его if (dic.Count == 1 && dic.ContainsKey("Value")) { return(dic["Value"]); } return(new ExtractionValue(dic, ValueType.Dictionary, nodeBase.SemanticId)); } var text = _getNodeText(subNode, sourceText, out int _); return(new ExtractionValue(text, ValueType.String, nodeBase.SemanticId)); }