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 Le Xml ressemble à ceci p> maintenant, à partir de ce que je vois de ce document, SO, naïvement, j'ai configuré mon nomspAcemanager code> avec le XPath.
"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>
nomspAcemanager code> comme ceci: p>
foreach (XmlNode row in document.SelectNodes("/Workbook/Worksheet[1]/Table/Row", manager))
4 Réponses :
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é em>: 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). strong> 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. P> blockQuote>
Ce n'est donc pas une question concernant
nomspacemanager code> mais plutôt la façon dont XPath est défini sur le fonctionnement. P>
Le point qu'il vous manque, c'est que les préfixes que vous utilisez dans votrenomspacemanager code> ne doivent pas être quelque chose comme ceux de votre document XML. Vous pouvez utiliser le préfixe
xcel code> pour
urn: schemas-microsoft-com: bureau: Excel code> Si vous le souhaitez, et le préfixe
SP code> pour
URN: Schemas-Microsoft-Com: Bureau: feuille de calcul code>. 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: p>
xxx pré>
Concernant cette question: P>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? p> blockQuote>
Le bien est que
xmlnamespacakerger code> 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. P> p>
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 code> comme étant lié à l'espace de noms dont l'URI est
urne: schemas-Microsoft-com: bureau: feuille de calcul code>, qui est la même espace de noms que l'espace de noms par défaut, vous pouvez simplement Utilisez le préfixe
SS code> dans votre expression XPath: p>
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 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. P>
préfixe
Type: System.string P>
Le préfixe à associer à l'espace de noms étant ajouté. Utilisez string.empty pour ajouter un espace de noms par défaut.> P>
Remarque xmlnamespacaker code>). P>
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 p> blockQuote>
ou rendre l'espace de noms par défaut null p>
xmlns = "" p> blockQuote>
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". p>
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. P>
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, p>
et j'écris une méthode qui peut automatiquement ajouter "par défaut" à l'élément sans autre espace de noms: p>
xxx PRE> Il peut tourner p>
AA / XX: CC / DD / HH: GG / BB " P> blockQuote>
à p>
"Par défaut: AA / XX: CC / Par défaut: DD / HH: GG / Par défaut: BB" P> blockQuote> p>
"Quoi de bon est ..." - N'a-t-il pas eu pour vous que le
xmlnamespacemanager code> est utilisé par plus de morceaux de code que juste i> l'utiliser pour les requêtes XPath et dans Ces situations i> L'espace de noms par défaut pourrait être parfaitement utile?
Duplicaté possible: @damien: Pas besoin d'être impoli.
@Larsh - C'était un appareil rhétorique. Je suis désolé que vous sentais que c'était impoli, j'utilise souvent ce style de commentaire pour que les gens s'interrogent sur leurs hypothèses et que c'est la première fois que quelqu'un a affirmé que c'est impoli. Je suis désolé que cela vous a causé une infraction.
Bon commentaire, parce que; Ouais, ça a en fait. Je n'ai aucune idée des autres applications de ce manager.
@Damien: Merci d'être ouvert aux commentaires.