Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML节点的PHP计数_Php_Xml - Fatal编程技术网

XML节点的PHP计数

XML节点的PHP计数,php,xml,Php,Xml,我有一个动态XML块,我正在运行一些PHP 简而言之,它统计每个区域的所有部门,如果有5个以上的部门,我会列出区域名称。如果少于5个部门,我会列出部门名称 下面是我正在使用的XML块: <impactOptions> <opsAreaImpact> <areas> <area> <area>Main Area 1</area> <departments>

我有一个动态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>
我遇到的问题是,它只获取它看到的第一个节点的部门数;不是所有的。例如,本例中的计数为2,因为第一个区域块有2个部门。然而,预期结果应为8,因为在所有区域块中,共有8个部门

有没有一种方法可以递归地计算这些节点,而不只是在第一个节点之后停止

此示例的结果应为:
主区域1、主区域2、主区域3
,因为部门总数大于5。如果小于5,它将列出部门名称。

在这种情况下,当您想进行此类选择时,它是您的朋友。可以将其与JQuery选择器类似

让我们详细分析一下所使用的XPath查询:

  • //areas//department
    -第一个XPath查询基本上是:find 属于
    区域
    元素后代的所有
    部门
    ,无 无论它们在
    区域下的何处
    元素
  • //areas/area/area
    -确定部门数量后,我们有一个选择:列出我们已经拥有的所有部门,或者显示此查询的区域。XPath查询转换为:给我所有
    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;
            }
        }
    }