xml 格式化

发布于:2025-08-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

运行效果:免费在线XML格式化工具 - XML代码美化/压缩/验证

代码实现:

using Microsoft.AspNetCore.Mvc;
using System.Xml;
using System.Xml.Linq;

namespace SaaS.OfficialWebSite.Web.Controllers
{
    public class XmlController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

         [HttpPost]
        public IActionResult ProcessXml([FromBody] XmlProcessRequest request)
        {
            try
            {
                // 验证请求
                if (string.IsNullOrWhiteSpace(request.Xml))
                {
                    return BadRequest(new { success = false, error = "XML内容不能为空" });
                }

                // 根据不同操作处理XML
                switch (request.Action.ToLower())
                {
                    case "validate":
                        return ValidateXml(request.Xml);
                    case "format":
                        return FormatXml(request.Xml, request.Options);
                    case "minify":
                        return MinifyXml(request.Xml);
                    default:
                        return BadRequest(new { success = false, error = "不支持的操作类型" });
                }
            }
            catch (Exception ex)
            {
                return BadRequest(new { success = false, error = ex.Message });
            }
        }

        private IActionResult ValidateXml(string xml)
        {
            try
            {
                // 尝试加载XML来验证
                XDocument.Parse(xml);
                return Ok(new { success = true });
            }
            catch (XmlException ex)
            {
                return Ok(new { 
                    success = false, 
                    error = $"XML验证失败 (行 {ex.LineNumber}, 位置 {ex.LinePosition}): {ex.Message}" 
                });
            }
        }

        private IActionResult FormatXml(string xml, XmlFormatOptions options)
        {
            try
            {
                var doc = XDocument.Parse(xml);
                var settings = new XmlWriterSettings
                {
                    Indent = true,
                    IndentChars = options.Indent == "tab" ? "\t" : new string(' ', int.Parse(options.Indent)),
                    NewLineChars = "\n",
                    NewLineHandling = NewLineHandling.Replace,
                    OmitXmlDeclaration = doc.Declaration == null
                };

                using (var writer = new StringWriter())
                using (var xmlWriter = XmlWriter.Create(writer, settings))
                {
                    doc.Save(xmlWriter);
                    xmlWriter.Flush(); 
                    var formattedXml = writer.ToString();
                    
                    // 如果需要排序属性
                    if (options.SortAttributes)
                    {
                        formattedXml = SortAttributes(formattedXml);
                    }
                    
                    return Ok(new { success = true, formattedXml = formattedXml });
                }
            }
            catch (Exception ex)
            {
                return BadRequest(new { success = false, error = ex.Message });
            }
        }

        private IActionResult MinifyXml(string xml)
        {
            try
            {
                var doc = XDocument.Parse(xml);
                var settings = new XmlWriterSettings
                {
                    Indent = false,
                    NewLineHandling = NewLineHandling.None,
                    OmitXmlDeclaration = doc.Declaration == null
                };

                using (var writer = new StringWriter())
                using (var xmlWriter = XmlWriter.Create(writer, settings))
                {
                    doc.Save(xmlWriter);
                    xmlWriter.Flush();
                    return Ok(new { success = true, formattedXml = writer.ToString() });
                }
            }
            catch (Exception ex)
            {
                return BadRequest(new { success = false, error = ex.Message });
            }
        }

        private string SortAttributes(string xml)
        {
            var doc = XDocument.Parse(xml);
            
            foreach (var element in doc.Descendants())
            {
                if (element.HasAttributes)
                {
                    var orderedAttributes = element.Attributes()
                        .OrderBy(attr => attr.Name.LocalName)
                        .ToList();
                    
                    element.Attributes().Remove();
                    element.Add(orderedAttributes);
                }
            }
            
            return doc.ToString();
        }
    }

    public class XmlProcessRequest
    {
        public string Xml { get; set; }
        public string Action { get; set; } // "format", "validate", "minify"
        public XmlFormatOptions Options { get; set; }
    }

    public class XmlFormatOptions
    {
        public string Indent { get; set; } = "4"; // "2", "4", "tab"
        public bool SortAttributes { get; set; } = true;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到