如何在SimpleXML对象中访问此数字元素?

时间:2014-12-15 15:21:11

标签: php xml xpath simplexml

我正在从我们在Web应用程序中使用的数据源解析XML,而且我在访问XML中特定部分的数据时遇到了一些问题。

首先,这是我{I}尝试访问的内容print_r的输出。

SimpleXMLElement Object
(
    [0] => 
This is the value I'm trying to get

)

然后,这是我想要获取的XML。

<entry>    
    <activity:object>
        <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
        <id>542</id>
        <title>
        Title string is a string
        </title>
        <content>
        This is the value I'm trying to get
        </content>
        <link rel="alternate" type="html" href="#"/>
        <link rel="via" type="text/html" href="#"/>
    </activity:object>
</entry>

内容元素就在我之后。

当我使用$post->xpath('activity:object')[0]->content访问它时,我最终得到了上面的内容。

我已尝试使用$zero = 0;以及->content->{'0'}来访问此元素,但每次我只返回一个空的SimpleXML对象,如下所示。

SimpleXMLElement Object
(
)

还有其他方法可以访问我尚未找到的内容吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

xpath返回simpleXMLElement类型,该类型具有将其转换为字符串的功能。试试这个功能:

http://php.net/manual/en/simplexmlelement.tostring.php

答案 1 :(得分:1)

您应该只能直接访问它:

$content = $post->xpath('//content');

echo $content[0];

使用PHP 5.4或更高版本,您可以这样做:

$content = $post->xpath('//content')[0]; 

或者,如果您将XML转换为字符串,如@kkhugs,您可以使用

/**
 * substr_delimeters
 *
 * a quickly written, untested function to do some string manipulation for
 * not further dedicated and unspecified things, especially abused for use
 * with XML and from http://stackoverflow.com/a/27487534/367456
 *
 * @param string $string
 * @param string $delimeterLeft
 * @param string $delimeterRight
 *
 * @return bool|string
 */
function substr_delimeters($string, $delimeterLeft, $delimeterRight)
{
    if (empty($string) || empty($delimeterLeft) || empty($delimeterRight)) {
        return false;
    }

    $posLeft = stripos($string, $delimeterLeft);
    if ($posLeft === false) {
        return false;
    }

    $posLeft += strlen($delimeterLeft);

    $posRight = stripos($string, $delimeterRight, $posLeft + 1);
    if ($posRight === false) {
        return false;
    }

    return substr($string, $posLeft, $posRight - $posLeft);
}

$content = substr_delimeters($xmlString, "<content>", "</content>");

答案 2 :(得分:0)

对于 SimpleXMLElement

print_r总是会产生误导。您拥有的输出例如:

代码参考:

$testate = $post->xpath('activity:object')[0]->content;
print_r($testate);

输出:

SimpleXMLElement Object
(
    [0] => 
This is the value I'm trying to get

)

这并不意味着您需要使用数组索引零([0])来访问您正在查找的文本。实际上,虽然它并不意味着,但这并不意味着它是不可能的。令我感到困惑,我知道。

但是,您正在寻找字符串值,而不是对象(值)。你需要做的就是转换成字符串:

$testate = $post->xpath('activity:object')[0]->content;
$text    = (string) $testate;
           ########

这里的重要部分实际上是对字符串的强制转换。就像print_r已经向您建议的那样,使用零索引也会起作用:

$text    = (string) $testate[0];

但零指数不是必需的,只有内部信息。

与您保持联系非常重要:不要依赖print_r SimpleXMLElement 。它是一个对象,print_r只是在这里告诉你它是一个,它有哪个名称(它是哪个对象类型),在大括号内输出的其余部分是该对象的内部信息。它永远不是您拥有的XML的全貌。即使它第一次看起来如此。

  

所以这里只是大警告,记住这一点。考虑转换为字符串(或使用字符串函数,如trim()),你没事。

另外,请不要忘记阅读PHP手册中的Basic SimpleXML usage

P.S。:正如另一个答案所示,你不是唯一一个有问题来描述SimpleXML的神奇本质的人。

PPS:您可能希望尽快了解 XML-Namespaces ,即元素名称有冒号(您可能已经做过,我无法从您的代码中看到它)。