代码之家  ›  专栏  ›  技术社区  ›  jspooner Ryan Bigg

为什么我不能访问没有名称空间的XML节点?

  •  1
  • jspooner Ryan Bigg  · 技术社区  · 15 年前

    我在办公桌上敲了几个小时的头,想弄明白为什么我不能访问entry.author.name内容?我已经尝试了所有可能的方法来访问它,但是失败了。

    但是,当我使用xml.children遍历所有节点时,我看到了author节点。

    我看到author节点是原子名称空间的一部分,但它没有其他名称空间那样的名称空间。

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

    }

    3 回复  |  直到 15 年前
        1
  •  4
  •   imaginaryboy    15 年前

    试试这个…

    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);
            }
        }
    }
    
        2
  •  1
  •   sonicoliver    13 年前

    您也可以完全去掉名称空间…这是我找到的最佳解决方案(它只是将名称空间的详细信息转换为属性):

    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;
    }
    
        3
  •  0
  •   Justin Niessner    15 年前

    在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>