C#:使用XPath获取所需的节点

时间:2012-06-21 12:13:53

标签: c# xpath xmldocument

我有下一个结构的XmlDocument对象:

<ROOT>
<MESSAGE>
 <some_fields />
 <myDate>
 <myParameter>
</MESSAGE>
<MESSAGE>
 ...
</ROOT>

我想获取所有MESSAGE节点,其中myDate&gt; =给定日期和myParameter =给定参数。 即类似的东西:

MyDoc.SelectNodes("/ROOT/MESSAGE..")

是否可以使用XPath来完成?

=================

行。 myDate已经输入xs:dateTime。但现在我有下一个例外:

  

// MESSAGE [myDate&lt; xs:dateTime(2012-06-22T11:17:44)]'无效   合格的名字。

代码是:

 XmlNodeList nodeList = MyXmlDocument.SelectNodes("//MESSAGE[myDate < xs:dateTime(" + givenDateTime + ")]");

即使使用

也无效
"//MESSAGE[xs:dateTime('2012-06-22T11:47:32')=xs:dateTime('2012-06-22T11:47:32')]"

然后我有System.Xml.XPath.XPathException:

  

需要命名空间管理器或XsltContext。这个查询有一个前缀,   变量或用户定义的函数。

3 个答案:

答案 0 :(得分:2)

它可以完全在XPATH中完成:

MyDoc.SelectNodes("//MESSAGE[xs:date(./myDate@text()) > xs:date('given date') and myParameter[text()='given parameter']]")

[未测试]

答案 1 :(得分:1)

我建议使用LINQ。

你可以拥有像

这样的东西
var nodes = from node in XDoc.Root.Elements("MESSAGE")
            where (DateTime)node.Element("myDate") >= DateTime.Now
            select node;

这将选择myDate时间是当前DateTime或将来的节点元素。您可能希望进一步了解LINQ的XML解析。我发现它是XML解析的首选方法。

另一个例子:

var nodes = from node in XDoc.Root.Elements("MESSAGE")
                where (DateTime)node.Element("myDate") >= DateTime.Now
                && node.Element("myParameter").Value == "whatever"
                select node;

答案 2 :(得分:1)

是的,这是非常有可能的。请通过以下链接获取您需要的所有操作员。

http://msdn.microsoft.com/en-us/library/aa226440(v=sql.80).aspx

http://www.javabeat.net/2009/03/how-to-query-xml-using-xpath/