XML第一次差点毁了我的下午,那是来自支付网关的SOAP响应 一行一万一千个字符 没有换行符,没有缩进,只是一个完整的角括号墙,我的终端包裹在无法读取的砖块里 某处有一个单一的错误元素导致签名不匹配,我应该通过眼睛找到它 从那时起我已经构建了很多东西 - WordPress插件,Laravel API,[toolz。dev]背后的React工具(/- 我可以告诉你,一个好的XML格式化程序是那些安静的实用程序之一,直到你盯着一堵标签墙,后面有一个截止日期。
本指南是我希望那天下午吃到的指南。它涵盖了 XML 格式化程序实际执行的操作、为什么美化和最小化是同一枚硬币的两面、使格式化安全的空格规则以及几乎占每个 "为什么获胜't 这段解析"时刻的少数验证错误。您可以在浏览器中免费关注 XML格式化程序 - 它完全在您的机器上运行,因此即使是支付有效负载也不会离开您的笔记本电脑。
TL;博士: XML格式化程序重写文档's微不足道的空白- 空间 之间 tags - 不触碰它的含义 Beautify 添加了换行符和缩进,这样你就可以读取层次结构; minify 将其全部剥离,这样文件就尽可能小 一个好的格式化程序保留注释、CDATA、XML 声明和属性顺序,并沿途验证格式良好(匹配标签、封闭元素、终止部分)。它确实如此 不是 DTD 或 XSD 模式检查您的文档 - 这是一项不同的工作。
XML格式化程序实际上是做什么的?
白空是格式化变得有趣的地方,因为 XML 1.0 器(passing),才能将元素内部的每个字符传递给应用程序- 这就是为什么格式化程序必须知道它可以安全触摸什么,在其核心,一个XML格式化程序将你的文档解析成节点树- 元素、文本、注释、CDATA部分、处理指令- 然后将那棵树以一致的间距向外序列化,那次往返就是整个技巧,因为工具了解结构而不是盲目查找和替换,所以它可以缩进一个深层嵌套 <order><items><item> 正确地链接,将每个兄弟姐妹放在自己的行上,并知道里面的文本 <price>44.95</price> 应与其标签保持在同一行,而不是跨越三个。
这很重要的原因归结为埋藏在 XML 规范中的规则:元素之间的大部分空格是 微不足道。当解析器读取时 <a>\n <b/>\n</a>、周围的换行符和空间 <b/> are there for human,不携带任何数据,允许格式化程序自由添加、删除或更改空白,它绝对不能触碰的是 显着 whitespace - 文本节点内的字符,例如 <note>Call me at 9am</note>CDATA 块内的任何东西- 因为那个内容是真正的数据。每一个格式化决定的 XML格式化程序 源于尊重这条线。
So美化不是美容绒毛,当你重新缩进那块一万一千字的SOAP砖,元素层次就变得可见,突然错位了 <Amount> node 三层太深是显而易见的,格式化是一个调试工具,就像一个可读性工具一样。
为什么我会最小化 XML 而不是美化它?
Beautify 和 minify 是指向相反方向的同一引擎。Beautify 为人类添加了空白; minify 为机器删除它。当大小或运输问题时,您可以伸手去 minify:缩小移动应用程序捆绑包内发货的配置文件、在请求主体通过缓慢连接之前对其进行修剪,或者标准化文档,以便可以逐字节比较两个版本,而不会妨碍缩进噪声。
保存是真实的,但很少是戏剧性的。XML's冗长存在于其重复的标签名称中,而不是其空白,因此最小化通常会在百分之五到百分之二十之间进行修剪,这取决于原始缩进的程度。这是值得的,但如果您需要严重的压缩,则在电线上进行 gzip 做得更多 - 最小化然后 gzipping 是许多 API 使用的皮带和支撑方法。
以下是我决定指向工具的方式时使用的心理模型:
| 情况 | 美化 | 最小化 |
|---|---|---|
| 通过眼睛读取或调试响应 | 是的 | 否 |
| 将配置文件提交到版本控制 | 是(干净的差异) | 否 |
| 在应用程序捆绑包内或通过网络运输 XML | 否 | 是的 |
| 将许多小文档存储在数据库列中 | 否 | 是的 |
| 为字节间差异准备文档 | 要么,始终如一 | 要么,始终如一 |
| XML交给另一个开发人员 | 是的 | 否 |
关键学科是一致性,如果你正在区分两个文档,就运行 两者 首先通过相同的模式和相同的选项 - 否则您将比较缩进样式,而不是内容。
格式化如何避免更改我的数据?
这就是每个格式化程序都必须摆脱的焦虑: "如果这个工具重写了我的 XML,我怎么知道它没有悄悄破坏某些东西? "诚实的答案是,构建良好的格式化程序只会改变标签之间的空白,并且严格地单独留下四件事。
第一个是 文本内容.元素内部的字符是逐字复制的,那就包括实体- 字面意思 & 留下来 &,它永远不会被帮助解码为 & (这将产生无效的XML)或双编码到 &amp;. X = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 = 1000 XML格式化程序 将您的文本视为不透明,这正是您想要的。
第二个是 CDATA 部分. A <![CDATA[ ... ]]> block 的存在正是这样,你就可以丢弃原始的、未转义的内容- JavaScript 的一个片段、HTML 的一块、充满的字符串 < 並 & - 进入一个 XML 文档而不转义。格式化程序会完全按照它找到的内容发出该内容,不会转义,不会在块内重新缩进。
第三个是 评论和声明. 评论(<!-- ... -->),the <?xml version="1.0"?> declaration,并且任何处理指令都保留下来并合理放置,当你想要一个更精简的文件时,你可以选择剥离注释,但那是你的决定,而不是工具在背后做的事情。
第四是 属性顺序和引用。默认情况下,格式化程序会按照您编写的顺序保留您的属性,并使用您使用的引用样式,因为 XML 规范将属性顺序视为无关紧要,并且没有理由将其创建为"当您" 做 想要规范的排序 - 用于更干净的差异,或比较以不同顺序携带相同属性的两个元素 - a "对属性进行排序;选项按字母顺序为您排列它们。
JavaScript中因为所有这些都运行客户端,所以也存在隐私红利:一个充满连接字符串、内部标识符或客户记录的文档在您自己的机器上格式化,并且从未上传。如果您关心将工作数据与其他人保持距离'的服务器 - 而且您应该 - 该模型值得理解,我在其中写了更多关于它的内容 在线工具的数据隐私指南。
格式化程序捕获哪些 XML 错误?
Formatter 能够漂亮地打印任何东西之前,它必须解析文档,解析就是有用的验证发生的地方,这就是 良好的形态 查 - 每个XML文档必须遵守的结构规则 - 根据我的经验,三个错误占了绝大多数失败。
到目前为止最常见的是 a 裸露的安培沙。XML 储备 & 启动一个实体,所以原始 & 在文本中 - 通过 URL 潜入的类型 ?a=1&b=2 or "标记&斯宾塞"这样的公司名称- 使解析器期望一个实体名称,然后在找不到实体名称时扼杀。修复的是写 &并且一条好的错误消息会将您指向该线路,这样您就不会盲目狩猎。
第二个是a 标签不匹配或未关闭.打开一个 <div> 并将其关闭 </section>或者打开一个 <span> and never close it at all, and the document is not been well-formed。formatter tracks the open-element stack as it parses, so it can tell you excellent which tag it expected to see closed and which one it actually finded。that single message - "expected </book> 但找到了 </author> 14行"-通常足以在几秒钟内解决问题。
第三个是 未终止的部分:开头的评论 <!-- 那永远达不到 -->的,或者一个永远达不到的CDATA区块 ]]>。这些很容易在你手工编辑时创建,删除得有点过多。再次,格式化程序报告了失控部分开始的行。
格式化程序的作用 不是 do 是根据模式检查您的文档。格式良好的询问 "这个结构上有效的 XML 吗?"有效性询问 "这个 XML 是否遵循以下规则 我的特别 document 类型 - 正确的元素,按正确的顺序,具有正确的数据类型 - 由 DTD 或 XSD?" 定义的那些是单独的层。文档可以完美地格式化良好,并且对于其预期目的来说仍然是无稽之谈。模式验证需要模式,而那是一个不同的格式化程序,它保证了第一层,这是阻止解析器崩溃的层。
如何在编辑器中格式化 XML 或构建流水线?
浏览器工具是一次性文档的最快路径,但值得了解替代方案,以便您可以选择适合该工作的替代方案。
大多数编辑器都本机格式化 XML。在 VS Code 中,内置的 "格式化文档"命令 (Shift+Alt+F) 处理 XML,并且像 Red Hat's XML 语言服务器这样的扩展在顶部添加了模式感知格式化。IntelliJ 及其兄弟姐妹使用 Ctrl+Alt+L 重新格式化。当文件在您面前已经打开时,这些都是理想的选择。
在命令行上, xmllint --format file.xml (libxml2 的一部分,它发货在大多数 Unix 系统上)美化,以及 xmllint --noblanks file.xml 让您接近最小化输出。在 Node 项目中,库喜欢 xml-formatter 或 prettier XML插件插槽进入构建步骤。Python开发人员伸手去做 xml.dom.minidom.parseString(s).toprettyxml()尽管要警告,但它因在现有空白周围添加额外的空白线而臭名昭著。
那么为什么要使用 XML格式化程序 at all?三个原因我不断地回来,它不需要安装,不需要配置,不需要项目 - 你粘贴和去它保留了你的机器上的数据,这在XML是真正的有效负载而不是玩具示例时很重要,并且它自然地与相邻的工具配对:一旦你的XML干净和有效,将其转换为JSON与 XML 到 JSON 转换器 一键点击,反向跳过 json 到 xml 使用相同的约定。如果您的一天主要是 JSON,则 json格式化程序 是该格式的等效项,并且整个系列都编入目录 web开发人员工具包。
我应该何时格式化而不是转换我的 XML?
我从较新的人那里得到的一个问题是:如果 JSON 更容易阅读,为什么要格式化 XML 而不是仅仅转换它?答案是格式化和转换可以解决不同的问题。
需要时进行格式化 保持 XML - 因为 SOAP 端点需要它,因为 RSS 或 Atom 源根据定义是 XML,因为您的配置文件、Android 布局或 Maven pom.xml simply 是 XML,永远都是。格式化使 XML 可读或紧凑,同时将其保留为 XML。下游无需更改。
当您想转换时 以不同的格式处理数据 - 将值拉入 JavaScript 前端,将提要加载到会说 JSON 的系统中,或者将多个源标准化为一个形状。转换会改变格式,随之而来的是一些保真度:XML 属性、混合内容和元素排序没有干净的 JSON 等效项,因此转换器会故意做出选择(属性成为前缀键,重复标签成为数组),在依赖它们之前您应该理解这些选择。
My rule of thumb: format first, always。clean, 验证过的文档更容易推理你的下一步是编辑它, 差异化它, 还是转换它。格式化是廉价, 安全,无损的操作;转换是有损的你做一旦你知道结构是健全的。站点地图是一个很好的例子XML你格式而不是转换-如果你正在构建一个, 专用 站点地图生成器 直接产生有效、格式良好的输出。
常见问题
如何在线格式化 XML?
将 XML 粘贴到输入面板中,选择美化,选择缩进宽度,然后单击“格式”。 该工具解析文档,重新缩进,并允许您复制或下载结果。 所有处理都在您的浏览器中进行 - 没有上传任何内容。
美化和缩小XML有什么区别?
Beautifying 增加了换行和缩进,因此元素层次结构易于阅读,非常适合编辑和调试最小化删除标签之间的所有空白以产生尽可能小的文件,非常适合存储或通过网络发送两者都保留文档's的含义;只有微不足道的空白变化。
格式化会改变我的xml的含义吗?
不 。 仅更改了标记之间的空格 - 元素、属性、文本内容、注释和 cdata 不变。 由于文本节点和 CDATA 中保留了大量空白,因此格式良好的文档在格式化之前和之后的行为相同。
是否保留了评论和 CDATA 部分?
Yes。comments,CDATA 部分,XML 声明,处理说明都保留下来,评论与他们坐在一起的元素一起缩进,CDATA 内容逐字发出,没有任何转义,如果你想要一个更精简的输出,也可以选择剥离注释。
这个工具可以验证我的 XML 吗?
是的。 在格式化之前,文档被完全解析,结构问题 - 一个未关闭的元素,与其打开标记不匹配的结束标记,或未终止的注释或 cdata 部分 - 报告的是行号,以便您可以快速修复它们。 它检查格式良好,而不是对 DTD 或 XSD 模式的有效性。
为什么我的 XML 无法格式化?
Failurs几乎都是格式良好的错误,最常见的是文本中的裸Ampersand(必须写成实体,或者解析器读作实体的开头),不匹配它关闭的元素的闭包标签,以及打开但从未关闭的错误信息指向该行,这样你就可以直接跳到它。
格式化包含敏感数据的 XML 是否安全?
是的。 解析器完全在您的浏览器中以 JavaScript 运行 - 没有网络请求携带您的数据,没有任何记录或存储,并且该工具一旦加载就可以脱机工作。 保存 XML 的 API 密钥、连接字符串或客户记录永远不会离开您的计算机。
之后我可以将格式化的 XML 转换为 JSON 吗?
是的。 一旦 XML 干净且有效,XML 到 JSON 转换器将其转换为等效的 JSON,将属性映射到前缀键和重复标记到数组。 格式化首先使结构变得明显,这有助于您在转换之前了解它将如何映射。
Liton编写的-toolz。dev的构建者,WP管理,以及一长串的Laravel和React项目,这里提到的每个工具都可以在你的浏览器中免费且完全运行在[toolz。dev](/。



