سؤال

وأنا أحاول تحليل استجابة من خدمة ويب SOAP، ولكن جزء من البيانات يحتوي على عنصر XMLNS صالح، وأعتقد أنه يسبب لي لا نهاية من المتاعب.

وهذا جزء من XML أن أعمل مع هو على النحو التالي.

<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ResponseData xmlns="http://www.example.com/WebServices/Schemas/1">
        <ResponseDataResult>
            <Messages xmlns="http://www.example.com/WebServices/Schemas/2">
                <Message>...</Message>
            </Messages>
        </ResponseDataResult>
        ...
    </ResponseData>
</soap:Body>

ووXMLNS URI في الصابون: عقدة الجسم على ما يرام، في واحد في ResponseData غير صالحة، فإنه يشير إلى وثيقة موجودة لا شيء. وتجدر الإشارة إلى أن الخدمة على شبكة الإنترنت ليست تحت سيطرتي حتى تحديد هذا غير وارد: (

وبلدي دلفي (2007) رمز نظرة، في الوقت الحاضر، شيء من هذا القبيل.

var l_tmp,l_tmp2,FSOAPBody:IXMLNode;

begin
    ...

    FSOAPBody := FSOAPEnvelope.ChildNodes.FindNode('Body','http://schemas.xmlsoap.org/soap/envelope/');
    //returns the xml above.
    if (FSOAPBody = nil) then exit;

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData','');
    if (l_tmp = nil) or (not l_tmp.HasChildNodes) then exit;

    l_tmp2 := l_tmp.ChildNodes.FindNode('ResponseDataResult','');

    ...
end;

في رمز أعلاه، ولقد كان لإضافة رابط مساحة فارغة إلى رمز FindNode('ResponseData','') كما هو الحال مع من ذلك، فإنه لن تجد أي شيء والعوائد النيل، مع ذلك ومع ذلك فإنه reutrns وXML المتوقع.

والمشكلة هي أن العقدة بحث عن التالي (ChildNodes.FindNode('ResponseDataResult','')) تثير حدوث انتهاك وصول عند محاولة الوصول إلى ChildNodes من l_tmp، ويمكنني أن ننظر إلى XML باستخدام l_tmp.xml ونرى أن هذا هو XML أتوقع.

وأظن أن ذلك يرجع إلى مساحة الاسم في عداد المفقودين، لذلك حاولت أن إزالته، ولكن الحصول على مزيد من الأخطاء قائلة انها سمة للقراءة فقط.

وهناك على أية حال لإزالة السمة XMLNS أو حدد العقد بغض النظر عن وجود NS؟ أو أنا ذاهب عن هذا الخطأ؟

هل كانت مفيدة؟

المحلول

وو<م> لا يتوقع أن جميع محددات مساحة تشير إلى الموارد الفعلية. وهي تستخدم معرفات فريدة في المقام الأول وذلك XML من مصادر متعددة يمكن استخدام نفس الأسماء دون التداخل مع بعضها البعض. لا يطلب منهم أن نشير إلى المخطط الذي يصف عنصر صالح وقيم السمة لمساحة الاسم. XML لا تتطلب حتى أن مثل هذا المخطط وجود لها.

إذا كنت تريد البحث عن العناصر دون اعتبار لمساحة الاسم، ثم استدعاء إصدار حجة واحدة من FindNode.

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData');

والنسخة يومين حجة يتطلب مساحة الاسم، وعند تحديد سلسلة فارغة، فهذا يعني أنك تطلب عقد الوحيدة التي لديها مساحات فارغة. منذ كنت على ما يبدو تعرف ما هو مساحة الاسم، هل يمكن استدعاء إصدار يومين حجة على أي حال، مثلك تماما استخدامه للحصول على العنصر الأساسي:

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
           'http://www.example.com/WebServices/Schemas/1');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top