使用未分组在一个标记下的标记解析XML,但实际应该是

时间:2016-05-11 07:52:26

标签: php xml

我碰巧不幸地使用了一个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进行了改进,以表明还有其他标签我不需要并已经处理过。

2 个答案:

答案 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);
}