如何使用PHP DOMDocument从其他一个元素中的元素获取属性

时间:2017-01-31 22:02:47

标签: php xml rss domdocument

我试图通过下面的代码从description元素中获取img的属性src。

这一切都正常

$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);

$x=$xmlDoc->getElementsByTagName('item');

for ($i=0; $i<=7; $i++) {
  $item_title=$x->item($i)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
  $item_link=$x->item($i)->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
  $item_desc=$x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;

  // Here is where is the mistake

  $item_url_img = $x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->getElementsByTagName('img')->item(0)->getAttribute('src');

  $new = new NewFCB();
  $new->link = $item_link;
  $new->title = $item_title;
  $new->description = $item_desc;
  $new->imgUrl = $item_url_img;

  $listNews[] = $new;
}

这是我正在阅读的xml estructure。 img位于{。}}内 我想在img元素中获取description

<item>
    <title>Digne, baja por unas molestias en la rodilla</title>
    <link>
        http://www.sport.es/es/noticias/barca/digne-baja-por-unas-molestias-    rodilla-5777073?utm_source=rss-noticias&utm_medium=feed&utm_campaign=barca
    </link>
    <pubDate>Tue, 31 Jan 2017 13:45:39 +0200</pubDate>
    <description>
        <p>Lucas Digne&#160;no se desplazará con el resto de la plantilla     del&#160;Barça&#160;al&#160;Vicente Calderón&#160;para la disputa del partido     de ida de las semifinales de&#160;Copa&#160;frente al&#160;Atlético Madrid.     El defensa francés es baja en la ...</p><a     href="http://www.sport.es/es/noticias/barca/digne-baja-por-unas-molestias-    rodilla-5777073?utm_source=rss-    noticias&utm_medium=feed&utm_campaign=barca">leer la noticia completa</a>    <br/>            
        <img alt="" src="http://estaticos.sport.es/resources/jpg/7/8/jordi-alba-viajara-con-equipo-calderon-1485865523987.jpg"/>
    </description>
    <guid>
    http://www.sport.es/es/noticias/barca/digne-baja-por-unas-molestias-        rodilla-5777073?utm_source=rss-noticias&utm_medium=feed&utm_campaign=barca
    </guid>
</item>

2 个答案:

答案 0 :(得分:1)

使用Xpath表达式获取节点和值:

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//item') as $item) {
  $row = [
    'title' => $xpath->evaluate('string(title)', $item),
    'link' => $xpath->evaluate('string(link)', $item),
    'description' => $xpath->evaluate('string(description)', $item),
    'image-src' => $xpath->evaluate('string(description/img/@src)', $item)
  ];
  var_dump($row);
}

但是在RSS描述中,通常包含HTML片段作为文本节点或cdata部分。在这种情况下,您必须将其加载到片段节点并在其上使用Xpath。

答案 1 :(得分:0)

我不完全确定,但我认为,错误是

->getElementsByTagName('description')->item(0)->childNodes->item(0)->

第二个item(0)为您提供p元素,该元素在img元素之前关闭,因此无法包含它。

也许,您要考虑XPath,它可以通过

为您提供src属性
/item/description/img/@src

或类似(我的XPath-fu有点生锈)。