1

私は支払いソリューションに取り組んでおり、PHP の助けが必要です。私は HTTPRequest を実行しており、それに応じて XML を取得します。XML は次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>

基本的に私がやりたいことは、タグからコンテンツを取得して文字列に保存することです。

私はこれを試しました:

$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>';

$orderXML = new DOMDocument();
$orderXML->load($order);

$payerXML = $orderXML->getElementsByTagName( 'payer' );
$purchase_listXML = $orderXML->getElementsByTagName( 'purchase_list' );
$freeform_purchaseXML = $orderXML->getElementsByTagName( 'freeform_purchase' );
$linenumberXML = $orderXML->getElementsByTagName( 'line_number' );
$descriptionXML = $orderXML->getElementsByTagName( 'description' );
$price_inc_vatXML = $orderXML->getElementsByTagName( 'price_including_vat' );
$vat_percentageXML = $orderXML->getElementsByTagName( 'vat_percentage' );
$quantityXML = $orderXML->getElementsByTagName( 'quantity' );
$settle_urlXML = $orderXML->getElementsByTagName( 'settle_url' );
$auth_urlXML = $orderXML->getElementsByTagName( 'auth_url' );

$theLineNumber = $linenumberXML->item(0)->nodeValue;
$theValue = $descriptionXML->item(0)->nodeValue;
$freeform_price = $price_inc_vatXML->item(0)->nodeValue;
$freeform_vat = $vat_percentageXML->item(0)->nodeValue;
$freeform_quantity = $quantityXML->item(0)->nodeValue;

$Settle_url = $settle_urlXML->item(0)->nodeValue;
$Auth_url = $auth_urlXML->item(0)->nodeValue;

echo 'thLineNumber - ' . $theLineNumber;
echo $theValue;
echo $freeform_price;
echo $freeform_vat;
echo $freeform_quantity;
echo $Settle_url;
echo $Auth_url;

しかし、何もエコーしないため、明らかに何か問題があります..提案はありますか?

4

5 に答える 5

4

XML文字列から一部のデータを読み取ろうとしているだけの場合、最も簡単な方法は、DOMではなくSimpleXMLを使用することです。XMLの記述に関してはDOMが適していますが、読み取りの場合、SimpleXMLは非常に簡単に機能します。と。

たとえば、次のようなものを開始点として使用できます。
注:simplexml_load_string関数を使用してXML文字列をロードしました。

$string = <<<STR
<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>
STR;

$xml = simplexml_load_string($string);

echo intval($xml->purchase_list->freeform_purchase->price_including_vat) . '<br />';
echo (string)$xml->payment_urls->auth_url . '<br />';

これにより、次の出力が得られます。

12
authurl

基本的に、SimpleXMLでは、XMLツリーをオブジェクトとして使用できます。XMLのルートノードはルートであるため、ツリーに存在しません。payerそのため、データにアクセスするために含める必要はありませんでした。

于 2010-03-02T21:36:44.087 に答える
0

これがDOMによる解決策です

最初の提案:error_reporting(-1)潜在的なエラーを確認するように設定します。これを行うと、PHPがいくつかの通知を発行するのがわかります

Notice: Trying to get property of non-object

->item(0)DOMNodeList要素の呼び出し用。かなり単純な解決策は、を使用することです

$orderXML->loadXml($order);

の代わりに、ファイルからXMLドキュメントをロードするload()ためです。load

于 2010-03-02T21:57:58.227 に答える
0

simplexml_load_string($ string);を使用してみてください。次に、このようにそれを使ってforeachを実行します

$xml = simplexml_load_string($string);

foreach($xml as $item)
{
echo $item->description; // would print the description
// continiu your logic here
}
于 2010-03-02T21:39:41.530 に答える
0

そのようなことにはDOMを使用せず、代わりにSimpleXMLを使用してください。

$payer = simplexml_load_string($order);
$freeform_purchase = $payer->purchase_list->freeform_purchase;

echo "Line number: ", $freeform_purchase->line_number, "\n";
echo "Description: ", $freeform_purchase->description, "\n";
echo "Auth URL: ", $payer->payment_urls->auth_url, "\n";
echo "Settle URL: ", $payer->payment_urls->settle_url, "\n";

// if you use the values as strings, cast them as strings
$description = (string) $freeform_purchase->description;

// if you have to use the values for math, cast them as integers
$vat_percentage = (int) $freeform_purchase->vat_percentage;
于 2010-03-02T21:40:15.037 に答える
0

SimpleXMLを見るかもしれません。これは、DOMDocument よりもはるかに簡単に使用できます。XML データが解析されたオブジェクト形式で返されるため、次のようなことができます。

$order = '<?xml version="1.0" encoding="utf-8" ?>
<payer>
    <purchase_list>
            <freeform_purchase>
                <line_number>1</line_number>
                <description>description</description>
                <price_including_vat>12</price_including_vat>
                <vat_percentage>
                    15
                </vat_percentage>
                <quantity>10</quantity>
            </freeform_purchase>
    </purchase_list>
    <payment_urls>
        <auth_url>authurl</auth_url>
        <settle_url>settleurl</settle_url>
    </payment_urls>
</payer>';

// Alternative version: $xml = new SimpleXMLElement($order);
// (completely equivalent to the below line)
$xml = simplexml_load_string($order);

$vat_pct = intval($xml->purchase_list->freeform_purchase->vat_percentage);
于 2010-03-02T21:35:51.087 に答える