2009-10-18 5 views
2

Comment node.XPathSelectElement() et node.XPathSelectElements() se comportent-ils lorsque la sélection n'est pas un NodeSet ou un NodeSet contenant des éléments non-Elements? Par exemple, retournent-ils toujours quelque chose ou peuvent-ils lancer des exceptions? Est-ce que la valeur de retour peut être nulle ou est-ce toujours un IEnumerable? Le XML recherché est constant:Valeur de retour de XPathSelectElement (s) dans C#

<a> 
    <b c="d"/> 
    <e>fgh</e> 
    <e>xyz</e> 
<!-- comment --> 
    <b/> 
</a> 

Pour illustrer cela, voici quelques chaînes XPath; Je vous serais reconnaissant pour le comportement des deux XPathSelectElement et XPathSelectElements dans chaque cas (j'ai mis la NodeSet XSLT attendue ci-dessous - s'il vous plaît commentaire si vous n'êtes pas d'accord)

  1. //a
  2. //b
  3. //b[1]
  4. //c
  5. //@c
  6. //b | //@c
  7. //e/text()
  8. //comment()
  9. count(//b)

et le rendement attendu valeurs

  1. 1 élément
  2. deux éléments
  3. 1 élément
  4. 0 éléments
  5. 1 noeud d'attribut
  6. 2 éléments et 1 attribut
  7. 2 nœuds de texte
  8. 1 noeud de commentaire
  9. le nombre entier 2

Si le XPath ne renvoie pas un IEnumerable d'éléments (de XPathSelectElements) ou un seul élément (XPathSelectElement) est une indication donnée ou l'échec est-il silencieux?

Répondre

2

Si vous informiez une expression XPath valide qui évalue à XElements, vous obtiendrez:

 Linq.XPathSelectElement   Linq.XPathSelectElements 
     DOM.SelectSingleNode    DOM.SelectNodes 
     -----------------------   ------------------------ 
"//c"    null       .Count == 0 
"//a"   XElement      .Count == 1 

Si vous essayez d'envoyer un XPath correspondant à un type de noeud différent de celui XElement, vous obtiendrez un InvalidOperationException; Si vous n'êtes pas sûr du retour de XPath et que vous voulez éviter d'attraper des exceptions, vous pouvez choisir node.XPathEvaluate()

Questions connexes