1

I'm trying to run some reporting for an event feed that I have. I'm using the web services that my event manager provides to create an XML file using PHP. That is working great. This is the XML that I am getting:

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfTransactionInformation>
  <Transaction Transaction_Id="3126" IsSuccess="true" IsReviewed="true">
    <Column Name="instance_id" Value="65104108-6355-49C2-ACA7-8D5A28C962BD" />
    <Column Name="amount" Value="700.0000" />
    <Column Name="purchasedate" Value="2014-09-22T17:00:13" />
    <Column Name="authorizationcode" Value="Skipped billing - not applicable" />
    <Column Name="custtransnum" Value="Skipped billing - not applicable" />
    <Column Name="retrievalcode" Value="Skipped billing - not applicable" />
    <Column Name="appealcode" Value="" />
    <Column Name="transactionlastupdated" Value="2014-09-22T17:00:13" />
    <Column Name="billingname" Value="John Test" />
    <Column Name="creditcardtype" Value="N/A" />
    <Column Name="lastfourdigits" Value="1111" />
    <Column Name="achbankname" Value="" />
    <Column Name="achbankstate" Value="" />
    <Column Name="achaccountnumlast2" Value="" />
    <Column Name="achroutingnumlast2" Value="" />
    <Column Name="achchecknum" Value="" />
    <Column Name="achaccounttype" Value="" />
    <Column Name="billingemail" Value="john@test.com" />
    <Column Name="billingphone" Value="" />
    <Column Name="billingstreet1" Value="Skipped billing - not applicable" />
    <Column Name="billingstreet2" Value="Skipped billing - not applicable" />
    <Column Name="billingcity" Value="Skipped billing - not applicable" />
    <Column Name="billingstate" Value="N/A" />
    <Column Name="billingzip" Value="N/A" />
    <Column Name="billingcountry" Value="Skipped billing - not applicable" />
    <Column Name="paymenttype" Value="OT" />
    <Column Name="paymentfrequency" Value="" />
    <Column Name="totalscheduledamount" Value="" />
    <Column Name="nextpaymentamount" Value="" />
    <Column Name="nextpaymentdate" Value="" />
    <Column Name="paymentsremaining" Value="" />
    <Column Name="amounttodate" Value="" />
    <Column Name="firstpaymentdate" Value="" />
    <Column Name="initialtransactionid" Value="0" />
    <Column Name="fromfacebook" Value="False" />
    <Column Name="communityid" Value="2" />
    <Column Name="agentid" Value="" />
    <Column Name="agentname" Value="" />
    <Column Name="merchantaccountname" Value="Cyber Source" />
    <Column Name="control_id" Value="2055" />
    <Column Name="control_type" Value="event" />
    <Column Name="control_name" Value="Bowl Game Registration Template" />
    <Column Name="constituent_id" Value="" />
    <Column Name="imod_member_id" Value="280873" />
    <TransactionItems>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10355">
        <Column Name="sku" Value="bus_h2_early_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10356">
        <Column Name="sku" Value="bus_h3_early_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10357">
        <Column Name="sku" Value="bus_h4_early_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10358">
        <Column Name="sku" Value="party_ind_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10359">
        <Column Name="sku" Value="party_table_type_1_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10360">
        <Column Name="sku" Value="tailgate_ind_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10349">
        <Column Name="sku" Value="hotel_4_fn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10350">
        <Column Name="sku" Value="hotel_4_sn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10351">
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10352">
        <Column Name="total" Value="400.0000" />
        <Column Name="quantity" Value="1" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10353">
        <Column Name="total" Value="300.0000" />
        <Column Name="quantity" Value="1" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10354">
        <Column Name="sku" Value="bus_h1_early_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10343">
        <Column Name="sku" Value="hotel_2_fn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10344">
        <Column Name="sku" Value="hotel_2_sn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10345">
        <Column Name="sku" Value="hotel_2_tn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10346">
        <Column Name="sku" Value="hotel_3_fn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10347">
        <Column Name="sku" Value="hotel_3_sn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10348">
        <Column Name="sku" Value="hotel_3_tn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10340">
        <Column Name="sku" Value="hotel_1_fn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10341">
        <Column Name="sku" Value="hotel_1_sn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
      <TransactionItem Imod_Member_Id="280873" Type="CommerceItem" Transaction_Item_Id="Item-10342">
        <Column Name="sku" Value="hotel_1_tn_king_paid" />
        <Column Name="total" Value="0.0000" />
        <Column Name="quantity" Value="0" />
        <Column Name="fairmarketvalue" Value="0.0000" />
      </TransactionItem>
    </TransactionItems>
    <LinkedTransaction>
      <TransactionId>0</TransactionId>
      <Amount>0</Amount>
      <ControlId>0</ControlId>
      <ControlType />
      <ControlName />
      <PaymentType />
      <TotalScheduledAmount>0</TotalScheduledAmount>
    </LinkedTransaction>
  </Transaction>
