احصل على محتوى من XML PHP5
-
23-09-2019 - |
سؤال
أنا أعمل على مدفوعات الدفع وأحتاج إلى بعض المساعدة في 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;
ولكن من الواضح أن هناك شيئًا خاطئًا لأنه لن يردد أي شيء .. اقتراحات؟
المحلول
إذا كنت تحاول فقط قرأ بعض البيانات من سلسلة XML ، ربما تكون أبسط طريقة للاستخدام Simplexml, ، و لا دوم - DOM مناسب تمامًا عندما يتعلق الأمر بكتابة XML ، ولكن للقراءة ، من السهل جدًا العمل مع 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
للوصول إلى البيانات.
نصائح أخرى
قد تنظر إلى 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);
حاول استخدام SimpleXML_LOAD_STRING ($ string) ؛ ثم فقط قم بعمل فورش مثل هذا
$xml = simplexml_load_string($string);
foreach($xml as $item)
{
echo $item->description; // would print the description
// continiu your logic here
}
لا تستخدم 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;
هنا يكون حل مع دوم
الاقتراح الأول: تعيين error_reporting(-1)
لرؤية أي أخطاء محتملة. إذا قمت بذلك ، فسترى PHP يرفع عدة إشعارات حول
Notice: Trying to get property of non-object
ل ->item(0)
يدعو إلى العناصر domnodelist. الحل البسيط إلى حد ما هو الاستخدام
$orderXML->loadXml($order);
بدلاً من load()
, ، لان load
يقوم بتحميل مستند XML من ملف.