无论上下文如何,都将SimpleXML对象强制为字符串


78

假设我有一些这样的XML

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>

下面的代码实现了我想要的功能,它将标题输出为字符串

$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;

这是我的问题。下面的代码在该上下文中未将标题视为字符串,因此我最终在数组中使用了SimpleXML对象而不是字符串。

$foo = array( $xml->channel->item->title );

我一直在这样解决

$foo = array( sprintf("%s",$xml->channel->item->title) );

但这看起来很丑。

无论上下文如何,将SimpleXML对象强制为字符串的最佳方法是什么?


我已经向PHP提交了多个请求,以实现类似于SOAP_SINGLE_ELEMENT_ARRAYS的操作,并鼓励其他人也这样做。SOAP_SINGLE_ELEMENT_ARRAYS强制将/ could /持有多个字符串的元素始终解析为字符串。当然,正如其他人提到的那样,您需要知道您要获得的收益,但是一次又一次,我遇到了.NET SOAP服务器的问题,WSDL所用的.NET SOAP服务器(通过.NET的“魔术”默认值)将每个字符串原型化为混合或字符串数​​组。代替current()或类型转换,该位只是返回一个字符串
conrad10781

Answers:


151

将SimpleXMLObject类型转换为字符串:

$foo = array( (string) $xml->channel->item->title );

上面的代码在内部调用__toString()SimpleXMLObject。该方法不是公开可用的,因为它会干扰SimpleXMLObject的映射方案,但仍可以按上述方式调用。


这比使用sprintf更干净。我喜欢
Mark Biek

5
请注意,使用接受字符串参数的函数将自动进行此类型转换(例如echo,str_replace,substr)。
罗斯,2009年

3
$ foo =(字符串)$ xml-> channel-> item-> title; 是我一直在寻找的东西,因为我不需要数组。谢谢。
Drazisil

1
+100,您刚刚度过了我的夜晚!对SimpleXMLObject而言,这是我的新手,我从中提取的变量可以在屏幕上“打印”得很好,但是我的数据库查询失败了。从什么时候开始严格键入PHP?;-)
megaSteve4 2012年

1
@ megaSteve4“自从什么时候开始严格键入PHP?” -正是因为这不是必需的:大多数函数没有定义的类型上下文,因此不能隐式转换为该类型。当然,他们可以显式地转换其输入参数,这就是为什么substr等人工作的原因。尽早进行转换是比较安全的,所以您知道所有函数都会看到他们期望的数据。
IMSoP

22

您可以使用PHP函数

strval();

此函数返回传递给它的参数的字符串值。


3
@Mark Biek:它确实适用于已__toString()实现的对象,尤其是在这种情况下,尤其适用于type对象SimpleXMLElement。您可以将其与string接受的答案中的演员表进行比较。strval()是经常与array_map()iterator_to_array($simpleXMLElement, false)或结合使用的便捷回调函数SimpleXMLElement::xpath()
hakre

9

有一个本地的SimpleXML方法SimpleXMLElement :: asXML 根据参数将SimpleXMLElement写入xml 1.0文件或仅写入字符串:

$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename);    // to a file
echo $xml->asXML();             // to a string

我收到对未定义函数asXML的调用,所以我猜这已经过时了吗?
Eoin

1
@Eoin Hmm ...刚刚测试了我的示例,它在本机php 7.3安装中仍然可以正常工作
Mixed Case

他们一定有其他问题。我很抱歉。我现在解决了问题:)
Eoin

3

另一种丑陋的方式来做到这一点:

$foo = array( $xml->channel->item->title."" );

它可以工作,但不是很漂亮。


3

接受的答案实际上返回一个包含字符串的数组,这与OP要求的不完全相同(字符串)。要扩展该答案,请使用:

$foo = [ (string) $xml->channel->item->title ][0];

它返回数组的单个元素,即字符串。


2

要将XML数据放入php数组,请执行以下操作:

// this gets all the outer levels into an associative php array
$header = array();
foreach($xml->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($header);
echo "</pre>";

要得到一个孩子,只需执行以下操作:

$data = array();
foreach($xml->data->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($data);
echo "</pre>";

您可以在每个级别上展开$ xml->,直到获得所需的内容。您也可以将所有节点放入一个没有级别的阵列,或者几乎用任何其他方式。



0

__toString()自从编写了接受的答案以来,不确定它们是否改变了方法的可见性,但是这对我来说很好用:

var_dump($xml->channel->item->title->__toString());

输出:

string(15) "This is title 1"

0

有本机SimpleXML方法SimpleXMLElement :: asXML根据参数将SimpleXMLElement写入xml 1.0文件,是

$get_file= read file from path;
$itrate1=$get_file->node;
$html  = $itrate1->richcontent->html;


echo  $itrate1->richcontent->html->body->asXML();
 print_r((string) $itrate1->richcontent->html->body->asXML());

0

只需输入“。在任何变量之前,它将转换为字符串。

$ foo = array(''。$ xml-> channel-> item-> title);


-1

以下是一个递归函数,它将所有单子元素类型转换为String

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION - CLEAN SIMPLE XML OBJECT
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function cleanSimpleXML($xmlObject = ''){

    // LOOP CHILDREN
    foreach ($xmlObject->children() as $child) {

        // IF CONTAINS MULTIPLE CHILDREN
        if(count($child->children()) > 1 ){

            // RECURSE
            $child = cleanSimpleXML($child);

        }else{

            // CAST
            $child = (string)$child;

        }

    }

    // RETURN CLEAN OBJECT
    return $xmlObject;

} // END FUNCTION
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.