读取XML节点:

时间:2011-12-14 23:36:37

标签: php xml simplexml

我有一个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);  

2 个答案:

答案 0 :(得分:2)

将字符串换入{}

$description = mysql_real_escape_string($game->{'media:description'});

请参阅:Strings: Complex (curly) syntaxVariable variables

答案 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);