2011-09-16 151 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。 –