private MusicalSource ParseRecord(XElement recordElement) { var record = new MusicalSource(); foreach (var field in recordElement.Elements().Where(e => e.Name.LocalName == "controlfield")) { var tag = field.Attributes().FirstOrDefault(a => a.Name.LocalName == "tag")?.Value; if (tag == null) { continue; } if (tag == "001") { record.Id = field.Value; } } foreach (var field in recordElement.Elements().Where(e => e.Name.LocalName == "datafield")) { var tag = field.Attributes().FirstOrDefault(a => a.Name.LocalName == "tag")?.Value; if (tag == null) { continue; } if (!FieldFactories.ContainsKey(tag)) { continue; } var entity = FieldFactories[tag](); var properties = entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var property in properties) { var subfieldAttribute = property.GetCustomAttribute <MarcSubfieldAttribute>(); if (subfieldAttribute == null) { continue; } var value = field.Elements() .FirstOrDefault(e => e.Attributes().FirstOrDefault(a => a.Name.LocalName == "code")?.Value == subfieldAttribute.Code)? .Value; property.SetValue(entity, value); //TODO: Type conversion, converter types, etc. } entity.MusicalSource = record; ExtractDataFromSubfields(record, entity); if (entity.GetType() == typeof(Incipit)) { dbContext.Attach(entity); } } dbContext.MusicalSources.Add(record); return(record); }
private void ExtractDataFromSubfields(MusicalSource record, MusicalSourceField entity) { var composer = entity as Person; if (composer != null) { record.ComposerName = composer.PersonalName; record.ComposerDates = composer.Dates; } var uniformTitle = entity as UniformTitle; if (uniformTitle != null) { record.Title = uniformTitle.Title; record.FormSubheading = uniformTitle.FormSubheading; record.MediumOfPerformance = uniformTitle.MediumOfPerformance; record.PartOrSectionNumber = uniformTitle.PartOrSectionNumber; } var incipit = entity as Incipit; if (incipit != null) { var score = plaineAndEasieService.Parse(incipit); if (score != null) { try { incipit.RhythmDigest = new RhythmDigestParser().ParseBack(score); incipit.RhythmRelativeDigest = new RhythmRelativeDigestParser().ParseBack(score); var intervals = score.ToIntervals().Take(12).ToArray(); var intervalNumber = 1; foreach (var interval in intervals) { typeof(Incipit).GetProperty($"Interval{intervalNumber++}").SetValue(incipit, interval); } } catch { } } } }