</ArrayOfTransactionInformation>

It seems that they output every field to XML with the same tag name. I need to be able to pull each individual element and I need to be able to do that for the whole file, for instance, when there are several entries I would need to be able to pull and display all the names of entries, which would be billingname.

I am able to pull elements from this, but I just cannot figure out how to pull elements based on their attribute values. I have been trying to use the xpath method and several other variations.

This is the PHP that I have that will pull all elements within the <Transaction> element successfully:

$xml=simplexml_load_file("reporting.xml");
echo $xml->getName() . "<br>";
echo "<table width=700>";

for ($i = 0; ; $i++){
  foreach($xml->Transaction->Column[$i]->attributes() as $a => $b) {
    echo "<tr><td>";
    echo $a,'="',$b,"\"\n";
    echo "</td></tr>";
  }
}

echo "</table>";

Any idea on how I could use the PHP to display the data using the values of the attributes? Or to better explain, I need to do a foreach (i think) to find all instances of billingname and then echo the value of that, for instance "John Test".

i alarmed alien
  • 9,412
  • 3
  • 27
  • 40
  • Given this XML structure, you might be better off transforming the `Column` nodes to use the `name` as the tag name -- e.g. `` ==> `John Test`. It will make the data much easier to handle. – i alarmed alien Oct 03 '14 at 22:13
  • possible duplicate of: [SimpleXML: Selecting Elements Which Have A Certain Attribute Value](http://stackoverflow.com/q/992450/367456) – hakre Oct 11 '14 at 19:17

3 Answers3

2

You can try using XPath to select particular part of an XML document. In simplexml, it would looks something like this :

$result = $xml->xpath('//Column[@Name="billingname"]');
foreach($result as $column){
    echo $column['Value'];
}

Above XPath select all <Column>s having name attribute equals "billingname"

I'm not PHP expert, just referenced manual documents : SimpleXMLElement::xpath, Basic SimpleXML usage

har07
  • 88,338
  • 12
  • 84
  • 137
1

Cheers, this is fully working examples in 2 different ways (https://github.com/Waldz/Examples/tree/master/xml-parsing).

Using XPath:

$doc = new DOMDocument();
$doc->load('reporting.xml');

$xpath = new DOMXPath($doc);

// If you want to read all Column tags
$columnAttributes = $xpath->query("//ArrayOfTransactionInformation/Transaction/Column");
foreach ($columnAttributes as $columnTag) {
    /** @var \DOMElement $columnTag */
    echo sprintf(
        "%s = %s\n",
        $columnTag->getAttribute('Name'),
        $columnTag->getAttribute('Value')
    );
}

// If you want to read exact attribute
$billingNameAttribute = $xpath->query("//ArrayOfTransactionInformation/Transaction/Column[@Name='billingname']/@Value");
if ($billingNameAttribute->length > 0) {
    echo $billingNameAttribute->item(0)->value;
}

Using SimpleXML:

$xml = simplexml_load_file("reporting.xml");

foreach ($xml->Transaction->Column as $column) {
    echo sprintf(
        "%s = %s\n",
        $column->attributes()->Name,
        $column->attributes()->Value
    );
}
Waldz
  • 104
  • 6
0

I wrote a solution using DOM instead of simplexml, because I find the DOM an easier API to work with. The core of it is:

foreach($dom->getElementsByTagName('Column') as $column) {
  echo '<tr><td>';
  $name = $column->attributes->getNamedItem('Name')->textContent;
  $value = $column->attributes->getNamedItem('Value')->textContent;
  if ($name === 'billingname') {
      echo "{$name} = {$value}";
  }
  echo '</td></tr>';
}
TML
  • 12,813
  • 3
  • 38
  • 45
  • Thank you for the quick response. The only problem is that that still returns every tag with those values. I need to be able to return specific based on their value. For instance, only display the billing names. – Will Anderson Oct 03 '14 at 21:48
  • Personal taste, I know, but to show why SimpleXML has "simple" in its name: `foreach($dom->getElementsByTagName('Column') as $column)` -> `foreach($sx->Column as $column)`; `echo $column->attributes->getNamedItem('Name')->textContent;` -> `echo $column['Name'];` – IMSoP Oct 03 '14 at 23:04
  • @WillAnderson So add a conditional around the echo: `$name = $column->attributes->getNamedItem('Name')->textContent; if (some test on $name passes) echo $name;` – TML Oct 03 '14 at 23:07