通过命令行转换 XML 至 JSON、XML、CSV、PDF
Windows
2000/2003/Vista
7/8/10/11
and
2012/2016/2019/2022 Server
and
Docker/Citrix/Wine
Total XML Converter X 是一款服务器端 SDK,可将 XML 转换为 JSON、CSV、XLSX、PDF、HTML、SQL、DBF、Access 以及其他 10 多种格式 — 完整支持 XSLT,无需在服务器上安装任何外部 XML 库。它以无界面方式运行:没有 GUI,没有对话框,没有弹窗。Total XML Converter X 同时提供 命令行 二进制文件和 ActiveX/COM 接口,可直接接入 ASP、PHP、.NET、Python、Ruby、Java 以及任何支持 COM 的后端。输出格式分为两组:
-xslt 即时对每个输入应用样式表 — 无需两步流水线
table(将重复元素展开为行)、highlight(带语法着色的树状视图,便于人工查阅)、report(基于表定义文件生成的表格化报告)
-Recurse -kfs)、批量将多个 XML 合并为单个 PDF(-combine -sort name),以及通过队列文件处理(-list)实现无人值守运行。-msuccess、-merror 与 -IgnoreInvalidSource 等服务器友好的参数可让单个错误文件被路由到隔离文件夹,而不会中止整个批处理。本程序直接处理 XML — 无需 .NET XML 序列化器,无需安装 Saxon 或 Xalan,也不会在 Windows 更新后出现 msxml 依赖问题。
转换速度高且支持批量转换,使整个流程简单而不枯燥。免费试用 30 天(无任何功能限制),亲自体验它的物超所值。
当前支持的部分格式转换:
|
|
|
LLM 智能体(Claude、ChatGPT、Cursor、Cline)和检索框架(LangChain、LlamaIndex、Haystack)并不擅长读取原始 XML — 嵌套标签与属性对嵌入模型来说就是噪声。Total XML Converter X 会把 XML 写成 GitHub-Flavored Markdown,配以结构化的 frontmatter 与可选的 Docling 兼容旁路文件,让 XML 文档进入您的向量存储时成为一份干净、章节感知的文本表示 — 元素层级映射到 Markdown 标题,重复元素变成表格,而不是一长串尖括号的字符串。
选择 Markdown 输出后您会得到:
#,子元素按深度变成 ## / ### / ####;属性以键值列表形式直接呈现在各级标题下方
table 渲染方法相同:具有相同标签和一致子结构的兄弟元素,会被组成一张表,列的类型自动检测
-xslt stylesheet.xsl 在 Markdown 渲染之前重塑 XML,与其他输出格式相同的一步式流水线
source_file、format(MIME)、root_element、namespaces、element_count、深度、检测到的 schema(当引用了 XSD/DTD 时)、generator、created,以及用于溯源的 binary_hash
.docling.json 旁路文件 — 符合 Docling schema 的 JSON:自动检测出的表的类型化列(带 EUR、pcs、% 等单位)、每个元素回指源 XML 的锚点(XPath)、命名空间映射,以及分块器可读取的 chunks_hint 数组
这就是 CoolUtils RAG Adapter — 一套统一的 Markdown 约定,由每款 Total Converter X 产品共享。完整规范、样例 .md + .docling.json 以及集成代码片段,请见 Coolutils Converter X — RAG Adapter 页面。
string src = @"C:\test\Source.xml";
string dest = @"C:\test\Dest.json";
var cnv = new XMLConverterX();
cnv.Convert(src, dest, "-cJSON -log c:\\test\\XML.log");
if (!string.IsNullOrEmpty(cnv.ErrorMessage))
throw new Exception(cnv.ErrorMessage);
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
StringBuilder sbLogs = new StringBuilder();
sbLogs.AppendLine("started...");
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
var assemblyDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
assemblyDirectoryPath = assemblyDirectoryPath.Substring(0, assemblyDirectoryPath.Length - 4);
var executablePath = $@"{assemblyDirectoryPath}\Converter\XMLConverterX.exe";
sbLogs.AppendLine(executablePath + "...");
var srcPath = $@"{assemblyDirectoryPath}\src\sample.xml";
var outPath = Path.GetTempFileName() + ".json";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(srcPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & source files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{srcPath} {outPath}";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
int sleepCounter = 10;
while(!File.Exists(outPath) && sleepCounter > 0)
{
System.Threading.Thread.Sleep(1000);
sbLogs.AppendLine("sleep...");
sleepCounter--;
}
if (File.Exists(outPath))
sbLogs.AppendLine("Conversion complete successfully.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("XMLConverter.XMLConverterX")
C.Convert "c:\source.xml", "c:\dest.json", "-cJSON -log c:\XML.log"
Response.Write C.ErrorMessage
set C = nothing
dim C
Set C=CreateObject("XMLConverter.XMLConverterX")
Response.Clear
Response.AddHeader "Content-Type", "binary/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=test.json"
Response.BinaryWrite C.ConvertToStream("C:\www\ASP\Source.xml", "C:\www\ASP", "-cJSON -log c:\XML.log")
set C = nothing
$src="C:\\test\\test.xml";
$dest="C:\\test\\test.json";
if (file_exists($dest)) unlink($dest);
$c= new COM("XMLConverter.XMLConverterX");
$c->convert($src,$dest, "-cJSON -log c:\\test\\XML.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('XMLConverter.XMLConverterX')
src = "C:\\test\\test.xml"
dest = "C:\\test\\test.json"
c.convert(src, dest, "-cJSON -log c:\\test\\XML.log")
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("XMLConverter.XMLConverterX")
src = "C:\\test\\test.xml"
dest = "C:\\test\\test.json"
c.convert(src, dest, "-cJSON -log c:\\test\\XML.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('XMLConverter.XMLConverterX');
c.Convert('c:\test\source.xml', 'c:\test\dest.json', '-cJSON -log c:\test\XML.log');
if c.ErrorMessage <> '' then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("XMLConverter.XMLConverterX");
c.Convert("C:\\test\\source.xml", "C:\\test\\dest.json", "-cJSON");
if (c.ErrorMessage != "")
alert(c.ErrorMessage)
use Win32::OLE; my $src = "C:\\test\\test.xml"; my $dest = "C:\\test\\test.json"; my $c = CreateObject Win32::OLE 'XMLConverter.XMLConverterX'; $c->convert($src, $dest, "-cJSON -log c:\\test\\XML.log"); print $c->ErrorMessage if -e $dest;
"Total XML Converter X 似乎完全符合我的需求,尽管我们只用它将旧的 .xml 文件转换为其他格式。我们选择这款程序是因为它能够处理 XSLT 文件。我们有 6,000 多个 XML 文件,转换器在不到一小时内就完成了任务。谢谢!"
Jean Robitaille
Sparktown Christian School
"我们将合作伙伴的 XML 数据流(订单、ASN、发票)转换为内部 JSON 架构。Total XML Converter X 配合 -xslt 就是核心引擎:每个合作伙伴都有自己的样式表,转换器即时应用,生成的 JSON 直接进入 Kafka。我们替换掉了一个为同样工作占用 2GB 内存的 Java/Saxon 容器。这个 Windows 二进制文件大约只占用 60MB 内存,吞吐量却是原来的两倍。"
Lukas R.
Senior Backend Developer at an EDI integration vendor
"我们的客户提交 XBRL/XML 合规申报文件,我们必须将它们渲染为 PDF 供人工审计员查阅。Total XML Converter X 配合 -method report 和表定义文件,可生成干净、分页良好的 PDF 输出,无需我们自行编写渲染器。-msuccess/-merror 队列路由正是我们这个由监视器驱动的流水线所需要的。已稳定使用五年,毫无意外。"
Carmen V.
DevOps Engineer at a regulatory-reporting platform
"我们以 Royalty-Free License 将 Total XML Converter X 打包到自家的数据迁移工具中。一次性按项目付费的成本仅为 Altova MapForce 按开发者订阅价格的零头。我们的安装程序会发布并注册 ActiveX,应用直接调用它,最终用户只看到我们自己的 UI。32 位 ActiveX 的限制让我们花了一两天时间调整流水线,但当我们询问变通方案时支持团队反应很迅速。"
Halil B.
Independent Software Vendor
"客户每晚通过邮件发送来自 20 套不同 ERP 系统的 XML 转储。我们使用 Total XML Converter X 配合 -detectcell -plain 将所有内容拉平为 XLSX,分析师无需单独的 ETL 工具就能直接进行透视。在我们的硬件上,针对常见的不到 1MB 的文件,吞吐量约为每秒 200 个 XML。CLI 在多次运行间表现一致;相同的输入、相同的参数,输出字节完全一致。"
Felipe O.
Lead .NET Developer at a SaaS analytics firm
通过 ActiveX 或命令行在服务器上将 XML 转换为 CSV、JSON 和 PDF 的开发团队
为服务器端 XML 转 CSV 和 XML 转 JSON 工具提供动力
Web 开发人员通过 ActiveX 将 Total XML ConverterX 集成到 ASP 或 PHP 应用程序中。用户通过浏览器上传 XML 文件,服务器静默将其转换为 CSV、JSON 或 PDF,无弹出消息,返回结果。附带示例代码文件以加速集成。
将 XML 数据源转换为其他系统所需的格式
企业 IT 团队使用 Total XML ConverterX 桥接使用不同数据格式的系统。将一个平台的 XML 导出文件转换为基于电子表格工具用的 CSV、Web API 用的 JSON 或人工审阅用的 PDF——全程通过命令行自动化,保留原始时间戳。
在计划流水线中批量转换 XML 数据源
数据工程团队将 Total XML ConverterX 作为转换步骤添加到 ETL 工作流中。来自数据库、合作伙伴 API 或物联网系统的每晚 XML 转储文件被转换为分析平台用的 CSV 或数据湖用的 JSON。文件夹结构保留,错误静默记录用于监控。
在服务器上格式化或压缩 XML 文档
内容平台和出版系统使用 Total XML ConverterX 将原始 XML 格式化为编辑人员可读的形式,或压缩冗长的 XML 以减少存储和传输大小。批量处理复杂 XML 结构的同时保持原始文档层次结构完整。
将 XML 申报文件转换为供审计人员使用的 PDF 报告
受监管行业接收或生成用于合规申报的 XML 数据。Total XML ConverterX 将这些 XML 文件转换为供审计人员审阅的 PDF 报告,或转换为导入合规数据库用的 CSV——在服务器上无人值守运行,无图形界面中断,并完整记录错误日志。
Total XML Converter X 附带 XMLConverterX.exe,这是一个可以从脚本、计划任务、CI 运行器或任何后端服务驱动的控制台二进制程序。输出涵盖数据端(JSON、CSV、Excel、SQL、DBF、Access)和文档端(PDF、HTML、DOC、RTF、TXT、TIFF、JPEG、PNG)。下面的配方涵盖了我们最常从 SDK 客户那里听到的场景。
最简单的调用方式 —— 一个源、一个输出、一个目标格式。
XMLConverterX.exe "C:\inbox\invoice.xml" "C:\out\invoice.pdf" -cPDF
将旧版 XML 馈送到现代 JSON 管道的最快方法。掩码匹配文件夹中的每个 XML;输出为每个输入获得一个 JSON 文件。
XMLConverterX.exe "C:\inbox\*.xml" "C:\out\" -cJSON
-detectcell 从数据中推断数字、日期和文本列,因此数字在结果工作簿中保持可求和。-plain 将嵌套元素展平为一个宽表。
XMLConverterX.exe "C:\reports\*.xml" "C:\out\" -cExcel -detectcell -plain
欧洲区域设置、下游解析器和电子表格导入都需要不同的分隔符。-separator 设置字段分隔符;-comma 设置引号字符(使用字符代码,例如 #39 表示撇号)。
XMLConverterX.exe "C:\inbox\*.xml" "C:\out\" -cCSV -separator ";" -comma "\""
当源 XML 与目标架构不匹配时,先通过 XSLT 运行它。-xslt 即时将样式表应用于每个输入 —— 无需两步管道。
XMLConverterX.exe "C:\inbox\*.xml" "C:\out\" -cPDF -xslt "C:\xsl\invoice-to-pdf.xsl"
-method 标志控制 XML 结构如何成为可见输出。table 将重复元素扩展为行;highlight 用语法着色渲染 XML 树(适合人工审查);report 基于表定义文件生成表格报告。
XMLConverterX.exe "C:\inbox\config.xml" "C:\out\config.pdf" -cPDF -method highlight
XMLConverterX.exe "C:\inbox\orders.xml" "C:\out\orders.xlsx" -cExcel -method report -tables "C:\schemas\orders.tbl"
对于在子文件夹中组织的数据湖和文档档案。-Recurse 遍历子目录;-kfs 在输出端重新创建相同的树,而不是将所有内容展平到一个桶中。
XMLConverterX.exe "C:\datalake\*.xml" "C:\out\" -cJSON -Recurse -kfs
将一个文件夹的小 XML 汇总为单个多页 PDF 用于审查或审计。-sort name 保持顺序可预测。
XMLConverterX.exe "C:\reports\*.xml" "C:\out\daily-report.pdf" -cPDF -combine -sort name
标准的后端模式:监视器将文件放入 inbox,转换器清空它,处理过的文件落到 done,无法处理的文件落到 quarantine 等待审查。-IgnoreInvalidSource 防止单个坏文件中止整个批次。
XMLConverterX.exe "C:\inbox\*.xml" "C:\out\" -cJSON -msuccess "C:\done" -merror "C:\quarantine" -IgnoreInvalidSource -threads 0
当上游写入队列文件而转换器消耗它时,文件路径不应编码在命令行中。-list 从文本文件中读取文件掩码(每行一个)。目标接受 <DATE> 和 <TIME> 宏,因此每次运行都获得自己的桶。
XMLConverterX.exe -list "C:\queues\nightly.txt" "C:\out\<DATE>\" -cPDF -log "C:\logs\xmlcx.log" -verbosity detail -logmode append
-c 参数生成上述任意格式。new COM("XMLConverter.XMLConverterX"),.NET 中使用 new XMLConverterX(),Python 中使用 win32com.client.Dispatch,Ruby 中使用 WIN32OLE.new。此外,XMLConverterX.exe 命令行二进制文件也可由任意进程、调度器或 shell 脚本调用。同时还提供 ConvertToStream 直接流式输出,适用于 ASP/PHP 的 Web 响应。-xslt "C:\xsl\stylesheet.xsl" 即可对每个输入 XML 即时应用 XSLT,随后按 -c 选择的格式写入输出。这样原本需要两步的流水线(XSLT 处理器 + 转换器)就能合并为一次二进制调用。我们将其用于发票格式、EDI 翻译以及架构映射等工作流。-msuccess "C:\done" 将转换成功的文件移至完成文件夹,-merror "C:\quarantine" 将失败文件路由到隔离文件夹,-IgnoreInvalidSource 防止单个错误文件中止整个批处理。再配合 -list 队列文件输入和 -log -verbosity detail,二进制文件可干净地融入由监视器驱动的后端流水线。.md 作为输出格式,转换器就会把 XML 的元素层级写成 Markdown 标题:根节点是 #,子元素按深度变成 ##/###/####,属性以键值列表形式出现在各级标题下方。具有相同标签和一致子结构的重复兄弟元素会被自动检测出来,渲染成带类型化列的 GFM 表格,使用的是与 XML 转 XLSX 相同的渲染方式。YAML frontmatter 块承载 source_file、root_element、namespaces、element_count、检测到的 schema(当引用了 XSD/DTD 时),以及 binary hash。这是 CoolUtils RAG Adapter 的一部分 — 每款 Total Converter X 产品共享同一套 Markdown 约定。binary_hash,以及 chunks_hint 数组。在命令行中使用 -Docling 启用。-xslt "C:\xsl\reshape.xsl" 与 -cMD -Docling 一起传入,转换器就会对每个输入即时应用 XSLT,然后将结果写为 Markdown。这样原本两步的流水线(XSLT 处理器 + 转换器)就合并成了一次二进制调用 — 对于 EDI 翻译、发票格式以及需要以特定规范化形态落入 RAG 索引的架构映射工作流尤为有用。.md 文件是带 YAML frontmatter 块的纯 GFM,因此 LangChain 的 UnstructuredMarkdownLoader、LlamaIndex 的 MarkdownReader、Haystack 的 MarkdownToDocument 与 Claude Code 的 MCP 文件工具均可直接读取。由于元素的 XPath 被记录在旁路文件中,模型回答中的引用可以解析回确切的源元素。对于 Claude、ChatGPT 或任意聊天 UI,您可以将 Markdown 原样粘贴进上下文。