我有一个Feed,但是我想要检索的是哪个值的项目中有一个:
。我该怎么办?
Feed:http://publishers.spilgames.com/rss?lang=en-US&tsize=1&format=xml&limit=100
foreach($xml->entry as $game) {
$it = $it+1;
$name = mysql_real_escape_string($game->title);
$link = $game->link[href];
$description = mysql_real_escape_string($game->media:description);
答案 0 :(得分:2)
将字符串换入{}
:
$description = mysql_real_escape_string($game->{'media:description'});
答案 1 :(得分:1)
这就是xml命名空间的前缀。 See this namespace tutorial
您实际上没有匹配前缀,您在前缀代表的命名空间上匹配。
如何执行此操作完全取决于您使用什么操作xml。你没有说你正在使用什么,但我猜你正在使用SimpleXML。
使用SimpleXML,默认情况下,对象访问树中只包含没有命名空间的节点。要获取命名空间元素,您需要明确要求它们:
$xml=simplexml_load_file('http://publishers.spilgames.com/rss?lang=en-US&tsize=1&format=xml&limit=100');
foreach($xml->entry as $game) {
$description = (string) $game->children('http://search.yahoo.com/mrss/')->description;
var_dump($description);
}
虽然它可能不是这种特殊情况下的最佳选择,但您也可以使用XPath更直接地匹配命名空间节点:
$xml=simplexml_load_file('http://publishers.spilgames.com/rss?lang=en-US&tsize=1&format=xml&limit=100');
$NS = array(
'media' => 'http://search.yahoo.com/mrss/',
);
foreach ($NS as $prefix => $uri) {
$xml->registerXPathNamespace($prefix, $uri);
}
foreach($xml->entry as $entry) {
// match the first media:description element
// get the first SimpleXMLElement in the match array with current()
// then coerce to string.
$description = (string) current($entry->xpath('media:description[1]'));
var_dump($description);
}
这是一个更完整的示例,它也会对您的代码进行一些修改。
$xml=simplexml_load_file('http://publishers.spilgames.com/rss?lang=en-US&tsize=1&format=xml&limit=100');
// This gets all the namespaces declared in the root element
// using the prefix as declared in the document, for convenience.
// Note that prefixes are arbitrary! So unless you're confident they
// won't change you should not use this shortcut
$NS = $xml->getDocNamespaces();
$games = array();
foreach($xml->entry as $entry) {
$mediaentry = $entry->children($NS['media']);
$games[] = array(
// to get the text value of an element in SimpleXML, you need
// explicit cast to string
'name' => (string) $entry->title,
// DO NOT EVER use array-access brackets [] without quoting the string in them!
// I.e., don't do "$array[name]", do "$array['name']"
// This is a PHP error that happens to work.
// PHP looks for a *CONSTANT* named HREF, and replaces it with
// string 'href' if it doesn't find one. This means your code will break
// if define('href') is ever used!!
'link' => (string) $entry->link['href'],
'description' => (string) $mediaentry->description,
);
}
$it = count($games); // there is no need for your $it+1 counter!
// $games now has all your data.
// If you want to insert into a database, use PDO if possible and prepare a query
// so you don't need a separate escaping step.
// If you can't use PDO then do:
// $escapedgame = array_map('mysql_real_escape_string', $thegame);