我正在从我们在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
(
)
还有其他方法可以访问我尚未找到的内容吗?
谢谢!
答案 0 :(得分:2)
xpath
返回simpleXMLElement
类型,该类型具有将其转换为字符串的功能。试试这个功能:
答案 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)
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 ,即元素名称有冒号(您可能已经做过,我无法从您的代码中看到它)。