Php 当foreach循环可以';由于冒号,无法输入

Php 当foreach循环可以';由于冒号,无法输入,php,xml,rss,feed,Php,Xml,Rss,Feed,在你击落我之前,给我一分钟。我一直在寻找答案——问题出在这里 我有一个外部XML/RDF文件,它必须用这个结构进行解析 <?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rss="http://purl.org/rss/1.0/" xmlns:os="http://a9.com/-/spec/opensea

在你击落我之前,给我一分钟。我一直在寻找答案——问题出在这里

我有一个外部XML/RDF文件,它必须用这个结构进行解析

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:rss="http://purl.org/rss/1.0/"
 xmlns:os="http://a9.com/-/spec/opensearch/1.1/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:dcterms="http://purl.org/dc/terms/"
 xmlns:bibo="http://purl.org/ontology/bibo/">

 <rss:channel rdf:about="http://domain.com/feed/">
  <rss:link rdf:resource="http://domain.com/feed/items.rss" />
  <rss:title>Search Results</rss:title>
  <os:startIndex>0</os:startIndex>
  <os:itemsPerPage>10</os:itemsPerPage>
  <os:totalResults>13</os:totalResults>
  <rss:items rdf:resource="urn:unique-identifier" />
 </rss:channel>

 <rss:item rdf:about="http://domain.com/items/123456">
  <rss:link>http://domain.com/items/123456</rss:link>
  <rss:title>Book Title</rss:title>
  <rss:description>Random Book Description</rss:description>
  <dc:creator>First Name Last Name, 1901</dc:creator>
  <dcterms:language rdf:datatype="http://purl.org/dc/terms/ISO639-2">eng</dcterms:language>
  <dc:format>Book</dc:format>
  <dc:publisher>London : Publisher</dc:publisher>
  <dc:date>2009</dc:date>
  <bibo:isbn>1234567890</bibo:isbn>
  <bibo:eanucc13>1234567890</bibo:eanucc13>
  <dcterms:identifier>1234567890</dcterms:identifier>
 </rss:item>
</rdf:RDF>

搜索结果
0
10
13
http://domain.com/items/123456
书名
随机图书描述
名字姓氏,1901年
英格
书
伦敦:出版商
2009
1234567890
1234567890
1234567890
对,这就是XML文件。这是我所知道的

  • 我可以循环输入以获取数字
  • 使用
    文件获取内容($var)
    我得到了这个错误

    警告:simplexml_load_file():I/O警告:无法加载外部实体

  • 我不能使用
    foreach($rss->item as$item)
    ,因为项目本身有一个冒号

  • 我尝试用下划线替换冒号,出现了#2的错误
  • 我尝试了堆栈溢出中提到的DOM方法
  • 我尝试过堆栈溢出中提到的SimpleXML方法
  • 我只想循环
    rss:items
    并提取下面的项目

    任何帮助都会得到真诚的感谢,因为我已经没有咖啡了

    非常感谢

    马丁

    另外,对于将此标记为副本的人,我理解你的推理,但我无法理解其他线程中的答案,因此我不得不问一个新的。谢谢你的耐心,我是新来的

    该线程没有处理foreach无法解析top标记的事实

    foreach($feed->item as$item)


    在这个提要中,
    $feed->item
    不存在,因为它是
    $feed->rss::item
    ,这是无效的语法。谢谢。

    冒号将名称空间前缀与本地节点名分开。这是一个引用xmlns:rss定义的别名。因此像
    rss:channel
    这样的名称可以理解为
    {http://purl.org/rss/1.0/}:频道

    要使用DOMXpath对象读取具有名称空间的XML,需要注册自己的前缀。这样就可以解析Xpath表达式中的前缀

    $dom = new DOMDocument();
    $dom->loadXml($xml);
    $xpath = new DOMXpath($dom);
    $xpath->registerNamespace('rss', 'http://purl.org/rss/1.0/');
    
    $result = [];
    foreach ($xpath->evaluate('//rss:item') as $item) {
      $result = [
        'title' => $xpath->evaluate('string(rss:title)', $item),
        'link' => $xpath->evaluate('string(rss:link)', $item)
      ];
    }
    
    var_dump($result);
    
    输出:


    非常感谢您抽出时间回复。我会试一试,然后再打给你。非常感谢!当我使用file\u get\u content($feed\u url)抓取我的XML/RSS文件时,这种方法非常有效。非常感谢。
    array(2) {
      ["title"]=>
      string(10) "Book Title"
      ["link"]=>
      string(30) "http://domain.com/items/123456"
    }