【问题标题】:Issue parsing RSS xml解析 RSS xml 的问题
【发布时间】:2010-03-30 01:43:13
【问题描述】:

我在使用 Linq to XML 解析以下 XML 时遇到问题。我正在做的是让元素检查它是否是我想要的,然后转到下一个。我很确定它与 xmlns 有关,但我需要这段代码才能同时处理这种风格和普通风格的 RSS 提要(没有 xmlns)。有什么想法吗?

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://someurl.com">
    <title>sometitle</title>



XElement currentLocation  = startElementParameter;
            foreach (string x in ("channel\\Title").Split('\\'))
            {
                if (condition1 == false)
                {
                    continue;
                }
                else if (condition2 == false)
                {
                    break;
                }
                else
                {
                    // This is returning null.
                    currentLocation = currentLocation.Element(x);
                }
            }

谢谢!

编辑:XML 粘贴不正确。

【问题讨论】:

    标签: c# rss


    【解决方案1】:

    XElement.Element 方法需要一个 XName。

    您正在传递一个字符串,这意味着它被隐式转换为没有附加命名空间的 XName。

    换句话说,您的XElement.Element() 调用要求没有命名空间的名为channel 的元素,但由于@ 上的xmlns="http://purl.org/rss/1.0/" 属性,您的示例XML 中的channel 元素位于http://purl.org/rss/1.0/ 命名空间中987654328@.

    要在存在命名空间时正确提取通道元素,您可以这样做:

    var ns = XNamespace.Get("http://purl.org/rss/1.0/");
    currentLocation = currentLocation.Element(ns + "channel");
    

    在 XNamespace 和字符串上使用 + 运算符创建带有附加命名空间的 XName。

    要支持本文档的两种样式,请检查 XDocument.Root 是否具有具有预期 URI 值的命名空间。您可以为此使用XElement.GetDefaultNamespace()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-02
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多