Почему я не могу получить доступ к узлам xml без пространства имен? - PullRequest
1 голос
/ 01 мая 2009

Я часами бился головой о стол, пытаясь понять, почему я не могу получить доступ к содержимому entry.author.name? Я перепробовал все возможные способы доступа к нему, но не получилось.

Но когда я перебираю все узлы с помощью xml.children, я вижу узел автора.

Я вижу, что авторский узел находится отдельно от пространства имен атомов, но не имеет пространства имен, как другие пространства имен.

package {
    import flash.display.Sprite;</p>

<code>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::statistics.@favoriteCount);          
        trace("4",xml..yt::duration.@seconds);          
        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);
            }
        }           

    }
}
</code>

}

Ответы [ 3 ]

4 голосов
/ 01 мая 2009

Попробуйте это ...

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::statistics.@favoriteCount);                  
    trace("4",xml..yt::duration.@seconds);                  
    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 голос
/ 26 августа 2011

Вы также можете просто полностью удалить пространство имен ... вот лучшее решение, которое я нашел (оно просто превращает детали пространства имен в атрибуты):

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;
}
0 голосов
/ 01 мая 2009

Где-то в вашем mxml-файле вам понадобится следующий фрагмент кода (перед началом работы с XML-документом)

<mx:Script>
    <![CDATA[

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

    ]]>
</mx:Script>
...