Install
openclaw skills install @thcjp/xml-json-converter-freeopenclaw skills install @thcjp/xml-json-converter-free把"XML与JSON互转"从手写解析器踩坑压缩到一条命令搞定。双向转换+属性处理+命名空间三件套。
XML转JSON免费版解决独立开发者最常踩的三个坑:XML属性不知道放哪、命名空间前缀丢失、CDATA块被当普通文本。本工具把这些高频操作固化为可复制模板与速查表,配以属性处理约定与命名空间策略,让Agent能直接给出可粘贴的脚本与可执行的修复建议。
直接对Agent说:
"帮我把 response.xml 转成 JSON,属性用 @ 前缀。"
Agent会按本工具的模板规则输出:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | XML转JSON(免费版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
import xmltodict, json
# ...
def xml_to_json(xml_path: str, json_path: str, attr_prefix: str = '@'):
"""XML转JSON(BadgerFish约定)"""
with open(xml_path, 'r', encoding='utf-8') as f:
xml_content = f.read()
# xmltodict 默认用 @ 作为属性前缀,#text 作为文本键
data = xmltodict.parse(
xml_content,
attr_prefix=attr_prefix,
cdata_key='#text',
process_namespaces=False
)
with open(json_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
return data
# ...
result = xml_to_json('response.xml', 'response.json')
print('转换完成:response.xml -> response.json')
把样例JSON粘给Agent:
{
"user": {
"@id": "123",
"@lang": "zh",
"name": "张三",
"roles": {"role": ["admin", "editor"]}
}
}
Agent会按"JSON转XML规则"输出:
<user id="123" lang="zh">
<name>张三</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
</user>
| 转换方向 | 约定规则 | 示例 |
|---|---|---|
| XML属性 → JSON键 | 加 @ 前缀 | <a id="1"> → {"a": {"@id": "1"}} |
| XML文本 → JSON键 | 用 #text 键 | <a>hello</a> → {"a": {"#text": "hello"}} |
| XML子元素 → JSON键 | 直接用标签名 | <a><b/></a> → {"a": {"b": null}} |
| XML重复元素 → JSON数组 | 同名元素合并为数组 | <a><b/><b/></a> → {"a": {"b": [null, null]}} |
| XML CDATA → JSON键 | 用 #text 键 | <a><![CDATA[x]]></a> → {"a": {"#text": "x"}} |
支持的约定:BadgerFish(@attr+#text,默认)、Parker(属性与子元素同级)、Gdata($t 文本)、自定义。本工具默认BadgerFish,最通用。
Agent执行规则:默认BadgerFish;转换后输出JSON预览;提示用户属性用 @ 前缀访问。
输入: 用户提供功能1:双向转换约定所需的指令和必要参数。 处理: 解析功能1:双向转换约定的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能1:双向转换约定的响应数据,包含状态码、结果和日志。
import xmltodict
# ...
# 1. 保留命名空间前缀(默认)
data = xmltodict.parse(xml_content, process_namespaces=False)
# 输出:{"ns:root": {"ns:child": "..."}}
# ...
# 2. 剥离命名空间前缀
data = xmltodict.parse(xml_content, process_namespaces=True)
# 输出:{"root": {"child": "..."}}
# ...
# 3. 自定义命名空间映射
namespaces = {
'http://example.com/ns1': 'ns1',
'http://example.com/ns2': 'ns2',
}
data = xmltodict.parse(xml_content, process_namespaces=True, namespaces=namespaces)
Agent执行规则:默认剥离命名空间(前端消费更友好);若需保留,提示用户加 process_namespaces=False;自定义映射时输出映射表供确认。
输入: 用户提供功能2:命名空间处理所需的指令和必要参数。 处理: 解析功能2:命名空间处理的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能2:命名空间处理的响应数据,包含状态码、结果和日志。
input_params参数,支持创建/查询/导出操作| XML特性 | 默认处理 | 可选处理 |
|---|---|---|
| CDATA块 | 当作文本节点,合并到 #text | 单独保留为 #cdata |
注释 <!-- --> | 默认丢弃 | 保留为 #comment |
处理指令 <? ?> | 默认丢弃 | 保留为 #pi |
| DTD声明 | 默认丢弃 | 保留为 #dtd |
XML声明 <?xml ?> | 默认丢弃 | 写出时自动添加 |
Agent执行规则:默认丢弃注释与处理指令(JSON侧通常不需要);若用户明确需保留,提供 --keep-comments 选项。
输入: 用户提供功能3:CDATA与注释处理所需的指令和必要参数。 处理: 解析功能3:CDATA与注释处理的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能3:CDATA与注释处理的响应数据,包含状态码、结果和日志。
import xmltodict, json
# ...
def json_to_xml(json_path: str, xml_path: str, root: str = 'root'):
"""JSON转XML"""
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 包一层根元素(XML必须有单一根)
if len(data) > 1:
data = {root: data}
xml_content = xmltodict.unparse(data, pretty=True, indent=' ')
with open(xml_path, 'w', encoding='utf-8') as f:
f.write(xml_content)
return xml_content
转换规则:@ 前缀键转为属性;#text 键转为文本;数组转为同名重复元素;null 转为自闭合标签 <tag/>;必须包一层根元素。
输入: 用户提供功能4:JSON转XML规则所需的指令和必要参数。 处理: 解析功能4:JSON转XML规则的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能4:JSON转XML规则的响应数据,包含状态码、结果和日志。 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:轻量级、互转工具、覆盖属性处理、命名空间与单文件、秒上手、免费版是一款面向、独立开发者与后端、工程师的轻量级结、构化数据格式互转、属性处理、单文件处理、四件事、提供可复制即用的、Node、Use、when、需要文件处理、文档转换、格式互转、内容提取时使用、不适用于加密文件、适用于独立开发者、企业团队和自动化、工作流场景等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。
痛点:调用旧系统的WebService,返回SOAP XML,前端要JSON,手写解析器又长又易错。
使用方式:对Agent说"把这个SOAP响应转成JSON",Agent按本工具的模板生成转换脚本,处理命名空间、CDATA、属性,输出干净的JSON。
效果:SOAP适配从半天降至10分钟。
痛点:网站sitemap.xml要解析入库做SEO分析,但XML结构嵌套深,手解析麻烦。
使用方式:对Agent说"解析sitemap.xml转成JSON数组,每个URL一条记录",Agent生成转换脚本,输出 {"urlset": {"url": [...]}} 结构便于遍历。
效果:Sitemap解析从1小时降至2分钟。
痛点:docx/xlsx本质是ZIP+XML,要提取内容需解析XML,但Office XML命名空间复杂。
使用方式:对Agent说"解析docx的document.xml转JSON",Agent生成转换脚本,剥离Office命名空间,输出可读的结构化数据。
效果:Office文档解析从依赖重型库改为轻量xmltodict。
XML的属性和子元素在JSON里要区分清楚。属性用 @ 前缀,子元素直接用标签名。混用会导致转换后无法区分原始结构。本工具默认BadgerFish约定,最不易混淆。
前端消费JSON时命名空间前缀(如 ns0:)是噪声,建议剥离。但若需保留语义(如区分不同来源的相同标签名),则保留前缀。本工具默认剥离,可配置保留。
XML中同名重复元素(如多个 <item>)在JSON里必须转为数组。但单个元素时是对象还是单元素数组?本工具默认:单个时为对象,多个时为数组(与xmltodict一致)。若下游要求数组一致性,用 --force-array 选项。
单文件超过10MB时,xmltodict.parse 会一次性载入内存。建议用 xmltodict.parse 的流式模式或 lxml 的迭代解析。免费版提供单文件模板,专业版提供流式转换。
免费版不限制文件大小,但建议单文件不超过50MB(XML解析比JSON慢,且内存占用约为原文件的5-10倍)。超过50MB时建议用流式解析或拆分。专业版提供流式转换与批量处理。
默认不保留。JSON标准不支持注释,XML注释转换后无对应概念。若需保留注释信息,本工具提供 --keep-comments 选项,把注释转为 #comment 键。
默认本工具剥离命名空间前缀(前端消费更友好)。若需保留,设置 process_namespaces=False。若需自定义前缀(如 ns1、ns2),提供命名空间映射表。
XML允许属性和子元素同名(如 <a id="1"><id>2</id></a>)。BadgerFish约定下,属性转为 @id,子元素转为 id,不会冲突。但若用Parker约定(属性与子元素同级),会冲突覆盖。本工具默认BadgerFish,避免此问题。
必须。XML规范要求有且仅有一个根元素。若JSON顶层有多个键,本工具自动包一层 <root>。若需自定义根元素名,用 --root 参数指定。
fast-xml-parser)| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent平台内置LLM提供(免费版路由GPT-4o-mini) |
| xmltodict | Python库 | 必需 | pip install xmltodict |
| json | Python模块 | 必需 | Python标准库,无需安装 |
本技能基于原始开源作品改进,保留原始版权声明:
本改进作品在原始作品基础上进行了深度差异化改造,包括但不限于:
原始MIT license允许使用、复制、修改和分发,需保留版权声明。本改进作品在保留原始版权声明的基础上添加自有署名,完全符合MIT license要求。
本免费体验版限制以下高级功能:
batch-convert 子命令xsd-check 子命令xpath-map 子命令stream-convert 子命令soap-parser 模块PostgreSQL/MySQL)—— 专业版提供 db-sink 模块解锁全部功能请使用专业版:xml-json-converter-pro
### 30秒上手:XML转JSON(补充)
# ...
直接对Agent说:
# ...
> "帮我把 response.xml 转成 JSON,属性用 @ 前缀。"
# ...
Agent会按本工具的模板规则输出:
# ...
```python
import xmltodict, json
def xml_to_json(xml_path: str, json_path: str, attr_prefix: str = '@'):
"""XML转JSON(BadgerFish约定)"""
with open(xml_path, 'r', encoding='utf-8') as f:
xml_content = f.read()
# xmltodict 默认用 @ 作为属性前缀,#text 作为文本键
data = xmltodict.parse(
xml_content,
attr_prefix=attr_prefix,
cdata_key='#text',
process_namespaces=False
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |