8
votes

Pourquoi NAMESPACAMAGER n'utilise-t-il pas non plus de défautNamespace lors de l'utilisation d'aucun préfixe dans XPATH

Quand je veux traverser mon xmldocument à l'aide de XPath, je suis venu au problème qu'il y avait beaucoup d'espaces de noms laids dans le document. J'ai donc commencé à utiliser un nomspAcemanager code> avec le XPath.

Le Xml ressemble à ceci p> xxx pré>

maintenant, à partir de ce que je vois de ce document, "urne: schémas-microsoft-com: bureau: feuille de calcul" code> est L'espace de noms par défaut, car il est assis sur l'élément racine. P>

SO, naïvement, j'ai configuré mon nomspAcemanager code> comme ceci: p>

foreach (XmlNode row in document.SelectNodes("/Workbook/Worksheet[1]/Table/Row", manager))


4 Réponses :


6
votes

du XPath 1.0 SPEC :

Un nom de QName dans le test de nœud est étendu à un nom étendu à l'aide des déclarations d'espace de noms à partir du contexte d'expression. Ceci est la même manière que l'expansion est effectuée pour les noms de type d'élément dans les balises de début et de fin, sauf que l'espace de noms par défaut déclaré avec XMLNS n'est pas utilisé : si le QName n'a pas de préfixe, puis L'ESPACE URI est NULL (ceci est la même manière que les noms d'attribut sont développés). C'est une erreur si le QName a un préfixe pour lequel il n'y a pas de déclaration d'espace de noms dans le contexte d'expression.

Ce n'est donc pas une question concernant nomspacemanager mais plutôt la façon dont XPath est défini sur le fonctionnement.


Le point qu'il vous manque, c'est que les préfixes que vous utilisez dans votre nomspacemanager ne doivent pas être quelque chose comme ceux de votre document XML. Vous pouvez utiliser le préfixe xcel pour urn: schemas-microsoft-com: bureau: Excel Si vous le souhaitez, et le préfixe SP pour URN: Schemas-Microsoft-Com: Bureau: feuille de calcul . En fait, vous attribuez déjà un préfixe pour cette urne dans votre gestionnaire d'espace de noms, vous permettant ainsi d'utiliser cela: xxx


Concernant cette question:

Qu'est-ce que c'est bien définir l'espace de noms par défaut sur le gestionnaire si je ne peux même pas y accéder lors de la recherche de nœuds?

Le bien est que xmlnamespacakerger est utilisé pour plus que d'évaluer xpath. Par exemple, il pourrait être utilisé pour garder une trace des espaces de noms dans un document XML, dans lequel il existe un concept d'espaces de noms par défaut.


0 commentaires

2
votes

Je ne peux pas répondre à votre dernière question ("quelle est la bien ...") Sauf si peut-être que cela aide dans des situations non XPath. Mais en ce qui concerne "comment puis-je accéder aux nœuds dans l'espace de noms par défaut, si ce n'est pas l'utilisation d'un préfixe les définit dans un espace de noms vide?", La réponse est que vous devez utiliser un préfixe.

Donc, dans ce cas, puisque vous avez déclaré le préfixe ss comme étant lié à l'espace de noms dont l'URI est urne: schemas-Microsoft-com: bureau: feuille de calcul , qui est la même espace de noms que l'espace de noms par défaut, vous pouvez simplement Utilisez le préfixe SS dans votre expression XPath: xxx


0 commentaires

4
votes

La réponse de Jlrishede est correcte pour accéder aux nœuds dans l'espace de noms par défaut (c.-à-d. Mapper toujours un préfixe à l'espace de noms par défaut dans le xmlnamespacaker ).

lire tout le contexte du lien de votre citation ( msdn xmlnamespacakemerager.addnamespace ) Il est indiqué que le préfixe" vide "par défaut n'est pas utilisé dans les expressions XPath.

préfixe Type: System.string

Le préfixe à associer à l'espace de noms étant ajouté. Utilisez string.empty pour ajouter un espace de noms par défaut.>

Remarque Si le xmlnamespacakemanager sera utilisé pour résoudre les espaces de noms dans une expression de langue de chemin XML (XPATH), un préfixe doit être spécifié . Si une expression XPath n'inclut pas de préfixe, on suppose que l'identificateur de ressource uniforme de l'espace de noms (URI) est l'espace de noms vide. Pour plus d'informations sur les expressions XPath et le XMLNAMESPACACEMANAGER, reportez-vous aux méthodes XMLNode.SelectNodes et XPathExpression.setContext.


0 commentaires

0
votes

Je trouve que si vous supprimez l'espace de noms par défaut

xmlns = "urne: schémas-microsoft-com: bureau: feuille de calcul" <-Deletet it

ou rendre l'espace de noms par défaut null

xmlns = ""

Lorsque vous utilisez XPath pour rechercher, il n'aura pas besoin d'ajouter un espace de noms à xpath avant "l'élément sans espace de nom".

donc, est donc l'espace de noms par défaut déclarent vraiment important,? < / p>

Si non, je peux supprimer la déclaration d'espace de noms par défaut, il permet d'utiliser XPath pour rechercher beaucoup plus plus facilement car il n'est pas nécessaire d'ajouter un espace de nom comme d'habitude.

J'ai essayé une autre manière Pour ajouter un espace de noms par défaut avec un nom "Par défaut" qui donne par moi-même,

et j'écris une méthode qui peut automatiquement ajouter "par défaut" à l'élément sans autre espace de noms: xxx

Il peut tourner

AA / XX: CC / DD / HH: GG / BB "

à

"Par défaut: AA / XX: CC / Par défaut: DD / HH: GG / Par défaut: BB"


0 commentaires