SimpleXML从行NUMBER = *获取所有子节点

时间:2014-05-27 19:21:55

标签: php xml nodes

我已经搜索StackOverflow几个小时试图找到帮助我的东西,有很多关于子节点的东西,但没有关于XML文件中的行NUMBERS并将它们拉入php文件。我有一个像这样的XML文件:

<MemberId ID="FC0491">
  <BillingInfo>
    <StatementEndDate>20140331</StatementEndDate>
    <BillingSubAccount>
    </BillingSubAccount>
    <BalanceForward>1264</BalanceForward>
    <BalanceDue>1227.47</BalanceDue>
    <Payments>-1264</Payments>
    <Aging>
      <Amount PERIOD="1">1227.47</Amount>
      <Amount PERIOD="2">0</Amount>
      <Amount PERIOD="3">0</Amount>
      <Amount PERIOD="4">0</Amount>
      <Amount PERIOD="5">0</Amount>
    </Aging>
    <Minimum>
      <CycleFrom>20140101</CycleFrom>
      <CycleTo>20141231</CycleTo>
      <Unspent>1000</Unspent>
      <Spent>0</Spent>
      <TotalAmount>1000</TotalAmount>
    </Minimum>
    <Details>
      <Line NUMBER="0">
        <ChargeDate>20140301</ChargeDate>
        <DueDate>20140301</DueDate>
        <TrackingNumber>CR</TrackingNumber>
        <Description>Transfer from Legacy</Description>
        <RevCode>SJ1220</RevCode>
        <RevDesc>TRANSFER FROM LEGACY</RevDesc>
        <SalesAmount>-36.53</SalesAmount>
        <ServiceCharge>0.00</ServiceCharge>
        <GST>0.00</GST>
        <PST>0.00</PST>
        <Othertaxes>0.00</Othertaxes>
        <Total>-36.53</Total>
        <ChitCode>CR</ChitCode>
        <ChitDate>20140301</ChitDate>
      </Line>
      <Line NUMBER="1">
        <ChargeDate>20140324</ChargeDate>
        <DueDate>20140324</DueDate>
        <TrackingNumber>1933</TrackingNumber>
        <Description>Payment Received - Thank You</Description>
        <RevCode>CR3627</RevCode>
        <RevDesc>PAYMENT</RevDesc>
        <SalesAmount>-1264.00</SalesAmount>
        <ServiceCharge>
        </ServiceCharge>
        <GST>
        </GST>
        <PST>
        </PST>
        <Othertaxes>
        </Othertaxes>
        <Total>-1264.00</Total>
        <ChitCode>1933</ChitCode>
        <ChitDate>20140324</ChitDate>
      </Line>
      <Line NUMBER="2">
        <ChargeDate>20140331</ChargeDate>
        <DueDate>20140331</DueDate>
        <TrackingNumber>SJ1309</TrackingNumber>
        <Description>Capital Assessment</Description>
        <RevCode>SJ1309</RevCode>
        <RevDesc>CAPITAL ASSESSMENT</RevDesc>
        <SalesAmount>100.00</SalesAmount>
        <ServiceCharge>0.00</ServiceCharge>
        <GST>0.00</GST>
        <PST>0.00</PST>
        <Othertaxes>0.00</Othertaxes>
        <Total>100.00</Total>
        <ChitCode>SJ1309</ChitCode>
        <ChitDate>20140331</ChitDate>
      </Line>
      <Line NUMBER="3">
        <ChargeDate>20140331</ChargeDate>
        <DueDate>20140331</DueDate>
        <TrackingNumber>SJ1309</TrackingNumber>
        <Description>Corporate Monthly Dues</Description>
        <RevCode>SJ1309</RevCode>
        <RevDesc>CORPORATE MONTHLY DUES</RevDesc>
        <SalesAmount>1164.00</SalesAmount>
        <ServiceCharge>0.00</ServiceCharge>
        <GST>0.00</GST>
        <PST>0.00</PST>
        <Othertaxes>0.00</Othertaxes>
        <Total>1164.00</Total>
        <ChitCode>SJ1309</ChitCode>
        <ChitDate>20140331</ChitDate>
      </Line>
      <Line NUMBER="4">
        <ChargeDate>20140331</ChargeDate>
        <DueDate>20140331</DueDate>
        <TrackingNumber>AutoAdjust</TrackingNumber>
        <Description>Auto Account Adjustment</Description>
        <RevCode>AJ0668</RevCode>
        <RevDesc>AUTO ACCOUNT ADJUSTMENT</RevDesc>
        <SalesAmount>0.00</SalesAmount>
        <ServiceCharge>
        </ServiceCharge>
        <GST>
        </GST>
        <PST>
        </PST>
        <Othertaxes>
        </Othertaxes>
        <Total>0.00</Total>
        <ChitCode>AutoAdjust</ChitCode>
        <ChitDate>20140331</ChitDate>
      </Line>
    </Details>
  </BillingInfo>
