我有下一个结构的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。这个查询有一个前缀, 变量或用户定义的函数。
答案 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/