XML节点的PHP计数
我有一个动态XML块,我正在运行一些PHP 简而言之,它统计每个区域的所有部门,如果有5个以上的部门,我会列出区域名称。如果少于5个部门,我会列出部门名称 下面是我正在使用的XML块:XML节点的PHP计数,php,xml,Php,Xml,我有一个动态XML块,我正在运行一些PHP 简而言之,它统计每个区域的所有部门,如果有5个以上的部门,我会列出区域名称。如果少于5个部门,我会列出部门名称 下面是我正在使用的XML块: <impactOptions> <opsAreaImpact> <areas> <area> <area>Main Area 1</area> <departments>
<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>
我遇到的问题是,它只获取它看到的第一个节点的部门数;不是所有的。例如,本例中的计数为2,因为第一个区域块有2个部门。然而,预期结果应为8,因为在所有区域块中,共有8个部门
有没有一种方法可以递归地计算这些节点,而不只是在第一个节点之后停止
此示例的结果应为:主区域1、主区域2、主区域3
,因为部门总数大于5。如果小于5,它将列出部门名称。在这种情况下,当您想进行此类选择时,它是您的朋友。可以将其与JQuery选择器类似
让我们详细分析一下所使用的XPath查询:
-第一个XPath查询基本上是:find 属于//areas//department
元素后代的所有区域
,无 无论它们在部门
元素区域下的何处
-确定部门数量后,我们有一个选择:列出我们已经拥有的所有部门,或者显示此查询的区域。XPath查询转换为:给我所有//areas/area/area
元素,这些元素是area
元素的直系后裔,而area
元素是area
元素的直系后裔area
$dom=新的DOMDocument('1.0','utf-8');
$dom->preserveWhiteSpace=false;
$dom->loadXML(文件获取内容('test.xml');
$xpath=newdomxpath($dom);
//把所有的部门都给我
$query='//区域//部门';
$departments=$xpath->query($query);
//超过5个,请列出区域名称
如果($departments->length>5){
$query='//areas/area/area';
$areas=$xpath->query($query);
foreach($areas$area){
echo$area->nodeValue;
}
//少于5个,请列出部门名称
}否则{
foreach($部门作为$部门){
echo$department->nodeValue;
}
}
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;
}
}
}