批量格式化XML与JSON文件小工具
JSON/XML 格式化工具 (WPF, .NET 8)
虽然网络上有很多在线的格式化工具,但有时候依然不够方便,这是一款轻量级的 Windows 桌面工具,用于批量/拖拽格式化 XML 与 JSON 文件,支持目录递归、严格校验、编码保留、原子替换/回收站替换、并发处理,以及会话记忆与启动自动处理。
下面是格式化后的结果:


功能特性
- 拖拽处理:支持拖拽文件或目录到主窗口,目录会递归展开。
- 快速内容判定:首个非空白字符为
<视为 XML,{/[视为 JSON,其他跳过;可开启“强制尝试解析”。 - 严格校验:
- XML:禁用 DTD/外部实体,防注入,合法性检测后再格式化。
- JSON:严格标准 JSON(不允许注释、尾随逗号)。
- 格式化与编码:
- XML 使用
XmlWriter,保留/推断编码与 XML 声明;统一 CRLF 行尾。 - JSON 使用
Utf8JsonWriter,先 2 空格缩进,再根据设置转换为 4 空格或 Tab;统一 CRLF 行尾。
- XML 使用
- 文件替换策略(稳健):
- 首选:将原文件移入回收站(如失败则硬删除),再将临时文件重命名为原名。
- 回退:
File.Replace或Copy覆盖,支持.bak备份。
- 并发处理:默认 4 并发,可在设置中调整。
- 体积/过滤:超过 100MB 的文件自动跳过。
- 会话记忆:
- 记住拖拽的最近路径列表(
LastPaths)。 - 下次启动可自动加载并处理(可通过配置开关)。
- 记住拖拽的最近路径列表(
- 批量确认:展开后文件数超过 5 个时弹出确认对话框(支持本会话记忆)。
- 应用图标:内置程序化自绘多分辨率 ICO,任务栏/标题栏显示一致。
使用方法
- 运行
publish/JsonXmlFormatter.exe(需要 .NET 8 Desktop Runtime)。 - 将文件或目录拖拽进窗口。
- 如展开后的文件总数 > 5,会弹出确认提示。
- 处理完成后,列表显示每个文件的“成功/跳过/失败”状态与说明。
- 可勾选“只看失败/跳过”,或点击“清空列表”。
- 点击“设置”可修改缩进风格、并发数、是否备份
.bak、强制尝试解析、是否记住批量选择等。
配置文件(与 EXE 同名,同目录)
应用启动时会在 EXE 同目录生成或读取与 EXE 同名的 JSON 配置,例如:
{"CenterOnStartup": true,"AutoProcessOnStartup": true,"LastPaths": ["C:\\path\\to\\folder","C:\\path\\to\\file.json"]
}
CenterOnStartup:启动时窗口居中(支持多显示器/多 DPI)。AutoProcessOnStartup:启动后自动加载并处理LastPaths。LastPaths:上一次拖拽的文件或目录列表(自动去重)。
注意:本配置不兼容早期版本的配置方式(已改为“与 EXE 同名的 JSON”)。
窗口与居中策略
- 初始尺寸:
Width=900,Height=520,最小尺寸MinWidth=800,MinHeight=450。 - 启动直接居中:在
SourceInitialized阶段按当前鼠标所在屏幕工作区 + DPI 缩放计算位置,避免先显示再移动的闪动。
列表与自动处理
- 列表禁止重复:拖拽相同文件、多次拖拽或“上次列表”自动加载时,均会去重且不重复入队。
- 自动处理:若
AutoProcessOnStartup=true且LastPaths非空,启动后会自动处理;若展开 > 5 仍会弹出确认。
注意事项
- 若文件被“只读”保护或正被其他进程占用,可能导致覆盖失败;程序会尝试移除只读属性与多次重试。
- 单文件发布模式下,应用在发布目录生成
JsonXmlFormatter.json配置。不要放在系统受限路径下以免权限问题。 - JSON/XML 解析严格,请确保文件内容合法。对于非标准 JSON(带注释/尾随逗号)会提示失败。
- 拖拽目录时,超过 100MB 的文件会被跳过处理。
发布方式
- 框架依赖的单文件(win-x64):
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained false -o ./publish - 可执行文件位置:
publish/JsonXmlFormatter.exe
技术栈
- .NET 8.0 WPF(C#),
System.Text.Json,System.Xml - 并发:
SemaphoreSlim - 图标生成:独立
JsonXmlFormatter.IconGen项目(SkiaSharp 自绘多分辨率 ICO)
变更要点(近期)
- 配置迁移:改为“与 EXE 同名的 JSON”,新增
CenterOnStartup、AutoProcessOnStartup、LastPaths。 - 启动居中:在
SourceInitialized即时居中。 - 替换策略:新增“回收站删除 + 重命名临时文件”,并保留
Replace/Copy作为回退方案。 - 列表去重:防止重复入队与重复处理。
常见问题
- 提示“无法访问文件/权限不足”:
- 可能是目标只读、被占用或杀毒软件拦截;请尝试关闭相关程序或将发布目录加入白名单。
- 程序会自动重试和回退。若仍失败,请提供“说明”列的完整错误文本。
- 图标/标题栏不显示:请确认
Assets/app.ico在发布目录存在(已经配置为总是复制)。
如需新增功能(托盘、右键菜单、更多格式化选项、多语言等),或需要便携版/安装包,请提出需求。
