public StsAssessment Parse() { var result = new StsAssessment(); foreach (var div in Navigator.DocumentNode.SelectNodes("//div")) { Logger.Trace("Processing div..."); var isItemMetadata = false; var nodes = div.ChildNodes; for (var i = 0; i < nodes.Count; i++) { if (nodes[i].Name.Equals("h1", StringComparison.OrdinalIgnoreCase)) { var remainingParagraphNodes = nodes.Skip(i) .Where(x => x.Name.Equals("p", StringComparison.OrdinalIgnoreCase)).ToList(); Logger.Trace($"Processing passage with {remainingParagraphNodes.Count} nodes"); result.Passages.Add(PassageParser.Parse(remainingParagraphNodes)); break; } if (nodes[i].Name.Equals("p", StringComparison.OrdinalIgnoreCase)) { if (nodes[i].InnerText.Contains("Item") && nodes[i].InnerText.Contains("Information")) { isItemMetadata = true; Logger.Trace("Found item metadata"); } } else if (nodes[i].Name.Equals("table", StringComparison.OrdinalIgnoreCase) && isItemMetadata) { Logger.Trace("Processing item metadata"); result.Items.Add(new Item { Metadata = (ItemMetadata)ItemMetadataParser.Parse(nodes[i]) }); isItemMetadata = false; } else if (nodes[i].Name.Equals("table", StringComparison.OrdinalIgnoreCase) && !isItemMetadata) { Logger.Trace("Processing item body"); if (result.Items.Any()) { result.Items.Last().Body = ItemBodyParser.Parse(nodes[i]); } else { Logger.LogError(new ErrorReportItem { Location = "Document Parser", Severity = LogLevel.Warn }, $"Unattached table likely belongs to a previous passage element {result.Passages.Last().Metadata["PassageCode"]} - Appending to the end. May require manual intervention"); result.Passages.Last().Body.Elements.Add(new BodyElement { Text = nodes[i].OuterHtml }); } } } } return(result); }
public static void Write(StsAssessment stsAssessment) { var mappedItems = stsAssessment.Items.Select(ItemMapper.Map); mappedItems.ToList() .ForEach( x => { var fullItemId = $"{ExtractionSettings.BankKey}-{x.SelectSingleNode(".//item")?.Attributes?.GetNamedItem("id").Value}"; var path = $"./{ExtractionSettings.Output}/Items/Item-{fullItemId}"; Logger.LogInfo(new ProcessingReportItem { Destination = path, Type = "Item", UniqueId = fullItemId }); Directory.CreateDirectory(path); x.Save($"{path}/item-{fullItemId}.xml"); }); var mappedItemMetadata = stsAssessment.Items.Select(ItemMetadataMapper.Map); mappedItemMetadata.ToList().ForEach(x => { var fullItemId = $"{ExtractionSettings.BankKey}-{x.SelectSingleNode(".//Identifier")?.InnerText}"; var path = $"./{ExtractionSettings.Output}/Items/Item-{fullItemId}"; Logger.LogInfo(new ProcessingReportItem { Destination = $"{path}/metadata.xml", Type = "Item Metadata", UniqueId = fullItemId }); x.Save($"{path}/metadata.xml"); }); var mappedStimuli = stsAssessment.Passages.Select(StimuliMapper.Map); mappedStimuli.ToList() .ForEach( x => { var fullStimuliId = $"{ExtractionSettings.BankKey}-{x.SelectSingleNode(".//passage")?.Attributes?.GetNamedItem("id").Value}"; var path = $"./{ExtractionSettings.Output}/Stimuli/stim-{fullStimuliId}"; Logger.LogInfo(new ProcessingReportItem { Destination = path, Type = "Stimulus", UniqueId = fullStimuliId }); Directory.CreateDirectory(path); x.Save($"{path}/stim-{fullStimuliId}.xml"); }); var mappedStimuliMetadata = stsAssessment.Passages.Select(StimuliMetadataMapper.Map); mappedStimuliMetadata.ToList().ForEach(x => { var fullStimulusId = $"{ExtractionSettings.BankKey}-{x.SelectSingleNode(".//Identifier")?.InnerText}"; var path = $"./{ExtractionSettings.Output}/Stimuli/stim-{fullStimulusId}"; Logger.LogInfo(new ProcessingReportItem { Destination = $"{path}/metadata.xml", Type = "Stimulus Metadata", UniqueId = fullStimulusId }); x.Save($"{path}/metadata.xml"); }); }