我有这个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>
标记并使用 //img/@src
提取 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;
}
}