0

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

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

我想获取 myDate>= 给定日期和 myParameter=given 参数的所有 MESSAGE 节点。即类似的东西:

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

是否可以使用 XPath 来做到这一点?

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

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

//MESSAGE[myDate < 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。此查询具有前缀、变量或用户定义的函数。

4

3 回答 3

2

它可以纯粹在 XPATH 中完成:

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

[未经测试]

于 2012-06-21T12:33:10.067 回答
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/

于 2012-06-21T12:19:20.323 回答
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;
于 2012-06-21T12:17:31.633 回答