2011-09-16 149 views
4

我試圖抓住TopicName我應該如何後,去嘗試不同的組合,但不知何故,我無法得到TopicName下面是我的源codee ...從讀取XML文件節點的XMLDocument

XmlDocument xdoc = new XmlDocument();//xml doc used for xml parsing 

    xdoc.Load(
     "http://latestpackagingnews.blogspot.com/feeds/posts/default" 
     );//loading XML in xml doc 

    XmlNodeList xNodelst = xdoc.DocumentElement.SelectNodes("content");//reading node so that we can traverse thorugh the XML 

    foreach (XmlNode xNode in xNodelst)//traversing XML 
    { 
     //litFeed.Text += "read"; 
    } 

示例XML文件

<content type="application/xml"> 
<CatalogItems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="sitename.xsd"> 
     <CatalogSource Acronym="ABC" OrganizationName="ABC Corporation" /> 
     <CatalogItem Id="3212" CatalogUrl="urlname"> 
      <ContentItem xmlns:content="sitename.xsd" TargetUrl="url"> 
      <content:SelectionSpec ClassList="" ElementList="" /> 
      <content:Language Value="eng" Scheme="ISO 639-2" /> 
      <content:Source Acronym="ABC" OrganizationName="ABC Corporation" /> 
      <content:Topics Scheme="ABC"> 
       <content:Topic TopicName="Marketing" /> 
       <content:Topic TopiccName="Coverage" /> 
      </content:Topics> 
      </ContentItem> 
     </CatalogItem> 
     </CatalogItems> 
    </content> 
+0

您新近更新的示例代碼中的Url產生與您的示例x​​ml完全不同的Xml,在該xml中沒有「CatalogItem」或內容名稱空間。 – BrokenGlass

回答

8

在XML的Topic節點都是content命名空間 - 你需要聲明和使用XML命名空間的代碼,那麼你可以使用SelectNodes()搶感興趣的節點 - 這爲我工作:

​​

正如對比看多麼容易,這將是使用LINQ以XML:

XDocument xdoc = XDocument.Load("test.xml"); 
XNamespace ns = "sitename.xsd"; 
string topic = xdoc.Descendants(ns + "Topic") 
        .Select(x => (string)x.Attribute("TopicName")) 
        .FirstOrDefault(); 

要獲得所有的主題可以用替換最後一條語句:

var topics = xdoc.Descendants(ns + "Topic") 
       .Select(x => (string)x.Attribute("TopicName")) 
       .ToList(); 
+0

如果我使用#1解決方案,我得到這個錯誤'命名空間前綴內容未定義# –

+0

@Abu:我測試了這個和代碼對我來說工作正常 - 你包括命名空間管理器? – BrokenGlass

+0

此外,這假定你已經加載你的xml到'xdoc' – BrokenGlass

0

如果你只需要一個特定的元素,那麼我會使用XPath:

這是在C#中使用XPath指南: http://www.codeproject.com/KB/XML/usingXPathNavigator.aspx

而這,將讓您在主題的集合查詢:

//content/CatalogItems/CatalogItem/ContentItem/content:Topics/content:Topic 

你可以根據你想實現什麼是調整此查詢,抓住只是一個特定TopicName值:

//content/CatalogItems/CatalogItem/ContentItem/content:Topics/content:Topic/@TopicName 

XPath很容易學習。我沒有事先的知識就很快完成了這樣的工作。

你可以在這裏貼上您的XML和XPath查詢來測試您的疑問:

http://www.bit-101.com/xpath/

+0

我試過第一個解決方案,但沒有工作......它回退0計數。 –

+0

如果你在xpath工具中複製你的XML和那個查詢,你會發現它應該返回一個項目,所以不知道發生了什麼問題。 – AaronLS

+0

你會告訴我我嘗試在'www.bit-101.com/xpath'工具中粘貼xml的步驟嗎?在右側它說'未定義' –

0

下快速和骯髒的LINQ to XML代碼獲取您的TopicNames並將它們打印到控制檯上。

XDocument lDoc = XDocument.Load(lXmlDocUri); 

foreach (var lElement in lDoc.Element("content").Element(XName.Get("CatalogItems", "sitename.xsd")).Elements(XName.Get("CatalogItem", "sitename.xsd"))) 
{ 
    foreach (var lContentTopic in lElement.Element(XName.Get("ContentItem", "sitename.xsd")).Element(XName.Get("Topics", "sitename.xsd")).Elements(XName.Get("Topic", "sitename.xsd"))) 
    { 
      string lTitle = lContentTopic.Attribute("TopicName").Value; 
      Console.WriteLine(lTitle); 
    } 
} 

它會已經短了很多,如果不是對所有的命名空間:)(而不是「XName.Get」你只需使用元素的名稱)。

+0

首先拋出一個錯誤'foreach'錯誤是'object引用未設置爲對象的實例' –

+0

我更新了我的問題 –

+0

我的代碼適用於您的示例,其中可能沒有內容節點的通用XML,例如,您只需要詢問lDoc.Element(「內容「)!= null。 –