2009-05-01 10 views
1

Ich habe mir stundenlang den Kopf auf den Schreibtisch geschlagen, um herauszufinden, warum ich nicht auf den Inhalt von entry.author.name zugreifen kann? Ich habe jeden möglichen Weg versucht, um darauf zuzugreifen, aber gescheitert.Warum kann ich nicht auf XML-Knoten ohne Namespaces zugreifen?

Aber wenn ich mit xml.children alle Knoten durchlaufen, sehe ich den Autor-Knoten.

Ich sehe den Autor-Knoten ist ein Teil des Atom-Namespace, aber es hat keinen Namensraum wie die anderen Namespaces.

 
package { 
    import flash.display.Sprite;

public class Gdata extends Sprite { private var xml:XML = <entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007"> http://www.w3.org/2005/Atom,http://search.yahoo.com/mrss/,http://schemas.google.com/g/2005, http://gdata.youtube.com/schemas/2007 <id> http://gdata.youtube.com/feeds/api/videos/bwbZJw-C4Jk </id> <published> 2009-04-17T19:11:48.000Z </published> <updated> 2009-04-29T10:19:50.000Z </updated> <category scheme="http://gdata.youtube.com/schemas/2007/categories.cat" term="News" label="News & Politics"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Garofalo"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Olbermann"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="commentary"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Janeane"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="news"/> <category scheme="http://schemas.google.com/g/2005#kind" term="http://gdata.youtube.com/schemas/2007#video"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Keith"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="analysis"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Party"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Tea"/> <title type="text"> Janeane Garofalo Calls Tea Party Protesters Racists </title> <content type="text"> Janeane Garofalo: http://tinyurl.com/cr6rt8 EPA: http://tinyurl.com/clpyqo Veterans: http://tinyurl.com/ckbhb6 DHS: http://tinyurl.com/cctf54 DHS2: http://tinyurl.com/dahaxr John Ziegler: http://tinyurl.com/d7qbo4 Teabagging: http://tinyurl.com/ddskjo </content> <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=bwbZJw-C4Jk"/> <link rel="http://gdata.youtube.com/schemas/2007#video.responses" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/bwbZJw-C4Jk/responses"/> <link rel="http://gdata.youtube.com/schemas/2007#video.related" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/bwbZJw-C4Jk/related"/> <link rel="http://gdata.youtube.com/schemas/2007#mobile" type="text/html" href="http://m.youtube.com/details?v=bwbZJw-C4Jk"/> <link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/bwbZJw-C4Jk"/> <author> <name> HowTheWorldWorks </name> <uri> http://gdata.youtube.com/feeds/api/users/howtheworldworks </uri> </author> <gd:comments> <gd:feedLink href="http://gdata.youtube.com/feeds/api/videos/bwbZJw-C4Jk/comments" countHint="2249"/> </gd:comments> <media:group> <media:category label="News & Politics" scheme="http://gdata.youtube.com/schemas/2007/categories.cat"> News </media:category> <media:content url="http://www.youtube.com/v/bwbZJw-C4Jk&f=videos&app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="236" yt:format="5"/> <media:content url="rtsp://rtsp2.youtube.com/CiILENy73wIaGQmZ4IIPJ9kGbxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="236" yt:format="1"/> <media:content url="rtsp://rtsp2.youtube.com/CiILENy73wIaGQmZ4IIPJ9kGbxMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="236" yt:format="6"/> <media:description type="plain"> Janeane Garofalo: http://tinyurl.com/cr6rt8 </media:description> <media:keywords> Janeane, Garofalo, Keith, Olbermann, Tea, Party, commentary, analysis, news </media:keywords> <media:player url="http://www.youtube.com/watch?v=bwbZJw-C4Jk"/> <media:thumbnail url="http://i.ytimg.com/vi/bwbZJw-C4Jk/default.jpg" height="90" width="120" time="00:01:58"/> <media:thumbnail url="http://i.ytimg.com/vi/bwbZJw-C4Jk/1.jpg" height="90" width="120" time="00:00:59"/> <media:thumbnail url="http://i.ytimg.com/vi/bwbZJw-C4Jk/3.jpg" height="90" width="120" time="00:02:57"/> <media:thumbnail url="http://i.ytimg.com/vi/bwbZJw-C4Jk/0.jpg" height="240" width="320" time="00:01:58"/> <media:title type="plain"> Janeane Garofalo Calls Tea Party Protesters Racists </media:title> <yt:duration seconds="236"/> </media:group> <gd:rating average="3.9231105" max="5" min="1" numRaters="2289" rel="http://schemas.google.com/g/2005#overall"/> <yt:statistics favoriteCount="304" viewCount="33463"/> </entry>; namespace atom = "http://www.w3.org/2005/Atom" namespace media ="http://search.yahoo.com/mrss/"; namespace gd = "http://schemas.google.com/g/2005"; namespace yt = "http://gdata.youtube.com/schemas/2007"; public function Gdata() { var atom:Namespace = new Namespace(); trace("0",xml.children()[22]); trace("1",xml.inScopeNamespaces()); trace("2",xml..media::group); trace("3",xml..yt::[email protected]); trace("4",xml..yt::[email protected]); trace("5",xml..author); // why????????? trace("6",xml.author); // why????????? var x:int = 0; for each (var i in xml.children()) { if(i.localName() == 'author') { trace("author", i); } } } }

}

Antwort

4

Try this ...

public function Gdata() 
{ 
    var atom:Namespace = new Namespace("http://www.w3.org/2005/Atom"); 
    var media:Namespace = new Namespace("http://search.yahoo.com/mrss/"); 
    var gd:Namespace = new Namespace("http://schemas.google.com/g/2005"); 
    var yt:Namespace = new Namespace("http://gdata.youtube.com/schemas/2007"); 

    default xml namespace = atom; // IMPORTANT 

    trace("0",xml.children()[22]);     
    trace("1",xml.inScopeNamespaces()); 
    trace("2",xml..media::group);     
    trace("3",xml..yt::[email protected]);     
    trace("4",xml..yt::[email protected]);     
    trace("5",xml..author); // why????????? 
    trace("6",xml.author); // why????????? 

    var x:int = 0; 
    for each (var i in xml.children()) 
    { 
     if(i.localName() == 'author') 
     { 
      trace("author", i); 
     } 
    } 
} 
+1

default xml namespace = atom der Trick! Vielen Dank – jspooner

0

Irgendwo in Ihrer MXML-Datei Sie den folgenden Code-Schnipsel benötigen (bevor Sie mit Ihrem XML-Dokument arbeiten)

<mx:Script> 
    <![CDATA[ 

     private namespace atom = "http://www.w3.org/2005/Atom"; 
     use namespace atom; // This is the important line right here!!!! 

    ]]> 
</mx:Script> 
0

Sie können hier Streifen aus ist nur der Namensraum vollständig ... die beste Lösung, die ich gefunden (es einfach verwandelt sich die Namespace-Details in Attribute):

public function removeNS(data:XML):XML { 
    var myXML; 
    try { 
     var modified:String = data.toString().replace("xmlns=", "xmlns:default="); 
     var pattern:RegExp = new RegExp(":(?!/)", "gi"); 
     var transmuted:String = modified.replace(pattern, "_"); 
     myXML = new XML(transmuted); 
    } catch (e:Error) { 
     myXML = data; 
    } 
    return myXML; 
}