比较XML的值

时间:2017-09-25 15:28:01

标签: php xml

我的 XML 具有以下结构:

<WebServiceData>
  <Status>1</Status>
  <Data>
    <Companies>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>115251763</OwnerNodeID>
        <OwnerName>Company 1</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>115099315</OwnerNodeID>
        <Share>7.9675</Share>
        <OwnerName>Company 2</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>115082029</OwnerNodeID>
        <OwnerName>Company 3</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>115080377</OwnerNodeID>
        <OwnerName>Company 4</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>112814945</OwnerNodeID>
        <OwnerName>Company 5</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>112671493</OwnerNodeID>
        <OwnerName>Company 6</OwnerName>
      </Item>
      <Item>
        <Level>1</Level>
        <CompanyNodeID>115241617</CompanyNodeID>
        <OwnerNodeID>108964427</OwnerNodeID>
        <OwnerName>Company 7</OwnerName>
      </Item>
      <Item>
        <Level>2</Level>
        <CompanyNodeID>115099315</CompanyNodeID>
        <OwnerNodeID>112867408</OwnerNodeID>
        <OwnerName>Company 8</OwnerName>
      </Item>
      <Item>
        <Level>2</Level>
        <CompanyNodeID>115099315</CompanyNodeID>
        <OwnerNodeID>112820093</OwnerNodeID>
        <OwnerName>Company 9</OwnerName>
      </Item>
      <Item>
        <Level>2</Level>
        <CompanyNodeID>115082029</CompanyNodeID>
        <OwnerNodeID>115360800</OwnerNodeID>
        <OwnerName>Company 10</OwnerName>
      </Item>
      <Item>
        <Level>2</Level>
        <CompanyNodeID>115080377</CompanyNodeID>
        <OwnerNodeID>112847101</OwnerNodeID>
        <OwnerName>Company 11</OwnerName>
      </Item>
      <Item>
        <Level>2</Level>
        <CompanyNodeID>115251763</CompanyNodeID>
        <OwnerNodeID>112905389</OwnerNodeID>
        <OwnerName>Company 2</OwnerName>
      </Item>
    </Companies>
  </Data>
</WebServiceData>

我使用 SimpleXMLElement 来获取元素:

$output = new SimpleXMLElement($xml);

然后我循环通过项目:

foreach ($output->Data->Companies->Item as $item)
{

}

我必须在代码中实现的是每个公司(拥有<Level>1</Level>的公司)的所有者没有所有者,因此我必须将$item->CompanyNodeID与大于1(n)的级别进行比较{{1等级1小于当前等级(n-1)

实施例: $item->OwnerNodeID$item->CompanyNodeID的{​​{1}}与<Level>2</Level>

进行比较

有人可以帮我提供一些示例代码或指出我正确的方向吗?

我知道要阅读很多文字,但我希望有人可以帮我解决这个问题。

提前致谢。 :)

2 个答案:

答案 0 :(得分:2)

使用SimpleXML和XPath,您无需读取所有数据即可搜索文档。

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );


$xml = simplexml_load_file("NewFile.xml");

$levelN = $xml->xpath("//Item[Level/text()>1]");

foreach ( $levelN as $level)    {
    $companyNodeID = (string)$level->CompanyNodeID;
    echo "CompanyNodeID=".$companyNodeID.PHP_EOL;
    $owner = $xml->xpath("//Item[OwnerNodeID/text()='{$companyNodeID}']");
    echo "Parent CompanyID=".(string)$owner[0]->CompanyNodeID.PHP_EOL;
}

第一个XPath查询获取Level的内容为&gt;的所有Item元素。在图1中,第二个表达式使用匹配的公司ID获取Item元素。我想我已经在关卡之间找到了正确的链接,但这个想法很容易适应不同的领域。

此输出(对于您的示例XML):

CompanyNodeID=115099315
Parent CompanyID=115241617
CompanyNodeID=115099315
Parent CompanyID=115241617
CompanyNodeID=115082029
Parent CompanyID=115241617
CompanyNodeID=115080377
Parent CompanyID=115241617
CompanyNodeID=115251763
Parent CompanyID=115241617

答案 1 :(得分:1)

将SimpleXMLElement与给定数据一起使用,嵌套的foreach循环将是归档目标的最简单方法。

// fist loop, you try to get level2 data
foreach ($output->Data->Companies->Item as $level2Data) {
    // only react if given loop entry is level 2
    if ($level2Data->Level == 2) {
        // as we have a level 2 entry, lets try to find its match on level 1
        foreach ($output->Data->Companies->Item as $level1Data) {
            // check if subentry is level 1 and check if it matches with our given level 2 data
            if ($level1Data->Level == 1 && (int)$level2Data->CompanyNodeID == (int)$level1Data->OwnerNodeID) {
                // here will be a match
                // $level1Data is Level 1 and $level2Data Level 1
                // here you can use above variables to compare whatever you want
                // add your logic here
            }
        }
    }
}

希望这有帮助。