【问题标题】:SimpleXML get all child nodes from Line NUMBER=*SimpleXML 从 Line NUMBER=* 获取所有子节点
【发布时间】:2014-07-16 20:00:06
【问题描述】:

我已经搜索了几个小时的 StackOverflow 试图找到可以帮助我的东西,有很多关于子节点的东西,但没有关于 XML 文件中的 Line 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>

我雇了人将所有 Line NUMBER 项拉入 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>

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

【问题讨论】:

  • "此函数提供在 xml 标记中定义的属性和值。" php.net/manual/en/simplexmlelement.attributes.php
  • Xpath: //line[@NUMBER]
  • 知道了。我正在尝试这个: $Linequery = $member->xpath('BillingInfo/Details/Line[@NUMBER => 0] ');
  • 我能够使用 xpath 获取所有数据,然后使用 foreach($Linequery as $Line) { echo $Line->whatever;

标签: php xml nodes


【解决方案1】:

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

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

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

<?php echo $tax; ?>

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

似乎完全符合我的要求。感谢您为我指明正确的方向!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多