Esto no parece que debería ser difícil, pero estoy atascado actualmente. Estoy tratando de obtener los valores de atributo para un atributo particular de los nodos que coinciden con una cadena de consulta XPath determinada. Esto es lo que tengo hasta ahora:Obtiene valores de atributo de nodos XML coincidentes utilizando la consulta XPath
public static IEnumerable<string> GetAttributes(this XmlDocument xml,
string xpathQuery, string attributeName)
{
var doc = new XPathDocument(new XmlNodeReader(xml));
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr = nav.Compile(xpathQuery);
XPathNodeIterator iterator = nav.Select(expr);
while (iterator.MoveNext())
{
XPathNavigator curNav = iterator.Current;
if (curNav.HasAttributes)
{
XmlNode curNode = ((IHasXmlNode)curNav).GetNode();
if (null != curNode)
{
XmlAttribute attrib = curNode.Attributes[attributeName];
if (null != attrib)
{
yield return attrib.Value;
}
}
}
}
}
Esto arroja actualmente una excepción:
System.InvalidCastException: No se puede convertir objeto de tipo 'MS.Internal.Xml.Cache.XPathDocumentNavigator' escribir ' System.Xml.IHasXmlNode '.
¿Estoy yendo sobre esto mal? ¿Hay alguna forma más sencilla de obtener los valores de los atributos de los nodos coincidentes?
¿Por qué no utilizar LinqToXml? Esto reduciría considerablemente el ruido, a menos que me falte alguna razón por la que no puedas hacer esto con Linq. –