Obtenir des valeurs d'attribut à partir de nœuds XML correspondants à l'aide de la requête XPath
Cela ne semble pas comme il doit être difficile, mais je suis bloqué actuellement. Je vais essayer d'obtenir les valeurs d'attribut d'un attribut en particulier à partir des nœuds qui correspondent à une requête XPath chaîne. Voici ce que j'ai à ce jour:
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;
}
}
}
}
}
Actuellement, cela déclenche une exception:
Système.InvalidCastException: Impossible de convertir l'objet de type " MME Internes.Xml.Le Cache.XPathDocumentNavigator' de type 'System.Xml.IHasXmlNode'.
Vais-je au sujet de ce mal? Est-il un moyen plus simple pour obtenir les valeurs d'attribut à partir de la correspondance des nœuds?
source d'informationauteur Sarah Vessels
Vous devez vous connecter pour publier un commentaire.
Pour le code xml suivant:
Vous pouvez obtenir la "valeur" du texte avec ce code C#
Si vous êtes en utilisant .net 3.5 ou ultérieure, vous pouvez utiliser linq to Xml
Pour un document xml donné
Suivantes expression linq, vous obtiendrez les valeurs du "nom" attributs de tous les storedProcedure nœud
vous pouvez également utiliser la syntaxe XPath. Dans le code ci-dessous la variable de nœud détient le noeud identifié par le "usp_GET_HOME_PAGE_DATA" nom et ensuite les attributs de variable contient tous les nœuds enfants (les attributs) du noeud choisi et c'est les enfants.
solution pour le problème initial de l'exception levée...
devrait être remplacé par...
Ce ne sera pas jeter l'exception et le code fonctionne très bien.