格式化输出 $SimpleXML->asXML();[复制]

Format output of $SimpleXML->asXML(); [duplicate]

提问人:Eli 提问时间:7/28/2009 最后编辑:Cave JohnsonEli 更新时间:8/7/2018 访问量:92866

问:

标题几乎说明了一切。

如果我有类似的东西(来自PHP网站示例):

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<movies></movies>
XML;

$sxe = new SimpleXMLElement($xmlstr);

$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character  = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');


echo("<pre>".htmlspecialchars($sxe->asXML())."</pre>");

die();

我最终输出了一个长字符串,如下所示:

<?xml version="1.0" standalone="yes"?>
<movies type="documentary"><movie><title>PHP2: More Parser Stories</title><plot>This is all about the people who make it work.</plot><characters><character><name>Mr. Parser</name><actor>John Doe</actor></character></characters><rating type="stars">5</rating></movie></movies>

这对于程序使用者来说很好,但对于调试/人工任务,有谁知道如何将其转换为漂亮的缩进格式?

php xml 格式化 simplexml

评论

0赞 Tim Sylvester 7/28/2009
在这里回答。
0赞 toraman 2/15/2017
我喜欢看到人们像我一样使用 heredocs,使用字符串中的语言作为名称

答:

81赞 Adam Wright 7/28/2009 #1

在 SimpleXMLElement 的 PHP 手册页上的注释中提供了各种解决方案。效率不是很高,但肯定很简洁,是 Anonymous 的解决方案

$dom = dom_import_simplexml($simpleXml)->ownerDocument;
$dom->formatOutput = true;
echo $dom->saveXML();

PHP 手册页注释通常是满足常见需求的良好来源,只要您首先过滤掉明显错误的内容即可。

评论

2赞 drzaus 7/15/2014
根据 @karka91 在“原始问题”中的评论,您必须在导入 XML 之前声明 +config,因此可以正常工作DOMDocument
66赞 Bidders 4/29/2013 #2

以上对我不起作用,我发现这有效:

$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($simpleXml->asXML());
echo $dom->saveXML();

评论

8赞 MirroredFate 6/13/2014
应将最后一行 () 更改为:echoecho "<pre>".htmlentities($dom->saveXML())."</pre>";
4赞 Ryan Rentfro 7/12/2015
我正在使用它,并且在输出内容类型的正确标头时不需要 pre 标记。header('内容类型:text/xml');
4赞 RockTheShow 9/22/2015
@MirroredFate 你让它看起来像浏览器中的 XML,但你输出的是 HTML......如果 OP 使用 CLI PHP 怎么办?如果 OP 想要输出到文件怎么办?
0赞 RockTheShow 9/22/2015
@RyanRentfro HTTP 服务器或浏览器会自动添加前导码(ctrl+u 实际上是浏览器解析后的页面源)。这并不意味着你一开始就不应该干净地指定它。
0赞 MirroredFate 9/23/2015
@Léo 在 OP 的问题中,他将输出包装在标签中,这向我表明他正在将其输出到浏览器。但你是对的,如果你的 stdout 是 cli,你就不会想要/需要标签。<pre>pre
9赞 naxrohan 10/7/2015 #3

找到了类似的解决方案...格式化原始 XLM 数据..根据我的请求__getLastRequest__getLastResponse,为了快速调试 XML,我将其与 google-code-prettify 结合使用。php SOAP

如果您想格式化敏感的 xml 数据并且不想在线进行,这是一个很好的解决方案。

下面的一些示例代码,可能对其他人有所帮助:

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($data); //=====$data has the raw xml data...you want to format

echo '<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>';

echo "<br/> <pre class=\"prettyprint\" >". htmlentities($dom->saveXML())."</pre>";

下面是我得到的格式化 XML 输出的示例:

注意:格式化的 XML 在 中可用,并且可以使用 php 文件写入直接保存到 xml 文件中。$dom->saveXML()

Formatted XML Output

评论

0赞 vladkras 10/27/2016
跳过我使用的标签,我知道这并不酷,反正它只是为了调试目的而美化SOAP-ENV:EnvelopeSOAP-ENV:Body$dom->saveXML($dom->firstChild->firstChild->firstChild)