【问题标题】:How to parse youtube xml without using youtube api如何在不使用 youtube api 的情况下解析 youtube xml
【发布时间】:2011-12-15 20:39:31
【问题描述】:

我想让我的 Facebook 应用程序中的用户发布 YouTube 视频。 任何用户都可以在输入文本框中输入 YouTube 链接。这种行为与在他们的 Facebook 墙上发布视频相同。 应用程序从链接中提取视频 ID 并创建不同的 YouTube 链接。
例如,如果链接是:http://www.youtube.com/watch?v=JBWd_yJPbr8&feature=related
ID 是:JBWd_yJPbr8,请求变为 http://gdata.youtube.com/feeds/api/videos/JBWd_yJPbr8

问题在于解析返回的 XML。这不是标准的 XML,或者至少我还没有使用标准的 XML 解析器让它工作。我如何解析这个 XML?我需要缩略图、标题和描述...

using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
    XmlWriterSettings ws = new XmlWriterSettings();
    ws.Indent = true;
    using (XmlWriter writer = XmlWriter.Create(output, ws))
    {




            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        writer.WriteStartElement(reader.Name);
                        break;
                    case XmlNodeType.Text:
                        writer.WriteString(reader.Value);
                        break;
                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        writer.WriteProcessingInstruction(reader.Name, reader.Value);
                        break;
                    case XmlNodeType.Comment:
                        writer.WriteComment(reader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        writer.WriteFullEndElement();
                        break;
                }
            }

        }
    }

这种情况是抛出异常:

case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);

元素类型无效

【问题讨论】:

  • 使用 (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))...

标签: c# asp.net facebook asp.net-mvc-3 youtube


【解决方案1】:

使用Json.Net,可以将返回的json响应解析为:

(我将?alt=json 附加到您的网址)

System.Net.WebClient wc = new System.Net.WebClient();
string s = wc.DownloadString("http://gdata.youtube.com/feeds/api/videos/JBWd_yJPbr8?alt=json");

JObject JObj = (JObject)JsonConvert.DeserializeObject(s);

var entry = JObj["entry"];
Console.WriteLine("TITLE: " + entry["title"]["$t"]);
Console.WriteLine("DESC : " + entry["media$group"]["media$description"]["$t"]);
foreach (var thumbnail in entry["media$group"]["media$thumbnail"])
{
    Console.WriteLine(thumbnail["url"]);
}

【讨论】:

  • 谢谢!但在这种情况下我需要使用 ajax 请求
  • @user750487,阿贾克斯?你是什​​么意思?严格的xml?为什么?
  • 我的错误 :) JSON 非常适合这种情况。我还用过这个代码。工作完美。非常感谢!
【解决方案2】:

你试过这个吗:http://www.codeproject.com/KB/cs/youmanager.aspx?display=Print 这是一个很好的例子

【讨论】:

    【解决方案3】:

    xml 没有任何问题 - 它解析得很好。问题在于您编写 xml 的方式。

    代码 writer.WriteStartElement(reader.Name);reader.Name 返回类似“app:control”的字符串时不起作用 - 元素名称中不能有冒号。

    xml在标签名中有冒号的地方,是因为冒号前的位表示标签属于哪个命名空间。

    如果你替换这些行:

    case XmlNodeType.Element:
        writer.WriteStartElement(reader.Name);
        break;
    

    case XmlNodeType.Element:
        writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
        break;
    

    您的代码应该可以正常运行并解析 XML。

    虽然你会发现输出的 xml 不是你想要的,所以代码仍然需要一些工作。

    【讨论】:

    • @user750487 - 如果这回答了您的问题,请考虑通过单击勾选将其标记为已接受的答案
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2011-07-10
    • 2012-01-26
    • 1970-01-01
    • 2013-05-27
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多