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对象类型转换为字符串:

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

上面的代码在SimpleXMLObject上内部调用
\uuu 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>";
//这会将所有外部级别放入一个关联的php数组中
$header=array();
foreach($xml->children()作为$child)
{
$header[$child->getName()]=sprintf(“%s”,$child);
}
回音“\n”;
打印(页眉);
回声“;
要得到孩子,只需执行以下操作:

$foo = array( $xml->channel->item->title."" );
$data=array();
foreach($xml->data->children()作为$child)
{
$header[$child->getName()]=sprintf(“%s”,$child);
}
回音“\n”;
打印(数据);
回声“;
您可以将$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 );
$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());

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

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

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

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

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


$foo=数组(“”.$xml->channel->item->title)

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