/// <summary>
 /// Получение семантического элемента из его описателя в виде XML
 /// </summary>
 /// <param name="source">XML-элемент, содержащий описатель семантического элемента</param>
 /// <returns>Объект или свойство</returns>
 private static SemanticElement GetSemanticElement(XElement source)
 {
     string internalName = source.Name.LocalName;
     if (source.HasElements)
     {
         SemanticObject output = new SemanticObject(internalName) { RdfNamespace = source.Name.NamespaceName.TrimEnd('/') };
         foreach (XElement element in source.Elements())
             output.Elements.Add(GetSemanticElement(element));
         return output;
     }
     else
     {
         SemanticProperty output = new SemanticProperty(internalName, source.Value);
         return output;
     }
 }