我有一个动态XML块,我正在运行一些PHP。
简而言之,它会计算每个区域的所有部门,如果有超过5个部门,我会列出区域名称。如果少于5个部门,我会列出部门名称。
以下是我正在使用的XML块:
<impactOptions>
<opsAreaImpact>
<areas>
<area>
<area>Main Area 1</area>
<departments>
<department>Test 1</department>
<department>Test 2</department>
</departments>
</area>
<area>
<area>Main Area 2</area>
<departments>
<department>Another Test 1</department>
<department>Another Test 2</department>
<department>Another Test 3</department>
<department>Another Test 4</department>
<department>Another Test 5</department>
</departments>
</area>
<area>
<area>Main Area 3</area>
<departments>
<department>Final Test 1</department>
</departments>
</area>
</areas>
</opsAreaImpact>
</impactOptions>
这是我用于此操作的PHP代码:
if ($data->impactOptions->opsAreaImpact)
{
$opsArea = $data->impactOptions->opsAreaImpact;
$first = true;
$locationCount = $opsArea->areas->area->departments->department->count();
if ($locationCount > 5)
{
foreach($opsArea->areas->area as $area)
{
if (!$first)
{
echo ', ';
}
echo $area->area;
$first = false;
}
}
else
{
foreach($opsArea->areas->area->departments->department as $department)
{
if (!$first)
{
echo ', ';
}
echo $department;
$first = false;
}
}
}
我遇到的问题是它只能获得它看到的第一个节点的部门数量;不是所有的人。例如,此示例中的计数为2,因为第一个区块具有2个部门。然而,预期的结果应该是8,因为在所有区域区块中,总共有8个部门。
有没有办法可以递归计算这些节点而不只是在第一个节点之后停止?
此示例的结果应该是:Main Area 1, Main Area 2, Main Area 3
因为部门总数大于5.如果它小于5,则会列出部门名称。
答案 0 :(得分:0)
XPath是您的朋友。可以想象它类似于JQuery选择器。
让我们分解一下使用的XPath查询:
//areas//department
- 第一个XPath查询基本上是:find
所有departments
都是areas
元素的后代,没有
他们在areas
元素下的位置。//areas/area/area
- 在我们确定了部门数量之后,我们可以选择:列出我们已经拥有它们的所有部门,或者显示这个查询的区域。 XPath查询转换为:给我所有area
元素,它们是area
元素的直接后代,是areas
元素的直接后代。$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->loadXML(file_get_contents('test.xml'));
$xpath = new DOMXpath($dom);
// give me all the departments
$query = '//areas//department';
$departments = $xpath->query($query);
// more than 5 so list the area names
if ($departments->length > 5) {
$query = '//areas/area/area';
$areas = $xpath->query($query);
foreach ($areas as $area) {
echo $area->nodeValue;
}
// less than 5 so list out the department names
} else {
foreach ($departments as $department) {
echo $department->nodeValue;
}
}