我有一个结构: 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
的 CC_2,其级别大于1(n),其中 $item->OwnerNodeID
的水平少于当前级别(n-)(n-)1)
示例: 与<Level>2</Level>
的$item->CompanyNodeID
与$item->OwnerNodeID
进行了比较
有人可以帮助我使用一些示例代码或指向正确的方向?
我知道要阅读很多文本,但我希望有人可以帮助我解决这个问题。
预先感谢。:)
使用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查询获取级别内容> 1的所有项目元素,第二个表达式使用匹配的公司ID获取项目元素。我认为我在级别之间有正确的链接,但是这个想法很容易适应不同的字段。
此输出(对于您的示例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
使用与给定数据的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
}
}
}
}
希望这会有所帮助。