JSON 格式化 / 压缩 / 校验JSON 转义 / 去转义JSON 对比JSON 键排序JSON 转字符串 / 字符串转 JSONJSON 转 XMLXML 转 JSONJSON 数组转 CSVCSV 转 JSON 数组JSON 与 YAML 互转JSON 生成代码定义查询参数与 JSON 互转Cookie 与 JSON 互转JSON 与 Properties 互转
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 / 解析失败 | 标签未闭合、多个根元素、或字符 & 未转义成 & |
| 中文变乱码 | 原始文件不是 UTF-8,或 <?xml encoding="..."> 声明与实际字节不符 |
| 内容缺一段 | 内容被包在 <![CDATA[...]]> 里,部分处理方式会忽略其内容 |
| 标签名对不上 | XML 大小写敏感:<Name> 与 <name> 是两个不同元素 |
工具全程在浏览器本地解析,接口返回的 XML 不会上传。
常见问题
转换有信息丢失吗?
XML 的注释、处理指令、CDATA 边界等细节会丢失,只保留元素、属性和文本。绝大多数数据转换足够用。
属性去哪了?
统一收进 @attributes 对象,反向生成 XML 时本工具不读这个字段,需要的话可自行处理。