使用DOMDocument生成的带换行符的XML

4

我正在使用PHP DOMDocument创建XML文件,但是这些XML文件不能包含换行符。

但是当我使用"saveXML()"方法时,生成的XML在定义和初始标记之间带有换行符,就像这样:

<?xml version="1.0" encoding="UTF-8"?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe...

我能在DOMDocument中纠正这个问题吗?还是我必须在生成XML后进行纠正?

我想纠正这个问题,以获得如下结果:

<?xml version="1.0" encoding="UTF-8"?><NFe xmlns="...

1
为什么有没有换行符很重要? - Gordon
1
我正在使用这些XML与Web服务进行通信。但是这个Web服务不接受换行符(尽管应该接受)。 - Paulo Coghi
这是巴西政府的电子发票系统。每个省份都有一个网络服务。在我所在的省份,这个网络服务存在问题。 - Paulo Coghi
@Paulo 是的,但是 Web 服务是否需要发送 <?xml version="1.0" encoding="UTF-8"?>?它是否接受以根元素开头的实际文档?没有前言。因为使用 DOMDocument 完全可以将其删除。 - Gordon
2
说实话,我会联系服务的维护者,并要求他们修复实现中的那个漏洞。 - Gordon
显示剩余2条评论
1个回答

3
默认情况下,DOMDocument::$preserveWhiteSpace 为 true。尝试将其设置为 false,然后再次调用 saveXML。这可能会产生副作用,如果文档内部的任何空格实际上很重要。您还应确保 DOMDocument::$formatOutput 为 false。
正如Gordon所说,没有任何逻辑原因限制空白。但是,如果您不希望有任何空格,请确保您想保留的任何CR/LF字符都是实体编码的,然后使用$nonewlines = preg_replace("/[\r\n]/", '', $xml)来删除在关闭Preserve和Format后可能仍然存在的换行符。但再次强调,这是愚蠢的。

1
这不会删除Prolog后的换行符,如果我没记错的话。 - Gordon
2
是时候使用正则表达式了! - Charles
1
那么只有prolog有换行符吗?如果是这样,你可以手动将其中一个换行符删除,而不会产生任何副作用。您没有指示文档的其余部分是否具有任何格式或意外的空格。(快速查看XML规范并未指示prolog后面的换行符是必需的,尽管在示例中它们似乎总是有一个。) - Charles
感谢@Charles和@Gordon!你们帮助我得出结论,DOMDocument无法单独解决这个问题。非常感谢 :) - Paulo Coghi
@Charles 其余部分文档都没问题。 :) - Paulo Coghi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接