跳到主要内容
PulsarKit

XML转JSON

把XML转成JSON,属性、CDATA和命名空间按你选的方式处理,语法错误会指出具体行号。

把文件拖到这里

.xml, .rss, .svg, .xhtml, .txt · 最大300 MB

属性
更多设置

如何转换为JSON

  1. 1

    拖入XML文件

    添加一个文件,或者最多二十个。RSS订阅源、SVG图形和XHTML页面都是XML,读取方式相同。

  2. 2

    选择属性和重复元素的映射方式

    属性可以加前缀、归到一个键下,或者跳过;重复的标签可以始终变成数组,也可以只在真正重复时才变成数组。

  3. 3

    转换并下载JSON

    点击按钮,保存带缩进的结果。批量处理的文件会打包成一个ZIP压缩包。

一个元素,还是只有一项的列表

任何XML到JSON的映射,最麻烦的都是只有一项的列表:<order>下有三个<item>子元素,显然会变成数组;可同一个文档只有一个item时,看起来就是普通对象,遍历它的代码碰到第一个真实客户就出错。所以数组规则是一个明确的设置,而不是藏起来的经验规则,你也可以强制让所有子元素都变成数组。

看起来是数字,其实不是

智能类型识别会把42变成数字、把true变成布尔值,这通常正是你想要的,偶尔却是灾难。零件编号00123不能变成123,二十位的税号也不能被四舍五入成科学计数法。所以带前导零的值和超过十五位的数字串都保留为字符串;关掉类型识别,每个值都完全按原样保留。

实体声明一律拒绝

含有<!ENTITY>声明的DOCTYPE会在解析开始前被拒绝。十个嵌套的实体,每个都引用前一个十次,能展开成几GB的文本,让标签页卡死,这就是经典的“十亿笑声”(billion laughs)。这里除了五个预定义实体和数字字符引用,什么也不展开,攻击也就无从展开。

就在这里解析,不去别处

解析器在你的浏览器里运行,放在一个工作线程(worker)中,用的是随页面加载的代码。你的XML从不上传,所以没有要删除的服务器副本,没有要等待的队列,也没有需要担心的日志。关闭标签页后,文档和由它生成的JSON都会消失。

常见问题

XML属性在JSON里放在哪?

默认每个属性都成为元素对象上的一个键,和子元素放在一起,前面加@_前缀,这样不会和同名的子标签冲突。你也可以把所有属性收进一个@attributes子对象,让元素内容保持干净,或者干脆去掉属性。

为什么只出现一次的重复元素不是数组?

因为文档里没有任何地方说明它是列表。按默认规则,只有一个标签在同一个父元素下确实出现不止一次时,才会变成数组,和文件完全对应。如果接收数据的程序需要固定结构,把数组设置切换为“始终”,单独一个子元素也会变成只有一项的数组。

CDATA段会怎么处理?

默认CDATA内容并入元素的文本,因为CDATA只是一种引用写法,不是另一种数据。如果需要知道值里哪一部分是这样引用的,比如之后要重新输出XML,就切换到“分开”,它会放进单独的#cdata键。

能去掉命名空间前缀吗?

能。去掉命名空间后,dc:title变成title,订阅源和文档格式在代码里就好访问得多。如果同一个文件里两个不同的命名空间用了同一个本地名称,就不要开启,因为这时只有前缀能把这些键区分开。

为什么会报自定义实体的错误?

因为在DOCTYPE里声明了自己实体的文档会被拒绝,而不是展开。这是防御实体展开炸弹唯一可靠的办法,这类炸弹能把几KB变成几GB内存。删掉DOCTYPE块,文档其余部分就能正常转换。

RSS订阅源和SVG文件能用吗?

能,两者都是普通的XML。RSS订阅源会转成一个对象,包含频道元数据和一个条目数组,用起来很方便。SVG会转成它的元素树,所有表现属性完整保留,便于用程序检查或改写图形。

XML有语法错误会怎样?

你会看到行号、列号和涉及的标签,比如第214行第5列应有闭合标签,而不是一句笼统的解析失败。在有几万个元素的文件里,这个区别至关重要,因为它告诉你该看哪里。

我的文件会上传到别处吗?

不会。解码、校验和转换全部在你的浏览器标签页本地运行。整个过程不涉及服务器,所以关闭页面后,任何地方都没有你的文档副本。

相关工具