XML 转 JSON

用浏览器内置解析器把 XML 转成 JSON

XML 转 JSON:属性、文本节点和重复元素怎么处理

解析用的是浏览器的内置解析器

这个工具用浏览器原生的 XML 解析器(DOMParser)来读 XML,而不是自己写正则或字符串切分。这一点很关键,因为手写的 XML 解析几乎总是错的——实体引用、CDATA、命名空间、属性引号的各种写法、自闭合标签,这些用字符串处理都会在某个边界上崩掉。

代价是浏览器解析器要求 XML 严格合法:标签必须闭合、必须有唯一根元素、大小写敏感、特殊字符必须转义。像 <br> 这样在 HTML 里合法的未闭合标签,在 XML 里就是错误。HTML 不是 XML,把 HTML 片段丢进来通常会被拒绝——这是有意为之,因为接受它的后果是给你一个结构错误的静默结果。

属性和文本节点的处理

XML 结构转成 JSON 后的形态
<name>Bob</name>{"name":"Bob"} — 纯文本元素成为字符串值
<user id="7">Bob</user>属性 id 与文本 Bob 需要同时表达,通常把文本放到一个约定键(如 #text),属性成为同级键
同名重复元素合并成数组——这是 XML 转 JSON 最核心的一条规则
元素内含子元素成为嵌套对象
注释、处理指令一般被忽略

注意第二条:XML 的属性和子元素在 JSON 里会处于同一层,于是产生命名冲突的可能——一个元素同时有属性 id 和子元素 <id> 时,两者会撞在同一个键上。遇到这种结构,需要转换器做额外约定(前缀、加下划线等),不同工具的做法不同。

同样存在"单值与数组"的歧义

这是 JSON↔XML 双向都有的问题,从 XML 到 JSON 的方向表现为:只有一个同名元素时,是否要输出成数组。

  • 如果只按实际出现次数决定,那么 <item>1</item> 会得到 {"item":"1"}(字符串),两个 item 才得到数组。
  • 后果是下游代码必须处理两种类型,一个 item.length 就会在单元素时出错。

稳健的做法是在下游做归一化(例如统一用 [].concat(value)),或者在解析时根据已知 schema 强制某些路径为数组。工具本身无法替你决定,所以拿到结果后请确认目标字段的形态再写代码。

常见失败对照

症状原因
parsererror / 解析失败标签未闭合、多个根元素、或字符 & 未转义成 &amp;
中文变乱码原始文件不是 UTF-8,或 <?xml encoding="..."> 声明与实际字节不符
内容缺一段内容被包在 <![CDATA[...]]> 里,部分处理方式会忽略其内容
标签名对不上XML 大小写敏感:<Name> 与 <name> 是两个不同元素

工具全程在浏览器本地解析,接口返回的 XML 不会上传。

常见问题

转换有信息丢失吗?

XML 的注释、处理指令、CDATA 边界等细节会丢失,只保留元素、属性和文本。绝大多数数据转换足够用。

属性去哪了?

统一收进 @attributes 对象,反向生成 XML 时本工具不读这个字段,需要的话可自行处理。