0

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

$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"

是否有可能做到这一点?我不关心属性值,尽管如果它们也被解码就可以了。

谢谢!

4

2 回答 2

0

你可以跑

$value = urldecode( $value )

这将解码你的字符串。

见:http ://www.php.net/manual/en/function.urldecode.php

于 2013-07-23T09:06:53.787 回答
0

只要每个值都在其自己的元素内(在 SimpleXML 中,您不能单独处理文本节点,请与表中的表格进行比较,其中 DOMNodes 可以由 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);
}

此代码示例注意处理每个请假,以防万一,仅处理根元素。之后,整个文档将被更改,以便您可以按已知方式访问它。演示

<?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"
于 2013-07-23T11:41:49.587 回答