c# - nodos - Obtener valor del nodo con el mismo nombre
obtener valor de un nodo xml c# (3)
Me gustaría recuperar información de un archivo XML, sin embargo, la forma en que está formateado es bastante extraño. Aquí está...
<?xml version="1.0"?>
<Careers>
<CareerList>
<CareerName></CareerName>
<CareerDescription></CareerDescription>
</CareerList>
<CareerList>
<CareerName>Cook</CareerName>
<CareerDescription>Cooks food for people</CareerDescription>
</CareerList>
</Careers>
Me gustaría obtener el 2º valor, que sería Cook y la descripción que es comida de Cook para las personas, pero en cambio solo obtengo el nodo vacío. Por ejemplo...
public string CareerDescription(string CareerFile)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(CareerFile);
string Description = xmlDoc.SelectSingleNode("Careers/CareerList/CareerDescription").InnerText;
return Description;
}
¿Cómo seleccionaría el segundo nodo en lugar del primero?
En lugar de SelectSingleNode
, debe usar SelectNodes
: devolverá XmlNodeList nodeList
. Luego debe tomar el texto InnerText
del elemento de esa lista de nodos con índice [1];
public string CareerDescription(string CareerFile)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(CareerFile);
string Description = xmlDoc.SelectNodes("Careers/CareerList/CareerDescription")[1].InnerText;
return Description;
}
Consulte la documentación de este método en MSDN para obtener más detalles: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectnodes%28v=vs.71%29.aspx
Puede usar un índice en su expresión XPath:
xmlDoc.SelectSingleNode("Careers/CareerList[2]/CareerDescription").InnerText
Personalmente, usaría LINQ to XML en su lugar, pero:
var doc = XDocument.Load(CareerFile);
return doc.Root
.Elements("CareerList")
.ElementAt(1) // 0-based
.Element("CareerDescription")
.Value;
Simplemente una forma directa de rutina LINQ a XML (y porque es LINQ, prefiero mucho más que el uso "estándar" de XmlDocument con el soporte de XPath):
return XDocument.Load(CareerFile)
.Descendants("CareerDescription").Skip(1).First().Value;