【发布时间】:2013-12-10 22:34:15
【问题描述】:
我在检索 YouTube 数据馈送的 C# Windows Phone 8 应用程序中提取所需元素时遇到问题。 XML 文档如下所示。来自 YouTube 播放列表供稿:
<entry gd:etag="W/"YDwqeyM."" xmlns:gd="http://schemas.google.com/g/2005" xmlns="http://www.w3.org/2005/Atom">
<media:group xmlns:media="http://search.yahoo.com/mrss/">
<media:category label="Science & Technology" scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Tech</media:category>
<media:content url="https://www.youtube.com/v/vt7PLhQKYlU?version=3&f=playlists&app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="1668" yt:format="5" xmlns:yt="http://gdata.youtube.com/schemas/2007" />
<media:content url="rtsp://r5---sn-p5qlsu7d.c.youtube.com/CiULENy73wIaHAlVYgoULs_evhMYDSANFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="1668" yt:format="1" xmlns:yt="http://gdata.youtube.com/schemas/2007" />
<media:content url="rtsp://r5---sn-p5qlsu7d.c.youtube.com/CiULENy73wIaHAlVYgoULs_evhMYESARFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="1668" yt:format="6" xmlns:yt="http://gdata.youtube.com/schemas/2007" />
<media:credit role="uploader" scheme="urn:youtube" yt:display="TheDigitalDigest" yt:type="partner" xmlns:yt="http://gdata.youtube.com/schemas/2007">thedigitaldigest</media:credit>
<media:description type="plain">Surface 2</media:description>
<yt:videoid xmlns:yt="http://gdata.youtube.com/schemas/2007">vt7PLhQKYlU</yt:videoid>
</media:group>
</entry>
我需要修改下面的代码,它使用 XNamespace/XElement 方法解析条目以查找 yt:video 元素而不是 id强>元素。我可以毫无问题地获取没有以命名空间为前缀的元素(那些不包含冒号的元素)。这是我需要修改的代码:
public YouTubeVideo(XNamespace atomns, XElement entry, XNamespace medians)
{
var id = entry.Element(atomns.GetName("id")) != null && entry.Element(atomns.GetName("id")).Value != null
? entry.Element(atomns.GetName("id")).Value.Split(':').Last()
: string.Empty;
VideoUrl = "http://gdata.youtube.com/feeds/api/videos/" + id;
}
注意,我发现这篇关于命名空间的 SO 帖子:
Using LINQ to XML to Process XML in Multiple Namespaces
我担心的是,可能有一种方法可以从 XML 中提取 yt:videoid 而无需将 yt 命名空间硬编码到代码中,因为 yt 命名空间作为 xmlns 属性位于 yt:videoid 元素内。是否有一种方法可以选择具有命名空间引用作为属性的命名空间节点?如果不是,那么从将其作为属性的元素中选择命名空间并访问命名空间元素的内容的正确方法是什么?
更新:为了解决当前的问题,我使用下面的代码。我仍然想知道一个不会像下面的代码那样忽略名称空间的解决方案:
string videoid = (from child in entry.Descendants()
where child.Name.LocalName == "videoid"
select child.Value).FirstOrDefault();
更新:我现在有一个 XPath 样式查询,它不会忽略有效的命名空间,但它似乎有点冗长,如果有的话,我希望有人建议一种更简化的方法。我知道我可以添加三元运算符,但我想知道是否有办法将命名空间解析和元素选择结合起来?:
// Get the namespaces for the "media" group, since it contains the "yt" group,
// and for the "yt" group itself.
XNamespace xnsMediaGroup = entry.GetNamespaceOfPrefix("media");
XNamespace xnsYouTube = entry.GetNamespaceOfPrefix("yt");
// Got valid namespace references?
if ((xnsMediaGroup != null) && (xnsYouTube != null))
{
// Yes. Select the media group element.
XElement xelemMediaGroup = entry.Element(xnsMediaGroup.GetName("group"));
if (xelemMediaGroup != null)
{
// Select the YouTube videoid element.
XElement xelemYTVideoId = xelemMediaGroup.Element(xnsYouTube.GetName("videoid"));
if (xelemYTVideoId != null)
// Return the video's ID.
videoid = xelemYTVideoId.Value;
}
}
【问题讨论】:
标签: c# xml linq youtube namespaces