2010-03-30 72 views
2

我有一个问题,使用Linq XML分析以下XML。我正在做的是让元素检查是否它是我想要的,然后移动到下一个。我很确定它与xmlns有关,但我需要这个代码来处理这个风格和正常风格的RSS提要(没有xmlns)。有任何想法吗?问题解析RSS xml

<?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没有粘贴正确。

回答

0

XElement.Element方法需要一个XName。

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

换句话说,你XElement.Element()呼叫请求命名channel没有命名空间的元素,但在你的示例XML的channel元素都在http://purl.org/rss/1.0/命名空间由于对<rdf:RDF>xmlns="http://purl.org/rss/1.0/"属性。

要正确拉出通道元素时命名空间是存在,你可以这样做:

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

使用上的XNamespace +运算符和一个字符串创建了一个附加的命名空间中的XName的。

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