我碰巧使用了一个api,该api具有与其他标签相同的XML标签级别的图像,并且具有下标,即1,2,3,4作为图像的标签名称的一部分。每辆车的总图像数量各不相同。
<Vehicle>
<TITLE>Some car name i dont need</TITLE>
<DESCRIPTION>Some description i also dont need</DESCRIPTION>
<IMAGE_URL1>{imagelinkhere i want}</IMAGE_URL1>
<IMAGE_URL2>{imagelinkhere i want}</IMAGE_URL2>
<IMAGE_URL3>{imagelinkhere i want}</IMAGE_URL3>
<IMAGE_URL4>{imagelinkhere i want}</IMAGE_URL4>
</Vehicle>
我使用PHP的方法simplexml_load_file(xml_url)将整个xml解析为对象数组。
我的问题是:有没有一种方法可以用同样的方法获得这些图像,而且既高效又干净?
编辑:我刚刚完善了xml,以表明还有其他我不需要的标签,并且已经在处理了。
$xml = '<Vehicle>
<DESCRIPTION/>
<IMAGE_URL1>{imagelinkhere}</IMAGE_URL1>
<IMAGE_URL2>{imagelinkhere}</IMAGE_URL2>
<IMAGE_URL3>{imagelinkhere}</IMAGE_URL3>
<IMAGE_URL4>{imagelinkhere}</IMAGE_URL4>
</Vehicle>';
$parsed = simplexml_load_string($xml);
如果你知道,图像url标签将始终包含名称IMAGE_URL
,你可以检查它们:
foreach ($parsed as $key => $image) {
if (strpos($key, 'IMAGE_URL') !== false) {
echo $image, '</br>';
}
}
您可以使用Xpath获取节点。
$xml = <<<'XML'
<Vehicle>
<TITLE>Some car name i dont need</TITLE>
<DESCRIPTION>Some description i also dont need</DESCRIPTION>
<IMAGE_URL1>image1</IMAGE_URL1>
<IMAGE_URL2>image2</IMAGE_URL2>
<IMAGE_URL3>image3</IMAGE_URL3>
<IMAGE_URL4>image4</IMAGE_URL4>
</Vehicle>
XML;
$vehicle = new SimpleXMLElement($xml);
foreach ($vehicle->xpath('*[starts-with(local-name(), "IMAGE_URL")]') as $imageUrl) {
var_dump((string)$imageUrl);
}
输出:
string(6) "image1"
string(6) "image2"
string(6) "image3"
string(6) "image4"
CCD_ 2选择所有元素的子节点。CCD_ 3是一个条件。在这种情况下,验证本地名称(没有任何命名空间前缀的标记名)以特定字符串开始。
这在DOM中看起来没有太大不同。但您要从文档上下文开始。
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('/Vehicle/*[starts-with(local-name(), "IMAGE_URL")]') as $imageUrl) {
var_dump($imageUrl->textContent);
}