سؤال

أواجه مشكلات في التكرار يدويًا عبر بيانات XML التي يتم تلقيها عبر استدعاء HTTPService، ويبدو ملف XML على النحو التالي:


<DataTable>
    <Row>
        <text>foo</text>
    </Row>
    <Row>
        <text>bar</text>
    </Row>
</DataTable>

عندما يتم إطلاق حدث نتيجة خادم الويب، أفعل شيئًا مثل هذا:


for(var i:int=0;i<event.result.DataTable.Row.length;i++)
{
    if(event.result.DataTable.Row[i].text == "foo")
        mx.controls.Alert.show('foo found!');

}

يعمل هذا الرمز، حيث يتم إرجاع أكثر من عقدة "صف" واحدة، ولكن يبدو أنه إذا كان هناك عقدة "صف" واحدة فقط، فإن كائن events.DataTable.Row ليس خطأً وينقطع الكود لاحقًا.

ما هي الطريقة الصحيحة للتكرار عبر كائن نتيجة HTTPService؟هل أحتاج إلى تحويله إلى نوع ما من مجموعة XMLList أو ArrayCollection؟لقد حاولت تعيين resultFormat على "e4x" ولم يتم حل المشكلة بعد ...

شكرًا

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

المحلول

المشكلة تكمن في هذا البيان

event.result.DataTable.Row.length

length ليس ملكا ل XMLList, ولكن وسيلة:

event.result.DataTable.Row.length()

إنه أمر محير، ولكن هذا هو الحال.

إضافة: في الواقع، الشيء الأكثر أمانًا هو استخدام ملف for each حلقة عند التكرار XMLLists، بهذه الطريقة لن ترتكب أي خطأ أبدًا، فهي تحتوي على كود أقل وأسهل في القراءة:

for each ( var node : XML in event.result.DataTable.Row )

نصائح أخرى

الصف ليس مصفوفة ما لم يكن هناك عناصر صف متعددة.انه مزعج.عليك أن تفعل شيئًا كهذا، لكنني لم أكتب AS3 منذ فترة، لذلك نسيت ما إذا كانت هناك وظيفة موجودة.

if (exists(event.result.DataTable) && exists(event.result.DataTable.Row)){
  if (exists(event.result.DataTable.Row.length)) {
    for(var i:int=0;i<event.result.DataTable.Row.length;i++)
    {
        if (exists(event.result.DataTable.Row[i].text)
        && "foo" == event.result.DataTable.Row[i].text)
            mx.controls.Alert.show('foo found!');
    }
  }
  if (exists(event.result.DataTable.Row.text)
  && "foo" == event.result.DataTable.Row.text)
      mx.controls.Alert.show('foo found!');
}

أود تخزينه في كائن Xml ثم استخدام أساليبه للبحث عن قيمة العقدة التي تحتاجها.

var returnedXml:Xml = new Xml(event.result.toString());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top