我可以在不使用where命令的情况下获得以下提要,当我将where命令放入其中时,我无法使它工作。
1231是routeId可以成为的值,也是routeId在获得select命令时的值。
有什么原因导致失败吗?
还曾尝试:
where s.Element("routeId").Value.Contains("1231") 和
where s.Attribute("routeId").Value == "1231"和
where s.Element("routeId").Value == ("1231")当前代码:
var routeNames = (from n in doc.Descendants(ns + "Service")
select new RootContainer
{
Service = (from s in n.Element(ns + "routes").Elements(ns + "Route")
// where (n.Elements(ns + "timetables").Elements(ns + "Timetable").Elements(ns + "daysOfWeek").ToString() == "Sundays and Public Holidays from 14 September")
where s.Element("routeId").Value == "1231"
select new Services
{
RouteName = s.Element(ns + "routeName").Value, RouteId = s.Element(ns + "routeId").Value,
// Routes = s.Element(ns + "routeId").Attribute("1231").Value
// TimetableName = s.Element(ns + "timetables").Element(ns + "Timetable").Element(ns + "daysOfWeek").Value,
}).ToList()
}).First();这是完整的XML。
我的目标是得到每一个时间表:星期一到星期五,星期六和星期日.或大意的文字,因为这改变了这个提要中包含的内容。
<Service z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/BusExpress.ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<routes>
<Route z:Id="i4">
<routeId>1231</routeId>
<routeMap>
<RouteMap z:Id="i6">
<routeLineCenterLat>50.82754</routeLineCenterLat>
<routeLineCenterLng>-0.166640326</routeLineCenterLng>
<routeLineColour>#0000FF</routeLineColour>
<routeLineFilename i:nil="true" />
<routeLineInitialZoom>12</routeLineInitialZoom>
<routeMapId>379</routeMapId>
<routeMapName>1 Whitehawk - Mile Oak</routeMapName>
</RouteMap>
</routeMap>
<routeName>1 Whitehawk - Mile Oak</routeName>
<route_stop />
<route_stop_stop />
<route_stop_timetable_stop />
<service z:Ref="i1" />
<timetables>
<Timetable z:Id="i8">
<dateAdded>2013-08-27T13:22:26.703</dateAdded>
<daysOfWeek>Sundays and Public Holidays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>2</relativePosition>
<route z:Ref="i4" />
<route_stop_timetable_stop />
<timetableDescription>Whitehawk - County Hospital - Brighton - Hove - Portslade - Mile Oak</timetableDescription>
<timetableFilename>timetable_635132065412586254_0.xml</timetableFilename>
<timetableId>10121</timetableId>
<timetableName>1 1A Whitehawk - Mile Oak</timetableName>
<timetable_stop />
<validDates i:nil="true" />
</Timetable>
<Timetable z:Id="i10">
<dateAdded>2014-03-26T13:09:06.233</dateAdded>
<daysOfWeek>Mondays to Fridays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>0</relativePosition>
<route z:Ref="i4" />
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i5" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
<route_stop_timetable_stop />
<timetableDescription>Whitehawk - County Hospital - Brighton - Hove - Portslade - Mile Oak</timetableDescription>
<timetableFilename>timetable_635314361366540988_0.xml</timetableFilename>
<timetableId>10315</timetableId>
<timetableName>1 1A Whitehawk - Mile Oak</timetableName>
<timetable_stop />
<validDates />
</Timetable>
<Timetable z:Id="i12">
<dateAdded>2014-03-26T13:09:53.017</dateAdded>
<daysOfWeek>Saturdays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>1</relativePosition>
<route z:Ref="i4" />
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i5" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
<route_stop_timetable_stop />
<timetableDescription>Whitehawk - County Hospital - Brighton - Hove - Portslade - Mile Oak</timetableDescription>
<timetableFilename>timetable_635314361868081863_0.xml</timetableFilename>
<timetableId>10317</timetableId>
<timetableName>1 1A Whitehawk - Mile Oak</timetableName>
<timetable_stop />
<validDates />
</Timetable>
</timetables>
<validDestination>Mile Oak</validDestination>
</Route>
<Route z:Id="i14">
<dateEffectiveFrom>2012-09-01T00:00:00</dateEffectiveFrom>
<dateEffectiveTo i:nil="true" />
<isLive>true</isLive>
<relativePosition>0</relativePosition>
<routeDescription i:nil="true" />
<routeId>1235</routeId>
<routeMap>
<RouteMap z:Id="i16">
<routeLineCenterLat>50.82936</routeLineCenterLat>
<routeLineCenterLng>-0.1599884</routeLineCenterLng>
<routeLineColour>#0000FF</routeLineColour>
<routeLineFilename i:nil="true" />
<routeLineInitialZoom>12</routeLineInitialZoom>
<routeMapId>383</routeMapId>
<routeMapName>1 Mile Oak - Whitehawk</routeMapName>
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i15" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
</RouteMap>
</routeMap>
<routeName>1 Mile Oak - Whitehawk</routeName>
<route_stop />
<route_stop_stop />
<route_stop_timetable_stop />
<service z:Ref="i1" />
<timetables>
<Timetable z:Id="i18">
<dateAdded>2013-08-27T13:22:26.72</dateAdded>
<daysOfWeek>Sundays and Public Holidays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>2</relativePosition>
<route z:Ref="i14" />
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i15" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
<route_stop_timetable_stop />
<timetableDescription>Mile Oak - Portslade - Hove - Brighton - County Hospital - Whitehawk</timetableDescription>
<timetableFilename>timetable_635132065412586254_1.xml</timetableFilename>
<timetableId>10122</timetableId>
<timetableName>1 1A Mile Oak - Whitehawk</timetableName>
<timetable_stop />
<validDates i:nil="true" />
</Timetable>
<Timetable z:Id="i20">
<dateAdded>2014-03-26T13:09:06.297</dateAdded>
<daysOfWeek>Mondays to Fridays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>0</relativePosition>
<route z:Ref="i14" />
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i15" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
<route_stop_timetable_stop />
<timetableDescription>Mile Oak - Portslade - Hove - Brighton - County Hospital - Whitehawk</timetableDescription>
<timetableFilename>timetable_635314361366540988_1.xml</timetableFilename>
<timetableId>10316</timetableId>
<timetableName>1 1A Mile Oak - Whitehawk</timetableName>
<timetable_stop />
<validDates />
</Timetable>
<Timetable z:Id="i22">
<dateAdded>2014-03-26T13:09:53.047</dateAdded>
<daysOfWeek>Saturdays</daysOfWeek>
<isLive>false</isLive>
<relativePosition>1</relativePosition>
<route z:Ref="i14" />
<routeReference xmlns:a="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses">
<a:EntityKey z:Ref="i15" xmlns:b="http://schemas.datacontract.org/2004/07/System.Data" />
</routeReference>
<route_stop_timetable_stop />
<timetableDescription>Mile Oak - Portslade - Hove - Brighton - County Hospital - Whitehawk</timetableDescription>
<timetableFilename>timetable_635314361868081863_1.xml</timetableFilename>
<timetableId>10318</timetableId>
<timetableName>1 1A Mile Oak - Whitehawk</timetableName>
<timetable_stop />
<validDates />
</Timetable>
</timetables>
<validDestination>Whitehawk, Brighton Stn</validDestination>
</Route>
</routes>
<serviceAbbreviatedName />
<serviceDescription>Whitehawk - County Hospital - City Centre - Hove - Portslade - Mile Oak</serviceDescription>
<serviceId>1149</serviceId>
<serviceName>1</serviceName>
<serviceText>Whitehawk - Mile Oak</serviceText>
</Service>发布于 2014-10-18 21:43:16
除了@KooKiz已经解释了如何安全检查routeId元素值之外,您的查询还遗漏了使用所需的XNamespace for routeId元素:
where (string)s.Element(ns+"routeId") == "1231"发布于 2014-10-18 19:30:29
查询失败,因为并非所有Route节点都有routeId子节点。在这种情况下,s.Element("routeId")返回null,因此在尝试读取Value属性时会引发异常。一个方便的解决方法是将元素强制转换为string,而不是调用Value属性:
where (string)s.Element("routeId") == "1231"https://stackoverflow.com/questions/26442201
复制相似问题