Php 强制SimpleXML对象为字符串,而不考虑上下文

Php 强制SimpleXML对象为字符串,而不考虑上下文,php,xml,simplexml,Php,Xml,Simplexml,假设我有一些这样的XML <channel> <item> <title>This is title 1</title> </item> </channel> $foo = array( sprintf("%s",$xml->channel->item->title) ); 这是我的问题。下面的代码没有将标题视为该上下文中的字符串,因此我最终在数组中使用了一个SimpleXML对象,而不

假设我有一些这样的XML

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>
$foo = array( sprintf("%s",$xml->channel->item->title) );
这是我的问题。下面的代码没有将标题视为该上下文中的字符串,因此我最终在数组中使用了一个SimpleXML对象,而不是字符串

$foo = array( $xml->channel->item->title );
我一直在这样做

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>
$foo = array( sprintf("%s",$xml->channel->item->title) );
但这看起来很难看

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

将SimpleXML对象类型转换为字符串:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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

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

您可以使用PHP函数

strval();

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

要将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>";
要得到孩子,只需执行以下操作:

$foo = array( $xml->channel->item->title."" );
您可以将$xml->扩展到每个级别,直到得到所需的内容 也可以将所有节点放入一个数组中,而不使用级别或
你可以用任何其他方式来做。

另一种丑陋的方式:

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

它可以工作,但并不漂亮。

有一种原生的SimpleXML方法 根据参数,它将SimpleXMLElement写入xml 1.0文件或仅写入字符串:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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

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

string(15) "This is title 1"

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

尝试strval$xml->channel->item->title

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

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

不确定他们是否更改了_u-toString方法的可见性,因为已编写了接受的答案,但此时它对我来说效果很好:

var\u dump$xml->channel->item->title->\uu toString; 输出:


存在本机SimpleXML方法SimpleXMLElement::asXML,这取决于它将SimpleXMLElement写入xml 1.0文件的参数,是的


把钥匙放好。在任何变量之前,它将转换为字符串


$foo=数组$xml->channel->item->title

这比使用sprintf更干净。我喜欢它注意到,使用一个接受字符串参数的函数将自动执行这种类型的强制转换,例如echo、str_replace、substr。$foo=string$xml->channel->item->title;这就是我要找的,因为我不需要数组。谢谢。+100你让我今晚过得很愉快!我是SimpleXMLObject的新手,我从中提取的变量在屏幕上“打印”得很好,但我的DB查询失败了……唉!什么时候开始严格输入PHP-@megaSteve4从什么时候开始严格输入PHP这正是因为不需要这样做:大多数函数没有定义的类型上下文,因此无法隐式转换为该类型。当然,它们可以显式地强制转换输入参数,这就是substr等人工作的原因。不过,尽早执行强制转换更安全,这样您就知道所有函数都会看到它们期望的数据。@Mark Biek:它确实适用于已实现uu-toString的对象,尤其是在这种情况下,它非常适用于SimpleXMLElement类型的对象。您可以将其与接受答案中的字符串进行比较。strval是一个方便的回调函数,通常与and或simplexmlement::xpath结合使用。我已经向PHP提交了多个请求,以实现类似于SOAP\u SINGLE\u ELEMENT\u数组的功能,并鼓励其他人也这样做。SOAP_SINGLE_ELEMENT_数组强制将/可能/包含多个字符串的元素始终解析为字符串。当然,正如其他人提到的那样,您需要知道您得到了什么,但是我一次又一次地遇到了.NET SOAP服务器的问题,而.NET的神奇的WSDL默认将每个字符串原型化为混合字符串或字符串数组。而不是当前的“ing”或类型转换,位只是返回一个stringI get调用一个未定义的函数asXML,所以我猜这已经过时了?@Eoin-Hmm。。。刚刚测试了我的示例,它在原生PHP7.3安装中仍然可以正常工作。我一定遇到了与它们不同的问题。我道歉。我现在解决了我的问题:
$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());