public void editTagsAndCommentInXLF(String fileIn, String fileOut, String tagsInfo, String Comment) { var content = File.ReadAllText(fileIn); var defxml = Regex.Match(content, @"<\?xml\b[^<>]*\?>").Value; var nsdef = Regex.Match(content, @"(?<=<xliff\b[^<>]*xmlns[ \t]*=[ \t]*"")[^""]+(?="")").Value; var spaceTU = Regex.Match(content, @"(?<=[\r\n]+)[ \t]*(?=<trans-unit\b)").Value; var spaceTUChild = Regex.Match(content, @"(?<=[\r\n]+)[ \t]*(?=<source\b)").Value; content = Regex.Replace(content, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&#38;$1"); XmlReaderSettings xrs = new XmlReaderSettings(); xrs.CheckCharacters = false; xrs.IgnoreWhitespace = false; xrs.NameTable = new NameTable(); XmlNamespaceManager xnm = new XmlNamespaceManager(xrs.NameTable); xnm.AddNamespace("xlfns", nsdef); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.PreserveWhitespace = true; var sr = new StringReader(content); using (var xr = XmlReader.Create(sr, xrs)) { xmlDoc.Load(xr); } var TuNds = xmlDoc.SelectNodes("//xlfns:trans-unit", xnm); foreach (XmlNode TuNd in TuNds) { var tagsNoteNd = TuNd.SelectSingleNode("./xlfns:note[@from='tags']", xnm); if (tagsNoteNd != null) { tagsNoteNd.InnerXml = tagsInfo; } else { XmlNode addNd = xmlDoc.CreateNode(XmlNodeType.Element, "note", nsdef); XmlElement addXe = (XmlElement)addNd; addXe.SetAttribute("from", "tags"); addXe.InnerXml = tagsInfo; TuNd.AppendChild(addXe); } var commentNoteNd = TuNd.SelectSingleNode("./xlfns:note[@from='L10N comment']", xnm); if (commentNoteNd != null) { commentNoteNd.InnerXml = Comment; } else { XmlNode addNd = xmlDoc.CreateNode(XmlNodeType.Element, "note", nsdef); XmlElement addXe = (XmlElement)addNd; addXe.SetAttribute("from", "L10N comment"); addXe.InnerXml = Comment; TuNd.AppendChild(addXe); } } XmlWriterSettings xws = new XmlWriterSettings(); xws.CheckCharacters = false; xws.Encoding = Encoding.UTF8; xws.Indent = true; xws.NamespaceHandling = NamespaceHandling.OmitDuplicates; xws.NewLineChars = "\r\n"; xws.NewLineHandling = NewLineHandling.None; xws.NewLineOnAttributes = false; xws.OmitXmlDeclaration = false; using (var xw = XmlWriter.Create(fileOut, xws)) { xmlDoc.Save(xw); } var textWrite = File.ReadAllText(fileOut); var repand = Regex.Replace(textWrite, @"&#38;(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&$1"); var repXmldef = Regex.Replace(repand, @"<\?xml\b[^<>]*\?>", defxml); var addSpace1 = Regex.Replace(repXmldef, @">\s*<(target|source|note)\b", ">\r\n" + spaceTUChild + "<$1"); var addSpace2 = Regex.Replace(addSpace1, @">\s*<trans-unit\b", ">\r\n" + spaceTU + "<trans-unit"); var addSpace3 = Regex.Replace(addSpace2, @">\s*</trans-unit>", ">\r\n" + spaceTU + "</trans-unit>"); File.WriteAllText(fileOut, addSpace3, Encoding.UTF8); }
public void regularFile(String str_fileIn, String str_fileOrigSrc, String str_fileOut, bool b_removeNd) { var contentIn = File.ReadAllText(str_fileIn); var contentOrig = File.ReadAllText(str_fileOrigSrc); var defxml = Regex.Match(contentOrig, @"<\?xml\b[^<>]*\?>").Value; var spaceTU = Regex.Match(contentOrig, @"(?<=[\r\n]+)[ \t]*(?=<trans-unit\b)").Value; var spaceTUChild = Regex.Match(contentOrig, @"(?<=[\r\n]+)[ \t]*(?=<source\b)").Value; var nsdef = Regex.Match(contentOrig, @"(?<=xliff\b[^<>]*xmlns[ \t]*=[ \t]*"")[^""]+(?="")").Value; contentIn = Regex.Replace(contentIn, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&#38;$1"); contentOrig = Regex.Replace(contentOrig, @"&(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&#38;$1"); XmlReaderSettings xrs = new XmlReaderSettings(); xrs.CheckCharacters = false; xrs.IgnoreWhitespace = false; xrs.NameTable = new NameTable(); XmlNamespaceManager xnm = new XmlNamespaceManager(xrs.NameTable); xnm.AddNamespace("xlfns", nsdef); XmlDocument xmlDocIn = new XmlDocument(); xmlDocIn.PreserveWhitespace = true; var sr = new StringReader(contentIn); using (var xr = XmlReader.Create(sr, xrs)) { xmlDocIn.Load(xr); } XmlDocument xmlDocOrig = new XmlDocument(); xmlDocOrig.PreserveWhitespace = true; var srOrig = new StringReader(contentOrig); using (var xrOrig = XmlReader.Create(srOrig, xrs)) { xmlDocOrig.Load(xrOrig); } var TuNds = xmlDocIn.SelectNodes("//xlfns:trans-unit", xnm); foreach (XmlNode TuNd in TuNds) { var targetNd = TuNd.SelectSingleNode("./xlfns:target", xnm); XmlElement targetXe = (XmlElement)targetNd; var stateAttr = targetXe.GetAttribute("state"); if (stateAttr == "final" && b_removeNd == true) { var parent = TuNd.ParentNode; parent.RemoveChild(TuNd); } else { var noteNds = TuNd.SelectNodes("./xlfns:note", xnm); XmlElement TuXe = (XmlElement)TuNd; var idAttr = TuXe.GetAttribute("id"); var TuNdOrig = xmlDocOrig.SelectSingleNode("//xlfns:trans-unit[@id='" + idAttr + "']", xnm); var noteNdsOrig = TuNdOrig.SelectNodes("./xlfns:note", xnm); foreach (XmlNode noteNd in noteNds) { TuNd.RemoveChild(noteNd); } foreach (XmlNode noteNdOrig in noteNdsOrig) { var addNd = xmlDocIn.ImportNode(noteNdOrig, true); TuNd.AppendChild(addNd); } } } XmlWriterSettings xws = new XmlWriterSettings(); xws.CheckCharacters = false; xws.Encoding = Encoding.UTF8; xws.Indent = true; xws.NamespaceHandling = NamespaceHandling.OmitDuplicates; xws.NewLineChars = "\r\n"; xws.NewLineHandling = NewLineHandling.None; xws.NewLineOnAttributes = false; xws.OmitXmlDeclaration = false; using (var xw = XmlWriter.Create(str_fileOut, xws)) { xmlDocIn.Save(xw); } var textWrite = File.ReadAllText(str_fileOut); var repand = Regex.Replace(textWrite, @"&#38;(?!amp;|lt;|gt;)(#\d+?;|[a-zA-Z]+?;)", "&$1"); var repXmldef = Regex.Replace(repand, @"<\?xml\b[^<>]*\?>", defxml); var addSpace1 = Regex.Replace(repXmldef, @">\s*<(target|source|note)\b", ">\r\n" + spaceTUChild + "<$1"); var addSpace2 = Regex.Replace(addSpace1, @">\s*<trans-unit\b", ">\r\n" + spaceTU + "<trans-unit"); var addSpace3 = Regex.Replace(addSpace2, @">\s*</trans-unit>", ">\r\n" + spaceTU + "</trans-unit>"); File.WriteAllText(str_fileOut, addSpace3, Encoding.UTF8); }