0

したがって、特定のノードですべての結果を選択できますが、次のXMLがあります

<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>

ストップ名がCysleysFarm(リクエストのみ)の場合にstopIdを選択したい場合、どうすればよいですか?

私は次のコードを持っています:

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

編集2

アイテムはリストボックスに入れる必要がありますか?URLで使用するには、文字列形式の値が必要です。

4

3 に答える 3

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();
于 2012-04-21T18:10:42.147 に答える
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;
}
于 2012-04-21T19:33:27.320 に答える
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);
}
于 2013-09-24T18:17:37.450 に答える