1

我正在为 JomSocial 制作一个插件,它将基于 XML 文件显示登录用户的账单信息。我在创建插件方面取得了不错的进展,但我似乎无法正确使用语法来创建 php 语句,因此我可以在页面的各个位置填充数据。这是 XML 文件:

<Inquiry>
<Billing>
<Version>4.5.1</Version>
<startTime><![CDATA[4/15/2014 11:09 PM]]></startTime>
<endTime><![CDATA[4/15/2014 11:12 PM]]></endTime>
<Date>20140415</Date>
<MemberId ID="0ESING">
  <BillingInfo>
    <StatementEndDate>20140430</StatementEndDate>
    <BillingSubAccount>
    </BillingSubAccount>
    <BalanceForward>628.32</BalanceForward>
    <BalanceDue>372</BalanceDue>
    <Payments>-300</Payments>
</MemberId>
<MemberId ID="F00421">
</BillingInfo>
<BillingInfo>
<StatementEndDate>20140430</StatementEndDate>
 <BillingSubAccount>
 </BillingSubAccount>
 <BalanceForward>1158.36</BalanceForward>
 <BalanceDue>93.45</BalanceDue>
 <Payments>-1158.36</Payments>

这是到目前为止的PHP:

$user =& CFactory::getRequestUser();
$cuser = CFactory::getUser();  
$owner = CFactory::getUser($row->user->id); 
$ptype = $cuser->getProfileType();
$billingid = $owner->getInfo('FIELD_BILLINGID');
$lastname = $owner->getInfo('FIELD_FAMILYNAME');
$uname = $cuser->username;
$memid = $cuser->id;
$name = $cuser->getDisplayName();
$isMine = COwnerHelper::isMine($cuser->id, $user->id);
$config = CFactory::getConfig();

$source = file_get_contents('data/201404.xml');
$xml = new SimpleXMLElement($source);
$balance = $xml->Billing->MemberId->BillingInfo->BalanceDue;
$BalanceForward = $xml->Billing->MemberId->BillingInfo->BalanceForward;
$Payments = $xml->Billing->MemberId->BillingInfo->Payments;
ob_start();

if( $isMine ) {
    if($ptype == '2') { 

    if(strcasecmp($uname, $billingid) == 0) {

然后,在页面中调用字段:

<?php echo "<div>Balance Due: $". $balance ." | Balance Forward: $" . $BalanceForward . " | Payment: $" . $Payments . "</div>"; ?>

这会引入 XML 文件的第一条记录。我尝试了几个小时这样的事情:

$source = file_get_contents('data/201404.xml');
$xml = new SimpleXMLElement($source);
$balance = $xml->Billing->MemberId[.$uname.]->BillingInfo->BalanceDue;
$BalanceForward = $xml->Billing->MemberId[.$uname.]->BillingInfo->BalanceForward;
$Payments = $xml->Billing->MemberId[.$uname.]->BillingInfo->Payments;

无济于事。我想从 XML 中“拉”子节点,其中 MemberId ID=“yadayada”等于 $uname。我希望我很清楚,这是我在 Stackoverflow 上的第一篇文章!

4

2 回答 2

0

使用方括号表示法通过它的名称访问属性,所以你问member[0ESING]哪个是不正确的,因为属性是 named ID

您可以迭代成员以找到匹配项,如下所示:

foreach($xml->Billing->MemberId as $member){
    if($member['ID'] == $uname){
        $balance = $member->BillingInfo->BalanceDue;
        $BalanceForward = $member->BillingInfo->BalanceForward;
        $Payments = $member->BillingInfo->Payments;
    }
}
于 2014-04-18T15:16:53.593 回答
0

你为什么不使用 simplexml_load_file() 代替?它为您节省了手动加载文件并将其放入 simplexml_element 的麻烦。此外,我认为您的问题出现是因为 XML 文件本身无效,它需要 1 个根元素,但似乎包含零(或多个,取决于如何读取文件)。

于 2014-04-18T15:05:49.133 回答