كيف يمكنني الحصول على القطعة على عدم تعطل إذا كان هناك أي قيمة في عقدة xml?

StackOverflow https://stackoverflow.com/questions/671861

سؤال

أنا الحصول على ملف xml و ترغب في الحصول على البيانات منه.مصدر xml لا يهم ولكن ما أنا ، لقد حصلت على الحصول على مجال معين هو:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

الآن هذا يعمل مثل السحر إلا عندما لا يكون هناك قيمة في العقدة.حتى إذا كان هيكل هو من هذا القبيل:

<xml>
 <one>
  <two>nodeValue</two>
 </one>
 <one>
  <two></two>
 </one>
</xml>

القطعة سوف تحطم على الثاني 'واحد' عقدة ، لأنه لا يوجد قيمة في "اثنين" العقدة.وحدة تقول:

TypeError: tracks.item(i).childNodes.item(4).childNodes.item(0) has no properties

أي أفكار حول كيفية الحصول على القطعة فقط انظر فارغة مثل سلسلة فارغة (null, فارغة ، أو ""), بدلا من ان تتحطم ؟ أظن شيئا على غرار البيانات, getValue(), النص, أو أي شيء آخر.

باستخدام

var track= xmlDoc.getElementsByTagName('track')[0];
var info= track.getElementsByTagName('artist')[0];
var value= info.firstChild? info.firstChild.data : '';

لا يعمل و إرجاع "TypeError:المسار لديه خصائص".من السطر الثاني حيث الفنان يسمى.

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

المحلول 3

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

وبدلا من استخدام:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

للحصول على القيم التي من الأفضل استخدام كسباث مع التحويل المباشر لسلسلة. عندما سلسلة فارغة في ياهو! أوتوقيت أنه لا يعطي أي أخطاء، ولكن إرجاع "فارغ". innerText وtextContent (الطريق جافا سكريبت الأساسية في المتصفحات، وتستخدم جنبا إلى جنب مع أشياء مثل getElementsByTagName) لا بالكامل (أو لا على الاطلاق) نفذت في ياهو! الحاجيات المحرك وجعله يعمل بشكل أبطأ وبفظاعة جدا الرد على xmlNodes وchildNodes. طريقة سهلة ولكن لاجتياز بنية مستند XML يستخدم 'تقييم' للحصول على كل ما تحتاجه (بما في ذلك قوائم العقد) من أكس.

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

            var entries = xmlDoc.evaluate("lfm/recenttracks/track");
            var length = entries.length;
            for(var i = 0; i &lt; length; i++) {
                var entry = entries.item(i);
                var obj = {
                    artist: entry.evaluate("string(artist)"),
                    name: entry.evaluate("string(name)"),
                    url: entry.evaluate("string(url)"),
                    image: entry.evaluate("string(image[@size='medium'])")
                    };
                posts[i] = obj;
            }

نصائح أخرى

واختبار أن العقدة "اثنين" لديها عقدة الطفل قبل الوصول إلى البيانات الخاصة به.

وchildNodes.item (ط) (أو جافا سكريبت نموذج بسيط childNodes [أنا]) ينبغي عموما تجنبها، انها هشة قليلا بالاعتماد على النص العقد مسافة بيضاء يجري في المكان المتوقع بالضبط.

وكنت تفعل شيئا مثل:

var tracks= xmlDoc.getElementsByTagName('track')[0];
var track= tracks.getElementsByTagName('one')[0];
var info= track.getElementsByTagName('two')[0];
var value= info.firstChild? info.firstChild.data : '';

و(إذا كنت لا تعرف tagnames من "واحد" و "اثنين مقدما، هل يمكن دائما استخدام 'getElementsByTagName (' * ')' للحصول على كل العناصر، طالما أنك لا تحتاج إلى دعم IE5، حيث لم ينجح هذا الإجراء.)

وبديل إلى السطر الأخير هو استخدام طريقة لقراءة <م> جميع النص داخل العقدة، بما في ذلك أي من العقد التابعة لها. هذا لا يهم إذا العقدة يحتوي فقط من أي وقت مضى في معظم عقدة نص واحد، ولكن يمكن أن تكون مفيدة إذا كانت الشجرة يمكن الحصول على denormalised أو تحتوي على EntityReferences أو عناصر متداخلة. تاريخيا كان واحد لكتابة طريقة لعنة للحصول على هذه المعلومات، ولكن في هذه الأيام معظم المتصفحات تدعم خاصية textContent DOM المستوى 3 و / أو تمديد innerText IE في:

var value= info.textContent!==undefined? info.textContent : info.innerText;

دون dtd أن يسمح واحد عنصر لاحتواء فارغة اثنين العنصر سيكون لديك تحليل و كمان نص xml للحصول على وثيقة الخروج منه.

فارغة من العناصر مثل قيم فارغة في قواعد البيانات - وضع في شيء ، وهو "لا شيء" أو "0" قيمة غير كسر الفضاء ، أي شيء في كل شيء أو لا تشمل اثنين العنصر.

ربما يمكن أن يكون السمة من واحد, بدلا من عنصر في حد ذاتها.سمات يمكن أن يكون فارغا سلاسل القيم.أفضل من العناصر الوهمية .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top