private static void Main(string[] args) { if (args.Length == 0) { PresentApplication(); PrintUsage(); return; } if (!IOHelper.IsThisAFile(args[0])) { Console.WriteLine("Cannot find file: " + Path.GetFullPath(args[0])); PrintUsage(); return; } if (!IOHelper.CanWriteToDirectory(args[0])) { Console.WriteLine("Cannot write to directory: " + Path.GetFullPath(args[0])); PrintUsage(); return; } if (!IOHelper.IsThisAFile("xmlFormatConfig.json")) { Console.WriteLine("Config file xmlFormatConfig.json does not exist"); PrintUsage(); return; } try { _formatConfig = XmlFormatJsonConfig.FromJsonFile("xmlFormatConfig.json"); string content = IOHelper.Read(args[0]); string formattedContent = XmlFormatter.Format(content, _formatConfig); File.Copy(args[0], args[0] + ".bak", true); IOHelper.Write(args[0], formattedContent); } catch (Exception ex) { Console.WriteLine("Failed to parse XML: " + ex.Message); } }
public static string Format(string xmlValue, XmlFormatJsonConfig settings) { _indentation = 0; _settings = settings; StringBuilder output = new StringBuilder(); XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); string linarizedXml = LinarizeXml(xmlValue); using (StringReader stringReader = new StringReader(linarizedXml)) { using (XmlReader reader = XmlReader.Create(stringReader, xmlReaderSettings)) { while (reader.Read()) { bool increaseIndentAfter = false; bool decreaseIndentBefore = false; StringBuilder content = new StringBuilder(); switch (reader.NodeType) { case XmlNodeType.Element: if (reader.IsEmptyElement && !reader.HasAttributes) { content.AppendFormat("<{0} />", reader.Name); } else if (reader.IsEmptyElement && reader.HasAttributes) { content.AppendFormat("<{0}", reader.Name); if (_settings.IgnoreNewLineWhenManyAttributes.Contains(reader.Name)) WriteAttributesStraight(reader, content); else WriteAttributes(reader, content, _settings.NewLineWhenManyAttributes); content.AppendFormat(" />"); } else if (reader.HasAttributes) { content.AppendFormat("<{0}", reader.Name); WriteAttributes(reader, content); content.AppendFormat(">"); increaseIndentAfter = true; } else { content.AppendFormat("<{0}>", reader.Name); increaseIndentAfter = true; } break; case XmlNodeType.Text: content.AppendFormat(reader.Value); break; case XmlNodeType.CDATA: content.AppendFormat("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: content.AppendFormat("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: content.AppendFormat("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: content.AppendFormat("<?xml version=\"1.0\"?>"); // TODO: reader.Value instead? break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: content.AppendFormat("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: content.AppendFormat(reader.Name); break; case XmlNodeType.EndElement: decreaseIndentBefore = true; content.AppendFormat("</{0}>", reader.Name); break; case XmlNodeType.Whitespace: continue; } if (decreaseIndentBefore) { _indentation--; } //Console.Write("{0}{1}{2}{3}", _indentation, Indent(), content, Environment.NewLine); output.AppendFormat("{0}{1}{2}", Indent(), content, Environment.NewLine); if (increaseIndentAfter) { _indentation++; } } } } // Normalize line endings: http://stackoverflow.com/questions/841396/what-is-a-quick-way-to-force-crlf-in-c-sharp-net output.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); return output.ToString(); }