Отсутствующие элементы, использующие simpleXML в PHP - PullRequest
1 голос
/ 06 декабря 2011

У меня есть этот вывод XML.Я кормлю его в SimpleXML в PHP.Я пытаюсь восстановить все трибуны, участки и деревья.По какой-то причине я получаю участки только на первом стенде, а не на втором.То же самое с деревьями, я получаю спины деревьев только на первой стойке.Код, который я использую, размещен ниже XML.Я пробовал много разных способов попасть в эти разделы, и не повезло.

 <Tracts>
 <tract>
  <tract>tract1</tract> 
 <county>Glynn</county> 
<state>GA</state> 
<name>Garrett</name> 
<owner>Bob</owner> 
<date>Nov 6, 2011</date> 
 <stands>
 <Stand>
 <stand>1</stand> 
  <age>12</age> 
  <thinned>true</thinned> 
  <thinYear>2007</thinYear> 
  <species>PL Lob</species> 
 <cruiser>me</cruiser> 
<hPlotSize>50th Acre</hPlotSize> 
<pPlotSize>50th Acre</pPlotSize> 
<treeType>None</treeType> 
<fixedOrPrism>5</fixedOrPrism> 
<plots>
<Plot>
 <plotNum>5</plotNum> 
 <pPMStems>12</pPMStems> 
 <hPMStems>12</hPMStems> 
 <pPMHt>12</pPMHt> 
 <hPMHt>12</hPMHt> 
 <pMStems>12</pMStems> 
 <hMStems>12</hMStems> 
  <pMHt>0</pMHt> 
 <hMHt>12</hMHt> 
 <pHtCrown>0</pHtCrown> 
<trees>
<Tree>
<treeNum>3</treeNum> 
<DBH>18</DBH> 
<species>LOB</species> 
<type>CROP</type> 
<merch>12</merch> 
<htToCrown>9</htToCrown> 
<merchLogs>1.0</merchLogs> 
<defects>
<string>CRON</string> 
<string>SCRAPE</string> 
</defects>
</Tree>
<Tree>
 <treeNum>3</treeNum> 
 <DBH>18</DBH> 
 <species>LOB</species> 
 <type>CROP</type> 
<merch>12</merch> 
<htToCrown>9</htToCrown> 
<merchLogs>1.0</merchLogs> 
<defects>
  <string>CRON</string> 
<string>SCRAPE</string> 
</defects>
</Tree>
<Tree>
<treeNum>3</treeNum> 
<DBH>18</DBH> 
<species>LOB</species> 
<type>CROP</type> 
<merch>12</merch> 
<htToCrown>9</htToCrown> 
<merchLogs>1.0</merchLogs> 
<defects>
<string>CRON</string> 
<string>SCRAPE</string> 
</defects>
</Tree>
</trees>
</Plot>
<Plot>
<plotNum>9</plotNum> 
<pPMStems>3</pPMStems> 
<hPMStems>3</hPMStems> 
<pPMHt>3</pPMHt> 
<hPMHt>3</hPMHt> 
<pMStems>3</pMStems> 
<hMStems>3</hMStems> 
<pMHt>0</pMHt> 
<hMHt>3</hMHt> 
<pHtCrown>0</pHtCrown> 
<trees /> 
 </Plot>
</plots>
</Stand>
<Stand>
 <stand>2</stand> 
<age>20</age> 
<thinned>false</thinned> 
<thinYear>0</thinYear> 
 <species>PL Lob</species> 
 <cruiser>me</cruiser> 
<hPlotSize>50th Acre</hPlotSize> 
<pPlotSize>10th Acre</pPlotSize> 
<treeType>Fixed</treeType> 
<fixedOrPrism>100%</fixedOrPrism> 
<plots>
<Plot>
<plotNum>2</plotNum> 
<pPMStems>12</pPMStems> 
<hPMStems>20</hPMStems> 
<pPMHt>32</pPMHt> 
<hPMHt>16</hPMHt> 
<pMStems>21</pMStems> 
<hMStems>7</hMStems> 
<pMHt>0</pMHt> 
<hMHt>13</hMHt> 
<pHtCrown>0</pHtCrown> 
<trees>
<Tree>
  <treeNum>1</treeNum> 
  <DBH>10</DBH> 
  <species>LOB</species> 
   <type>CROP</type> 
  <merch>12</merch> 
  <htToCrown>16</htToCrown> 
  <merchLogs>4.5</merchLogs> 
 <defects>
  <string>CRON</string> 
   <string>OTHER</string> 
</defects>
 </Tree>
 </trees>
 </Plot>
</plots>
 </Stand>
 </stands>
 </tract>
</Tracts>

  foreach($xml->tract->stands->Stand->plots->Plot as $plot)
  {
  echo $plot->plotNum;
  }
  echo '<br><br>'; 

  foreach ($xml->tract->stands->Stand->plots->Plot->trees->Tree as $tree) 
  {
  echo $tree->treeNum;
  }

1 Ответ

0 голосов
/ 19 июля 2012

Переменная $xml->tract->stands->Stand->plots->Plot всегда будет ссылаться только на первый элемент Stand - представьте, что документ представляет собой набор вложенных массивов.

SimpleXML предполагает, что если вы упомянули имя элемента без зацикливания или индексации в нем, вам понадобится первый элемент этого имени. Другими словами, это то же самое, что написать foreach ( $xml->tract[0]->stands[0]->Stand[0]->plots[0]->Plot ) ...

Итак, вам нужно вложить свои циклы foreach:

foreach($xml->tract->stands->Stand as $stand)
{
   foreach($stand->plots->Plot as $plot)
   {
       echo $plot->plotNum;

       foreach ( $plot->trees->Tree as $tree )
       {
           echo $tree->treeNum;
       }
   }

}

...