PHP节点的XML节点

时间:2015-05-01 17:33:07

标签: php xml

我有一个动态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,则会列出部门名称。

1 个答案:

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