我有这个xml:
<TimePeriodDataSet xmlns="Dummy datas">
<TimePeriods>
<WPRD_UID>Dummy datas</WPRD_UID>
<WPRD_START_DATE>2013-09-19T00:00:00+02:00</WPRD_START_DATE>
<WPRD_FINISH_DATE>Dummy datas</WPRD_FINISH_DATE>
<WPRD_NAME>Dummy datas</WPRD_NAME>
<WPRD_STATE_ENUM>Dummy datas</WPRD_STATE_ENUM>
<TReadonly>Dummy datas</TReadonly>
</TimePeriods>
<TimePeriods>
<WPRD_UID>Dummy datas</WPRD_UID>
<WPRD_START_DATE>2013-10-01T00:00:00+02:00</WPRD_START_DATE>
<WPRD_FINISH_DATE>Dummy datas</WPRD_FINISH_DATE>
<WPRD_NAME>Dummy datas</WPRD_NAME>
<WPRD_STATE_ENUM>Dummy datas</WPRD_STATE_ENUM>
<TReadonly>Dummy datas</TReadonly>
</TimePeriods>
</TimePeriodDataSet>
这段代码选择节点:
XmlNamespaceManager mgr = new XmlNamespaceManager(contentTS.NameTable);
mgr.AddNamespace("nm", contentTS.DocumentElement.NamespaceURI);
//var nodeListTsP = contentTS.SelectNodes("//nm:TimePeriodDataSet/nm:TimePeriods", mgr);
var nodeListTsP = contentTS.SelectNodes("//nm:TimePeriodDataSet/nm:TimePeriods" + "[nm:WPRD_START_DATE >=" + bDateX + "]", mgr);
当我使用评论的SelectNodes时,它可以工作。 nodeListTsP包含2个元素。但是当我使用第二个时,它什么都没包含! (bDateX值为&#34; 2012-04-02&#34;)。通常,nodeList应该再次包含2个元素,没有?
您有解释或解决方案吗?
答案 0 :(得分:0)
使用单个XPath 1.0表达式无法完成此操作。标准.NET库只实现1.0标准 - 要使用2.0,您需要使用第三方库。看过代码之后我说最简单的方法是使用XPath获取所有项元素,然后使用C#进行过滤 - 即获取date子元素的值,将其转换为日期时间使用DateTime.Parse,然后在C#代码中进行比较。
答案 1 :(得分:0)
.NET的内置类不支持XPath 2.0。另一种方法是使用LINQ to XML,例如:
var date=DateTimeOffset.Parse("2013-09-19T00:00:00+02:00");
var root=XElement.Parse(input);
XNamespace ns = "Dummy datas";
var periods = from period in root.Elements(ns + "TimePeriods")
where DateTimeOffset.Parse(period.Element(ns+"WPRD_START_DATE").Value) > date
select period;
或者
var periods = from period in root.Elements(ad + "TimePeriods")
let dateElt=period.Element(ad+"WPRD_START_DATE")
where DateTimeOffset.Parse(dateElt.Value) > date
select period;