</MemberId>

我雇了一个人将所有的行号项目拉到一个PHP页面中,但是只会拉入第一个行项目。这是代码:

$source = file_get_contents($fname);
$xml = new SimpleXMLElement($source);

foreach($xml->Billing->MemberId as $member){
if($member['ID'] == $uname){
    $balance = $member->BillingInfo->BalanceDue;
    $BalanceForward = $member->BillingInfo->BalanceForward;
    $Payments = $member->BillingInfo->Payments;
    $minimum_cyclyto = $member->BillingInfo->Minimum->CycleTo;
    $minimum_unspent = $member->BillingInfo->Minimum->Unspent;
    $minimum_totalamount = $member->BillingInfo->Minimum->TotalAmount;

    $agin='';
    foreach($member->BillingInfo->Aging->Amount as $a => $b) 
    {
    $agin .=$b.",";
    }
    // Format Date from XML
    $xmlstatedate = $member->BillingInfo->StatementEndDate;
    $statedate = DateTime::createFromFormat("Ymd", $xmlstatedate);
    $statemonth=DateTime::createFromFormat("m Y", $xmlstatedate);
    // Format Date from XML 
    $xmlpaydate = $member->BillingInfo->Details->Line->ChargeDate;
    $paydate = DateTime::createFromFormat("Ymd", $xmlpaydate);
    $TrackingNumber = $member->BillingInfo->Details->Line->TrackingNumber;
    $Description = $member->BillingInfo->Details->Line->Description;
    $SalesAmount = $member->BillingInfo->Details->Line->SalesAmount;
    $charge = $member->BillingInfo->Details->Line->Total;
    $grat = $member->BillingInfo->Details->Line->GST;
    $svc = $member->BillingInfo->Details->Line->PST;
    $tax = $member->BillingInfo->Details->Line->Othertaxes;
}
}   ?>

这是拉入数据的表格;

<table width="100%" border="0" cellpadding="2" cellspacing="2" bordercolor="#FFFFFF">
          <tr> 
            <td width="10%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Date</strong></font></td>
            <td width="15%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Tracking#</strong></font></td>
            <td width="10%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Receipt</strong></font></td>
            <td width="35%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Description</strong></font></td>
            <td width="10%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Charge</strong></font></td>
            <td width="5%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Svc</strong></font></td>
            <td width="5%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Grat</strong></font></td>
            <td width="5%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Tax</strong></font></td>
            <td width="5%" bgcolor="#CCCCCC"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Total</strong></font></td>
          </tr>
          <tr> 
            <td bgcolor="DEB887"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></td>
            <td bgcolor="DEB887"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></td>
            <td bgcolor="DEB887"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></td>
            <td bgcolor="DEB887"><font size="2" face="Arial, Helvetica, sans-serif"><strong>Balance 
              Forward</strong></font></td>
            <td bgcolor="DEB887"><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></div></td>
            <td bgcolor="DEB887"><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></div></td>
            <td bgcolor="DEB887"><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></div></td>
            <td bgcolor="DEB887"><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><strong>&nbsp;</strong></font></div></td>
            <td bgcolor="DEB887"><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><strong><?php echo $BalanceForward; ?></strong></font></div></td>
          </tr>
          <tr valign="top"> 
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo substr($xmlpaydate,4,2)."-".substr($xmlpaydate,6,2)."-".substr($xmlpaydate,0,4);//$paydate->format('m-d-Y'); ?></font></div></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $TrackingNumber; ?></font></div></td>
            <td><div align="center"></div></td>
            <td><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $Description; ?></font></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $charge; ?></font></div></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $svc; ?></font></div></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $grat; ?></font></div></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $tax; ?></font></div></td>
            <td><div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><?php echo $Payments; ?></font></div></td>
          </tr>
          <tr valign="top"> 
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
        </table>

我想构建它,以便从行NUMBER中提取所有子节点(如果它们存在)。然后我希望该表为每个找到的行号生成ROWS并显示相关数据。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

感谢Marc B,我使用Xpath获取所有数据:

$Linequery = $member->xpath('BillingInfo/Details/Line[@NUMBER] ');

然后我替换了我的旧php语句,例如:

<?php echo $tax; ?>

<?php foreach($Linequery as $Line) { echo $Line->Othertaxes; echo "<br>"; } ?>

似乎完全按照我的意愿行事。谢谢你指出我正确的方向!

相关问题