Получить значение из node с тем же именем

Я хотел бы получить информацию из XML файла, однако способ форматирования довольно странный. Вот оно...

<!--?xml version="1.0"?-->
<careers>
 <careerlist>
 
 
 </careerlist>
 <careerlist>
 <careername>Cook</careername>
 <careerdescription>Cooks food for people</careerdescription>
 </careerlist>
</careers>

Я бы хотел получить второе значение, которое было бы Cook и описанием, которое является Cooks для людей, но вместо этого я получаю только пустой node. Например...

public string CareerDescription(string CareerFile)
 {
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(CareerFile);
 string Description = xmlDoc.SelectSingleNode("Careers/CareerList/CareerDescription").InnerText;
 return Description;
 }

Как бы выбрать второй node вместо первого?

3 ответа

Вы можете использовать индекс в выражении XPath:

xmlDoc.SelectSingleNode("Careers/CareerList[2]/CareerDescription").InnerText

Лично я бы использовал LINQ to XML, подумайте:

var doc = XDocument.Load(CareerFile);
return doc.Root
 .Elements("CareerList")
 .ElementAt(1) // 0-based
 .Element("CareerDescription")
 .Value;


Вместо SelectSingleNode вы должны использовать SelectNodes: он вернет XmlNodeList nodeList. Затем вы должны взять InnerText элемента из этого списка node с индексом [1];

public string CareerDescription(string CareerFile)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(CareerFile);
string Description = xmlDoc.SelectNodes("Careers/CareerList/CareerDescription")[1].InnerText;
return Description;
}

Подробнее см. документацию по этому методу в MSDN: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectnodes%28v=vs.71%29.aspx


Просто прямой метод LINQ to XML (и поскольку это LINQ, я предпочитаю этот способ намного больше, чем "стандартное" использование XmlDocument при поддержке XPath):

return XDocument.Load(CareerFile)
 .Descendants("CareerDescription").Skip(1).First().Value;

licensed under cc by-sa 3.0 with attribution.