Я пытаюсь запустить некоторые отчеты для канала событий, который у меня есть. Я использую веб-сервисы, предоставляемые моим менеджером событий, для создания XML-файла с использованием PHP. Это работает отлично. Это XML, который я получаю:
<?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="[email protected]" />
<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>
Кажется, что они выводят каждое поле в XML с одинаковым именем тега. Мне нужно иметь возможность извлекать каждый отдельный элемент, и я должен быть в состоянии сделать это для всего файла, например, когда есть несколько записей, мне нужно было бы иметь возможность извлекать и отображать все имена записей, которые бы быть billingname
,
Я могу извлечь элементы из этого, но я просто не могу понять, как извлечь элементы на основе значений их атрибутов. Я пытался использовать метод xpath и несколько других вариантов.
Это PHP, который у меня есть, который будет тянуть все элементы внутри <Transaction>
элемент успешно:
$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>";
Любая идея о том, как я мог бы использовать PHP для отображения данных, используя значения атрибутов? Или, чтобы лучше объяснить, мне нужно сделать foreach (я думаю), чтобы найти все случаи billingname
а затем повторить значение этого, например, «Джон Тест».
Вы можете попробовать использовать XPath для выбора определенной части документа XML. В simplexml это выглядит примерно так:
$result = $xml->xpath('//Column[@Name="billingname"]');
foreach($result as $column){
echo $column['Value'];
}
Выше XPath выберите все <Column>
с name
атрибут равен "billingname"
Я не эксперт по PHP, просто ссылаюсь на ручные документы: SimpleXMLElement :: XPath, Основное использование SimpleXML
Ура, это полностью рабочие примеры 2 разными способами (https://github.com/Waldz/Examples/tree/master/xml-parsing).
Использование 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;
}
Использование SimpleXML:
$xml = simplexml_load_file("reporting.xml");
foreach ($xml->Transaction->Column as $column) {
echo sprintf(
"%s = %s\n",
$column->attributes()->Name,
$column->attributes()->Value
);
}
я написал решение с помощью DOM вместо SimpleXML, потому что я считаю DOM более простым API для работы. Ядром этого является:
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>';
}