2011-10-10 92 views
0

我想用XPath来进行一个简单的搜索,这是我的XMLC#XPath的搜索

enter image description here

,我想搜索的时间节点,并返回标识节点的值作为结果。

这是到目前为止我的代码,但我不得到任何结果

XmlNodeList nList = xmlDoc.SelectNodes("//spEvents:Time[. = '" + eventId + "']/parent::node()/spEvents:Times/spEvents:EventTime/spEvents:Time", xmlnsManager); 

(请注意我用的命名空间)

感谢 KB

@乔恩,我的代码是工作的罚款使用XML到LINQ,如下所示

return (from feed in xmlDoc_Spektrix.Descendants("Event") 
           from et in feed.Element("Times").Elements("EventTime") 
           where Convert.ToDateTime(et.Element("Time").Value).ToShortDateString() == Convert.ToDateTime(dt).ToShortDateString() 
       select feed.Element("Id").Value).ToList(); 

但由于名称空间e介绍到xml饲料,我的代码不再起作用,这就是为什么我不得不切换到xpath

此代码用于正常工作,没有人知道为什么上面的代码停止使用名称空间?

+1

您是否在.Net 2.0或3.5+以上可以访问XLinq? – user7116

+0

我们无法在此屏幕截图中看到名称空间。请将您的XML作为文本发布。 –

+3

你必须使用xpath吗?我个人使用LINQ到XML,我觉得这更容易理解和得到正确的... –

回答

3

“引入命名空间打破了我的查询”的正确响应不是“更改技术”,而是“修复查询”。这与LINQ很容易XML:一个XElementDateTime

// I'm guessing the namespace *really* has the http part on... 
XNamespace ns = "http://system.spektrix.com/api/v1/events"; 

return (from feed in xmlDoc_Spektrix.Descendants(ns + "Event") 
     from et in feed.Element(ns + "Times").Elements(ns + "EventTime") 
     where (DateTime) et.Element(ns + "Time") == dt 
     select feed.Element(ns + "Id").Value).ToList(); 

注意简化(和文化变化面前更正确的)转换为好。

+0

我没有测试您的解决方案还没有,但我猜它是正确的,我希望我发布这个小时前,我不相信我错过了那一个!非常感谢 –

+1

@kb:我还没有看到一个API,这使得XML命名空间是容易的LINQ合作,XML确实:) –

+0

万分感谢,作品一种享受,LINQ我也爱你 –

0

根据你的示例,如果我正确理解你的问题,这个XPath可以工作。如果你想尝试XPath,你可以用FirePath插件在FireFox中打开你的xml。

//spEvents:Id[./following-sibling::spEvents:Times/spEvents:time[contains(text(),'yourtimetext')]]