运行效果:免费在线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;
}
}