كيفية استخدام Xpath في ياهو!الحاجيات لاجتياز شجرة؟

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

سؤال

أنا أقوم بإنشاء ياهو!القطعة وقمت بذلك من قبل دون أي مشاكل (إنشاء عنصر واجهة مستخدم).أنا أحصل على مستند XML عبر رابط ويب وتريد الحصول على جميع العقد مقدمة للشجرة.أنا أقوم بفعل هذا:

var request = new XMLHttpRequest();
        request.open( "GET", url, false );
        request.send();
        if ( request.status == 200 )
        {
            doc = request.responseXML;
            tree = doc.evaluate("/lfm");
            status = tree.item(0).getAttribute("status")
            if(status == "ok")
            {
                print ("status is ok!");
                tracks = doc.evaluate("/lfm/recenttracks[1]/track");
                for(i=0;i<tracks.length;i++)
                {
                    artist = tracks.item(i).firstChild.firstChild.data;
                }
            }
        }
    }

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

tracks.item(i).firstChild.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.nextSibling.firstChild.data;

لإنجاز هذا.العقدة المجاورة لذلك تضيف أ "الأخ المجاور" إليه وهكذا.لا أريد الاستمرار في إضافة هذه العقد واعتقد أنه سيكون من الممكن استخدامها عقد الطفل[i] مثله:

artist = tracks.item(i).childNodes[0].firstChild.data;
nextitem = tracks.item(i).childNodes[1].firstChild.data;

هذا لا يعمل رغم ذلك.يعود ""childNodes[0] ليس له خصائص" بأي طريقة أستخدمها.الآن أعتقد أن هناك أيضًا طريقة للدخول Xpath للقيام بذلك في حلقة for:

name = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/name)");
                    print(name);
othernode = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/album)");
                    print(othernode);

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

هل يعرف أي شخص كيفية استخدام تعبير Xpath مع قيمة i الخاصة بي لاختيار عقدة ثم الحصول على العقد الفرعية لكل عقدة عظمى؟لكل مسار أريد الحصول على فنان، اسم، قابل للبث، mbid، ألبوم، عنوان url، صورة (صغيرة)، صورة (متوسطة)، صورة (كبيرة) و تاريخ.

يبدو ملف xml الخاص بي كما يلي:

<lfm status="ok">
   <recenttracks user="xaddict">
      <track nowplaying="true"> 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Girl (You Chew My Mind Up)</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="b150d099-b0f3-4feb-9a05-34e693c6dd24">Beams</album>
         <url>http://www.last.fm/music/The+Presets/_/Girl+%28You+Chew+My+Mind+Up%29</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/8696437.jpg</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/8696437.jpg</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/8696437.jpg</image>
         <date uts="1236440600">7 Mar 2009, 15:43</date>
      </track>
      <track > 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Get Outta Here</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="0469956f-d895-4120-8ec5-29ad41b9e2fd">Blow Up</album>
         <url>http://www.last.fm/music/The+Presets/_/Get+Outta+Here</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/20923179.png</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/20923179.png</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/20923179.png</image>
         <date uts="1236440242">7 Mar 2009, 15:37</date>
      </track>
   </recenttracks>
</lfm>
هل كانت مفيدة؟

المحلول 3

الطريقة الممكّنة لـ Xpath بالكامل للقيام بذلك هي استخدام تحويل السلسلة في Xpath.لقد قمت بالفعل بنشر هذا الرمز كإجابة على سؤال آخر وسوف أفعل ذلك مرة أخرى.أنا سعيد جدًا لأنني اكتشفت هذه الطريقة في فعل الأشياء.

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;
}

نصائح أخرى

جرب هذا

 for (var i = 0; i < xmlDoc.getElementsByTagName('track').length; i++)
            {
                alert(xmlDoc.getElementsByTagName('track')[i].getElementsByTagName('name')[0].childNodes[0].nodeValue); 
            }

إذا كنت تريد استخدام xpath، يمكنك أيضًا تجربة الحل أدناه.

var s = xmlDoc.evaluate( '//track' ,xmlDoc, null, XPathResult.ANY_TYPE, null );
var track = s.iterateNext();

while (track)
{
     alert(track.getElementsByTagName('name')[0].textContent );
     track = s.iterateNext();
}

هل يمكنك نشر جزء XML ذي الصلة؟نحن ننظر إلى الكود الخاص بك الذي يقوم بتوزيعه، ولكن إذا كان لدينا ملف XML نفسه، فسيكون من الأسهل إلغاء استعلام Xpath.الأكثر فائدة هو الجزء الذي يحتوي على عناصر مثل

<lfm>
    <recenttracks>
        <track>
            <album>

إلخ

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