解析RSS xml的问题

时间:2010-03-30 01:43:13

标签: c# rss

我在使用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没有正确粘贴。

1 个答案:

答案 0 :(得分:0)

XElement.Element方法需要XName。

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

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

要在命名空间存在时正确提取通道元素,您可以执行以下操作:

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

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

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