2012-04-21 27 views
0

所以我能够选择一个特定节点下所有的结果,但我有下面的XML找到一个子节点并使用变量获取它的值。 Windows phone的

<ArrayOfStop> 
<Stop> 
    <StopName>Rajdutt Restaurant</StopName> 
    <route_stop /> 
    <route_stop_stop /> 
    <route_stop_timetable_stop /> 
    <stopId>6400</stopId> 
</Stop> 
<Stop> 
    <StopName>Cysleys Farm (by request only)</StopName> 
    <route_stop /> 
    <route_stop_stop /> 
    <route_stop_timetable_stop /> 
    <stopId>6401</stopId> 
</Stop> 
<ArrayOfStop> 

如果我要选择stopId如果stopname是Cysleys农场(只能通过申请获取)会怎样一个去了吗?

我有以下代码:

XDocument loadedData = XDocument.Load("People.xml"); 

var data = from query in loadedData.Descendants("ArrayOfStop") 
      select new Person 
      { 
      StopName = (string)query.Element("StopName") 
      }; 

listBox.ItemsSource = data; 

编辑:

var data = from query in loadedData.Descendants("ArrayOfStop") 
    where query.Element("StopName").Value == "Cysleys Farm (by request only)" 
    select query.Element("StopId").Value; 

select new Person 
{ 
    FirstName = (string)query.Element("StopName"), 
    //LastName = (string)query.Element("Long"), 
    //Age = (int)query.Element("age") 
}; 

listBox.ItemsSource = data; 

Visual Studio Editor

EDIT 2

执行项目需要进入一个列表框?因为我需要在网址上使用字符串格式的值。

回答

1
 var doc = 
      XDocument.Parse(
       "<ArrayOfStop><Stop><StopName>Rajdutt Restaurant</StopName><route_stop /><route_stop_stop /><route_stop_timetable_stop /><stopId>6400</stopId></Stop><Stop><StopName>Cysleys Farm (by request only)</StopName><route_stop /><route_stop_stop /><route_stop_timetable_stop /><stopId>6401</stopId></Stop></ArrayOfStop>"); 

     var list = (from item in doc.Descendants("Stop") 
        where (string) item.Element("StopName") == "Cysleys Farm (by request only)" 
        select (string)item.Element("stopId")).ToList(); 
+0

谢谢你,如果我把在如上所示,然后有错误,我不能把结果放入列表框。 – 2012-04-21 18:36:52

+0

你会得到什么样的错误? – MarcinJuraszek 2012-04-21 18:42:53

+0

已经放入图片,错误排序: 错误4 \t;预计\t 错误1 \t只有转让,电话,递增,递减和新对象表达式可以用作声明 \t \t 错误3 \t“查询”不在当前上下文 错误2 \t存在名称名称'select'在当前环节 – 2012-04-21 18:49:11

0

这会得到一个具有匹配值的单个节点。如果您期望多个节点具有匹配的值并且只需要第一个节点,则使用FirstOrDefault而不是SingleOrDefault

string search = "Cysleys Farm (by request only)"; 
var query = doc.Root.Elements() 
      .SingleOrDefault(x => x.Element("StopName").Value == search); 

if (query != null) 
{ 
    // if the query is not null, then this will be 
    // a single node with a root of <Stop> 
    string id = query.Element("stopId").Value; 
} 
0

做的另一种方法是:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("People.xml"); 

// Select the 'StopId' node whose StopName is 'Cysleys Farm (by request only)' 
XmlNode stopIdNode = xmlDoc.SelectSingleNode("/ArrayOfStop/Stop[StopName='Cysleys Farm (by request only)']/stopId"); 

string stopId = stopIdNode.InnerText; 

如果有多个节点具有相同StopName,那么你可以将它们存储在一个列表:

List<string> stopIdList = new List<string>(); 

foreach (XmlNode stopIdNode 
     in xmlDoc.SelectNodes 
     ("/ArrayOfStop/Stop[StopName='Cysleys Farm (by request only)']/stopId")) 
{ 
    stopIdList.Add(stopIdNode.InnerText); 
} 
相关问题