为什么我不能使用out命名空间访问xml节点?

时间:2022-11-27 16:46:43

I've been banging my head on my desk for hours trying to figure out why I can't access the entry.author.name content? I've tried every possible way to access it but failed.

我一直在我的桌子上敲打几个小时试图找出为什么我无法访问entry.author.name内容?我已经尝试了一切可能的方法来访问它但失败了。

But when I loop through all nodes with xml.children I see the author node.

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

I see the author node is apart of the atom namespace but it doesn't have a namespace like the other 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::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 个解决方案

#1


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


you can also just strip out the namespace completely... here's the best solution I found (it simply turns the namespace details into attributes):

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

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


Somewhere in your mxml file you need the following code snippet (before you work with your XML Document)

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

#1


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


you can also just strip out the namespace completely... here's the best solution I found (it simply turns the namespace details into attributes):

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

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


Somewhere in your mxml file you need the following code snippet (before you work with your XML Document)

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