如何使用 PHP 缩小 XML?

Posted

技术标签:

【中文标题】如何使用 PHP 缩小 XML?【英文标题】:How to minify XML with PHP? 【发布时间】:2011-08-08 17:31:58 【问题描述】:

我有一个读取 XML 文件并使用 SimpleXML 修改它的 php 脚本。完成所有修改后,脚本会保存文件(大小 ~ 2.8 mb)。 我需要用 jQuery 加载这个 XML 文件,这需要相当长的时间。有没有办法压缩/缩小我的 XML 文件以减少我的 AJAX 调用中的加载时间。

更新:

XML 文件包含网页的 SVG(大型代谢图),因此它必须保留 XML 节点的所有内容。

【问题讨论】:

如果您想要更小的文件大小,可以尝试使用较少冗余的格式,如 json 甚至 bson。如果您想要更小的文件大小,则需要创建自己的特定二进制格式。 【参考方案1】:

编辑 OP 明确表示这是关于 SVG 文件的我写了我的答案。


如果您不绝对需要客户端上的所有 XML,请不要将 2.5MB 的 XML 传输到客户端(我怀疑您这样做)。更好的策略是像使用数据库一样使用 XML 文件:

在 PHP 中创建一个接受 XPath 表达式并仅返回 XML 的相关部分的代理页面。 使用 jQuery 发出 Ajax 请求,在必要时(即当用户触发操作时)获取这些相关部分。 使用 memcached 或其他缓存技术来防止在服务器上对每个请求进行完整的 XML 解析。 根据您的应用程序使用配置文件,也可以使用 memcached 来缓存单个 Ajax 响应。此外,设置 HTTP 缓存标头,以便客户端不会重新请求仍然有效的内容。 为 PHP Ajax 响应启用 gzip 压缩以节省响应时间和带宽。

那样做的工作要多一点。但它会提高速度——可能会提高几个数量级。

【讨论】:

我的 XML 包含我在用户提交表单后加载到我的网页(内联)的大型 SVG(SVG 文件根据表单数据用 PHP 修改)。所以我想我确实需要客户端上的所有内容......对吗? @Shvetusya:是的,这听起来像是规则的一个例外。 ;) 但是如果它“只是”一个图形,你为什么要用 jQuery 来解析它呢? — (不过,为传输启用 gzip 压缩是个好主意。XML 非常重复,因此对压缩响应很好。) 我必须让它“可缩放”,为图形元素添加工具提示,在鼠标悬停时突出显示等。基本上我一直在寻找一些东西来帮助我删除 XML 中的所有空白,因为我认为这将显着减少文件大小。 @Shvetusya:好吧,压缩也有助于留白。文件大小只是传输的问题,而不是解析的问题。根据您创建 SVG(库?)的方式,您可以尝试从一开始就阻止创建空白? 所以我想我应该尝试使用 PHP ZipArchive 压缩 XML,然后使用 this method 在 JS 中提取。我不是从头开始创建 SVG,而是修改现有文件的内容(没有 SVG 库),因此所有的空白都已经存在了。【参考方案2】:

不要将 2.5MB 的 XML 传输到客户端 - 期间。必须有更好的方法来做你想做的事情。也许您可以添加分页,这样您就不必同时加载所有结果 - 但可以根据需要只向客户端发送 20 个左右。

其次,不要使用 XML - 使用 JSON,因为它至少会小 20% 并且是 javascript 的原生格式,这将减少客户端处理。

【讨论】:

【参考方案3】:

如果有人有充分的理由缩小 XML 字符串文档,这里有一个可能的解决方案:

/** @var string $indentedXml */
$indentedXml = "...";

$dom = new DOMDocument("1.0");

// Preserve redundant spaces (`true` by default)
$dom->preserveWhiteSpace = false;

// Disable automatic document indentation
$dom->formatOutput = false;

$dom->loadXML($indentedXml);

/** @var string $minifiedXml  */
$minifiedXml = $dom->saveXML();

DOMDocument 文档:https://www.php.net/manual/en/class.domdocument.php

【讨论】:

以上是关于如何使用 PHP 缩小 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何轻松地在 PHP 中缩小 JS ......或其他

如何在 PHP 中解析 HTML 以进行缩小?

如何在 AS3 中最小化/缩小 XML 文档

如何缩小php页面html输出?

如何缩小/减少android中按钮的点击区域?

如何使用 PHP 删除所有 xml 属性值?