我碰巧不幸地使用了一个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进行了改进,以表明还有其他标签我不需要并已经处理过。
答案 0 :(得分:1)
$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);
如果您知道,图片网址标记将始终包含名称IMAGE_URL
,您可以查看它们:
foreach ($parsed as $key => $image) {
if (strpos($key, 'IMAGE_URL') !== false) {
echo $image, '</br>';
}
}
答案 1 :(得分:0)
您可以使用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"
*
选择所有元素子节点。 []
是一个条件。在这种情况下,验证本地名称(没有任何名称空间前缀的标记名称)以特定字符串开头。
在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);
}