URL解码php中xml文档中的所有值


URL decode all values in xml document in php

我正在寻找一种方法,使simplexml_load_string返回一个所有文本值都经过url解码的文档。例如:

$xmlstring = "<my_element>2013-06-19+07%3A20%3A51</my_element>";
$xml = simplexml_load_string($xmlstring);
$value = $xml->my_element;
//and value would contain: "2013-06-19 07:20:51"

有可能做到这一点吗?我不关心属性值,尽管如果它们也被解码也没关系。

谢谢!

您可以运行

$value = urldecode( $value )

它将解码你的字符串。

请参阅:http://www.php.net/manual/en/function.urldecode.php

只要每个值都在自己的元素内(在SimpleXML中,您不能单独处理文本节点,请与中的表进行比较哪些DOMNode可以由SimpleXMLElement表示?),这是可能的。

正如其他人所概述的,这是通过在每个元素上应用urldecode函数来实现的。

要做到这一点,您需要更改并添加一些代码行:

$xml = simplexml_load_string($xmlstring, 'SimpleXMLIterator');
if (!$xml->children()->count()) {
    $nodes = [$xml];
} else {
    $nodes = new RecursiveIteratorIterator($xml, RecursiveIteratorIterator::LEAVES_ONLY);
}
foreach($nodes as $node) {
    $node[0] = urldecode($node);
}

这个代码示例注意处理每个leaf,在这种情况下,只处理根元素。之后,整个文档将被更改,以便您可以按已知方式访问它。演示:

<?php
/**
 * URL decode all values in XML document in PHP
 * @link https://stackoverflow.com/q/17805643/367456
 */
$xmlstring = "<root><my_element>2013-06-19+07%3A20%3A51</my_element></root>";
$xml = simplexml_load_string($xmlstring, 'SimpleXMLIterator');
$nodes = $xml->children()->count()
            ? new RecursiveIteratorIterator(
                    $xml, RecursiveIteratorIterator::LEAVES_ONLY
              )
            : [$xml];
foreach ($nodes as $node) {
    $node[0] = urldecode($node);
}
echo $value = $xml->my_element; # prints "2013-06-19 07:20:51"