xml 格式化
运行效果:免费在线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内容不能为空" });}// 根据不同操作处理XMLswitch (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;}
}