/// <summary> /// Do a 3-file merge, placing the result over the "ours" file and returning an error status /// </summary> /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with. /// The must not have any UI, no interaction with the user.</remarks> public void Do3WayMerge(MergeOrder mergeOrder) { if (mergeOrder == null) { throw new ArgumentNullException("mergeOrder"); } bool addedCollationAttr; PreMergeFile(mergeOrder, out addedCollationAttr); var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; XmlMergeService.RemoveAmbiguousChildNodes = true; var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor); using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings())) { var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto); readerSettings.XmlResolver = null; readerSettings.ProhibitDtd = false; using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings)) { writer.WriteNode(nodeReader, false); } } }
/// <summary> /// return null if valid, otherwise nice verbose description of what went wrong /// </summary> public string ValidateFile(string pathToFile, IProgress progress) { try { using (var reader = XmlReader.Create(pathToFile, CanonicalXmlSettings.CreateXmlReaderSettings())) { reader.MoveToContent(); if (reader.LocalName == "ldml") { // It would be nice, if it could really validate it. while (reader.Read()) { } } else { throw new InvalidOperationException("Not an LDML file."); } } } catch (Exception error) { return(error.Message); } return(null); }
public ChorusNotesMergeEventListener(string path) { _path = path; try { if (!File.Exists(path)) { var doc = new XmlDocument(); doc.LoadXml(string.Format("<notes version='{0}'/>", FormatVersionNumber.ToString())); using (var fileWriter = XmlWriter.Create(path, CanonicalXmlSettings.CreateXmlWriterSettings())) { doc.Save(fileWriter); } } } catch (Exception error) { Debug.Fail("Something went wrong trying to create a blank ChorusNotes file :" + error.Message); //todo log that the xml was the wrong format } _tempFile = new TempFile(); _readerStream = new FileStream(path, FileMode.Open); _reader = XmlReader.Create(_readerStream, CanonicalXmlSettings.CreateXmlReaderSettings()); _writer = XmlWriter.Create(_tempFile.Path, CanonicalXmlSettings.CreateXmlWriterSettings()); StreamToInsertionPoint(_reader, _writer); }
//private static void WriteProblemDataFile(string pathname, XmlNode data) //{ // var doc = data.OwnerDocument; // doc.Save(pathname); //} private static void WriteProblemDataFile(string pathname, byte[] data) { using (var reader = XmlReader.Create(new MemoryStream(data, false), CanonicalXmlSettings.CreateXmlReaderSettings())) using (var writer = XmlWriter.Create(pathname, CanonicalXmlSettings.CreateXmlWriterSettings())) { writer.WriteNode(reader, true); } }
private string GetLiftBranchName() { const string LIFT = @"LIFT"; using (var reader = XmlReader.Create(_dataPathname, CanonicalXmlSettings.CreateXmlReaderSettings())) { reader.MoveToContent(); reader.MoveToAttribute(@"version"); var liftVersionString = reader.Value; return((liftVersionString == @"0.13") ? @"default" : LIFT + reader.Value); } }
internal static string GetVersionNumber(string mainDataPathname) { #if USEFAKEVERSION return(@"7000067"); #else using (var reader = XmlReader.Create(mainDataPathname, CanonicalXmlSettings.CreateXmlReaderSettings())) { reader.MoveToContent(); reader.MoveToAttribute("version"); return(reader.Value); } #endif }
private static SortedDictionary <string, string> SortRootElementAttributes(string pathname) { var sortedRootAttributes = new SortedDictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); using (var tempReader = XmlReader.Create(pathname, CanonicalXmlSettings.CreateXmlReaderSettings())) { tempReader.MoveToContent(); for (var i = 0; i < tempReader.AttributeCount; ++i) { tempReader.MoveToAttribute(i); sortedRootAttributes.Add(GetUniqueKey(sortedRootAttributes.Keys, tempReader.Name), tempReader.Value); } } return(sortedRootAttributes); }
/// <summary> /// Do a 3-file merge, placing the result over the "ours" file and returning an error status /// </summary> /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with. /// The must not have any UI, no interaction with the user.</remarks> public void Do3WayMerge(MergeOrder mergeOrder) { if (mergeOrder == null) { throw new ArgumentNullException("mergeOrder"); } bool addedCollationAttr; PreMergeFile(mergeOrder, out addedCollationAttr); var merger = new XmlMerger(mergeOrder.MergeSituation); SetupElementStrategies(merger); merger.EventListener = mergeOrder.EventListener; XmlMergeService.RemoveAmbiguousChildNodes = true; var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor); using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings())) { var nameSpaceManager = new XmlNamespaceManager(new NameTable()); nameSpaceManager.AddNamespace("palaso", "urn://palaso.org/ldmlExtensions/v1"); nameSpaceManager.AddNamespace("palaso2", "urn://palaso.org/ldmlExtensions/v2"); nameSpaceManager.AddNamespace("fw", "urn://fieldworks.sil.org/ldmlExtensions/v1"); nameSpaceManager.AddNamespace("sil", "urn://www.sil.org/ldml/0.1"); var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto); readerSettings.NameTable = nameSpaceManager.NameTable; readerSettings.XmlResolver = null; readerSettings.ProhibitDtd = false; if (addedCollationAttr) { // Remove the optional 'key' attr we added. var adjustedCollation = result.MergedNode.SelectSingleNode("collations") .SelectNodes("collation") .Cast <XmlNode>().FirstOrDefault(collation => collation.Attributes["type"].Value == "standard"); if (adjustedCollation != null) { adjustedCollation.Attributes.Remove(adjustedCollation.Attributes["type"]); } } using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings)) { writer.WriteNode(nodeReader, false); } } }
private string GetBranchNameFromLiftFile() { const string LIFT = @"LIFT"; using (var reader = XmlReader.Create(_liftPathName, CanonicalXmlSettings.CreateXmlReaderSettings())) { reader.MoveToContent(); reader.MoveToAttribute(@"version"); var liftVersionString = reader.Value; if (liftVersionString == @"0.13") { return(@"default"); } return(LIFT + reader.Value); } }
public void ReplaceWritingSystemId(string oldId, string newId) { var fileToBeWrittenTo = new TempFile(); var reader = XmlReader.Create(_liftFilePath, CanonicalXmlSettings.CreateXmlReaderSettings()); var writer = XmlWriter.Create(fileToBeWrittenTo.Path, CanonicalXmlSettings.CreateXmlWriterSettings()); //System.Diagnostics.Process.Start(fileToBeWrittenTo.Path); try { bool readerMovedByXmlDocument = false; while (readerMovedByXmlDocument || reader.Read()) { readerMovedByXmlDocument = false; var xmldoc = new XmlDocument(); //We load up the header and entry nodes individually as XmlDocuments and replace the writing systems //This is not as fast as pure reader writers, but as this is not a frequent operation, that is ok and //it is MUCH easier to code than a statemachine using readers and writers only. if (reader.NodeType == XmlNodeType.Element && reader.Name == "header") { var headerFragment = xmldoc.ReadNode(reader); readerMovedByXmlDocument = true; GetNodeWithWritingSystemIdsReplaced(oldId, newId, headerFragment); headerFragment.WriteTo(writer); } if (reader.NodeType == XmlNodeType.Element && reader.Name == "entry") { var entryFragment = xmldoc.ReadNode(reader); readerMovedByXmlDocument = true; GetNodeWithWritingSystemIdsReplaced(oldId, newId, entryFragment); entryFragment.WriteTo(writer); } else { writer.WriteNodeShallow(reader); } //writer.Flush(); } } finally { reader.Close(); writer.Close(); } File.Delete(_liftFilePath); fileToBeWrittenTo.MoveTo(_liftFilePath); }
private static float GetLiftVersionNumber(string repoLocation) { // Return 0.13 if there is no lift file or it has no 'version' attr on the main 'lift' element. var firstLiftFile = FileAndDirectoryServices.GetPathToFirstLiftFile(repoLocation); if (firstLiftFile == null) { return(float.MaxValue); } using (var reader = XmlReader.Create(firstLiftFile, CanonicalXmlSettings.CreateXmlReaderSettings())) { reader.MoveToContent(); reader.MoveToAttribute("version"); return(float.Parse(reader.Value)); } }
public ChorusNotesMergeEventListener(string path) { _path = path; try { CreateEmptyChorusNotesFile(path); } catch (Exception error) { Debug.Fail("Something went wrong trying to create a blank ChorusNotes file :" + error.Message); //todo log that the xml was the wrong format } _tempFile = new TempFile(); _readerStream = new FileStream(path, FileMode.Open); _reader = XmlReader.Create(_readerStream, CanonicalXmlSettings.CreateXmlReaderSettings()); _writer = XmlWriter.Create(_tempFile.Path, CanonicalXmlSettings.CreateXmlWriterSettings()); StreamToInsertionPoint(_reader, _writer); }
/// <summary> /// This simply checks that the file is well-formed /// </summary> public static string ValidateFile(string pathToFile, IProgress progress) { XmlReader reader = null; try { reader = XmlReader.Create(pathToFile, CanonicalXmlSettings.CreateXmlReaderSettings()); while (reader.Read()) { } } catch (Exception error) { return(error.Message); } finally { if (reader != null) { reader.Close(); } } return(null); }
public void CanonicalXmlReaderSettings_ForDocumentFragment_HaveCorrectSettings() { CheckReaderSettings(CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Fragment), ConformanceLevel.Fragment); }
public void DeleteWritingSystemId(string id) { var fileToBeWrittenTo = new TempFile(); var reader = XmlReader.Create(_liftFilePath, CanonicalXmlSettings.CreateXmlReaderSettings()); var writer = XmlWriter.Create(fileToBeWrittenTo.Path, CanonicalXmlSettings.CreateXmlWriterSettings()); //System.Diagnostics.Process.Start(fileToBeWrittenTo.Path); try { bool readerMovedByXmlDocument = false; while (readerMovedByXmlDocument || reader.Read()) { readerMovedByXmlDocument = false; var xmldoc = new XmlDocument(); if (reader.NodeType == XmlNodeType.Element && reader.Name == "entry") { var entryFragment = xmldoc.ReadNode(reader); readerMovedByXmlDocument = true; var nodesWithLangId = entryFragment.SelectNodes(String.Format("//*[@lang='{0}']", id)); if (nodesWithLangId != null) { foreach (XmlNode node in nodesWithLangId) { var parent = node.SelectSingleNode("parent::*"); if (node.Name == "gloss") { parent.RemoveChild(node); } else { var siblingNodes = node.SelectNodes("following-sibling::form | preceding-sibling::form"); if (siblingNodes.Count == 0) { var grandParent = parent.SelectSingleNode("parent::*"); grandParent.RemoveChild(parent); } else { parent.RemoveChild(node); } } } } entryFragment.WriteTo(writer); } else { writer.WriteNodeShallow(reader); } //writer.Flush(); } } finally { reader.Close(); writer.Close(); } File.Delete(_liftFilePath); fileToBeWrittenTo.MoveTo(_liftFilePath); }