我正在寻找一种方法,使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"