【问题标题】:Reading XML Nodes with :读取 XML 节点:
【发布时间】:2011-12-14 23:36:37
【问题描述】:

我有一个提要,但在我想检索谁的价值的项目中有一个 :。我该怎么办?

供稿: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);  

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    将字符串包裹在{}:

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

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

    【讨论】:

    • 感谢您的帮助。错误消失了。但是当我尝试获取 中的数据时,我似乎没有得到任何结果。
    • 这行不通,因为他正在处理 SimpleXML 中的命名空间(很可能),尽管关于变量变量的课程仍然有效。
    【解决方案2】:

    这就是所谓的 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);
    

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2014-12-21
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多