php - 如何使用 SimpleXML 在 XML 中找到第一个 img?
问题描述
我有这个 XML 代码
<entry>
<p>11</p>
<p>22</p>
<p>33<img src="1.jpg"/></p>
<p>44</p>
</entry>
我想选择第一张图片并获取它的 src
问题是因为 img 并不总是在第三个孩子,所以它在里面<entry>
,但我不知道它到底在哪里,所以我需要搜索第一个图像而不是像这样找到。
p[2]->img[src]
$children->entry->img[src];
解决方案
您可以使用 XPath 查找<img>
标记并提取src
属性,使用//img/@src
该属性可以找到任何具有 src 属性的 img 元素(@
用于指示它是一个属性)...
$data = '<entry>
<p>11</p>
<p>22</p>
<p>33<img src="1.jpg"></img></p>
<p>44</p>
</entry>';
$xml = simplexml_load_string($data);
$image = $xml->xpath("//img/@src");
echo (string)$image[0];
会回声
1.jpg
由于xpath()
将返回匹配列表,您需要使用[0]
将其限制为第一个匹配并强制转换为字符串 ( (string)
) 确保您拥有一个字符串,而不是任何形式的 SimpleXMLElement。
更新:
使用实际示例中的额外 XML 内容,还有几个阶段可以获取图像。需要定义默认命名空间以允许您获取内容元素 - 其中包含您所追求的数据。然后对这些数据进行一些操作(删除一些导致 XML 问题的 HTML,因为它也是一个文档片段,添加一个新的根元素)并将其加载到二级 XML 中。然后您可以提取 src 属性。
$xml = simplexml_load_file("city.xml");
$xml->registerXPathNamespace("d", "http://www.w3.org/2005/Atom");
$content = $xml->xpath("//d:content");
foreach ( $content as $cont ) {
$newXML = "<root>".(string)$cont."</root>";
$newXML = str_replace([" ", "allowfullscreen"], " ", $newXML);
$xml2 = simplexml_load_string($newXML);
$image = $xml2->xpath("//img/@src");
foreach ( $image as $imgSrc ){
echo (string)$imgSrc.PHP_EOL;
}
}