解析XML时,标记不分组在一个标记下,但实际上应该分组在一个子标记下


Parse XML with tags not grouped under one tag, but really should be

我碰巧使用了一个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);
}