كيفية تحليل SOAP من أجل سرد كافة أسماء طلب و كائن

أتمكن من تحليل SOAP xml عندما أعرف مساحة الاسم واسم الطلب.

لأن لدي أنواع مختلفة من طلبات SOAP ، أود الحصول على اسم الطلب في ملف SOAP. مقتطف من جزء من SOAP الخاص بي:

<?xml version="1.0" encoding="UTF-8"?>


 ****
 
 
 ...

كود PHP:

if(is_file($file))
    {
        $content=file_get_contents($file);


        $xml = simplexml_load_string($content);
        $xml->registerXPathNamespace('ns1', 'http://schema.example.com');



        foreach ($xml->xpath('\\SOAP-ENV:') as $item)
        {
            //certainly the bad way?
            echo "
";
                print_r($item);
            echo "
";

        }

        echo "
";
            print_r($xml);
        echo "
";


    }

لم أحصل على نتيجة ... أود أن يظهر: "SendMailling" (حدد اسم الطلب)

عندما أحدد على وجه التحديد

//foreach($xml->xpath('//ns1:SendMailling') as $item)

لا توجد مشاكل.

I tried foreach($xml->xpath('//ns1') as $item)
and $xml->xpath('//SOAP-ENC'), $xml->xpath('//Body') but...

0
لذا فإن سؤالك الفعلي هو أنك تريد أن تعرف كيف يمكنك الحصول على قائمة بمساحات الأسماء المستخدمة في وثيقة XML؟ - php.net/manual/simplexmlelement.getnamespaces.php
وأضاف المؤلف hakre, مصدر

1 إجابة

واجهت مشاكل لفهم أسئلتك ، لذا ربما لا تكون هذه هي الإجابة.

If I understand you right, you want to select all Element Nodes that are a direct children of and that are in the ns1/http://schema.example.com namespace.

لقد قمت بالفعل بتسجيل بادئة مساحة الاسم لاستخدامها مع SimpleXMLElement :: xpath :

$xml->registerXPathNamespace('ns1', 'http://schema.example.com');

لم تقم بعد بتسجيل SOAP-ENV / http://schemas.xmlsoap.org/soap/envelope/ مساحة الاسم بقدر ما يمكنني رؤيتها.

في XPath لمطابقة عنصر ، يمكنك تحديد مساحة الاسم الخاصة به. هناك طرق متعددة لكيفية القيام بذلك:

*               All elements in any namespace.
prefix:*        All elements in namespace "prefix" (registered prefix)
prefix:local    Only "local" elements in namespace "prefix"

على سبيل المثال لتحديد جميع العناصر ذات بادئة ns1 :

//ns1:*

You might want to limit this because you only want direct children withn so register that namespace with the SOAP-ENV prefix and extend the previous xpath:

/SOAP-ENV:Body/ns1:*

يجب أن يكون هذا عندئذٍ كل العناصر التي تبحث عنها.


(OP :) شكرا مرة أخرى ، عندما أفعل

foreach ($xml->xpath('//SOAP-ENV:Body/ns1:*') as $item) {
    echo $item->getName() . "
"; }

كل شيء على ما يرام أحصل على الطلب اسم 'SendMailling' .

0
وأضاف
شكرا جزيلا ، هو بالضبط ما كنت أبحث عنه.
وأضاف المؤلف Gilles, مصدر
Gilles ، يرجى قبول الإجابة إذا ساعدت. أنت تعرف كيف يعمل قبول الإجابة؟ meta.stackexchange.com/questions/ 5234/و hellip؛
وأضاف المؤلف hakre, مصدر