Пример #1
0
        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);
            }
        }
Пример #2
0
        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();
        }