85 votes

Le caractère ':' , de valeur hexadécimale 0x3A, ne peut pas être inclus dans un nom

J'ai un fichier XML qui contient ses éléments comme

Str  

Lorsque j'essaie d'y accéder en utilisant le code:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault();

Ça me donne cette erreur:

System.Web.Services.Protocols.SoapException: Le serveur n'a pas pu traiter la requête. ---> System.Xml.XmlException: Le caractère ':' , valeur hexadécimale 0x3A, ne peut pas être inclus dans un nom.

Comment devrais-je y accéder?

0 votes

Vous avez certainement une manière de gérer les espaces de noms afin de ne pas devoir (ou dans ce cas, ne pas pouvoir) les inclure dans le nom. Vous devriez vous pencher dans cette direction.

2 votes

Non seulement la spécification XML dit que ":" est autorisé pour les noms (et pour commencer les noms !), mais la méthode Get de XName ne documente pas qu'elle lance une XmlException !

0 votes

Voir aussi stackoverflow.com/questions/8324960/… pour la gestion correcte de l'espace de noms.

124voto

Jon Skeet Points 692016

Si vous souhaitez utiliser des espaces de noms, LINQ to XML rend cela vraiment facile :

XNamespace ab = "http://whatever-the-url-is";
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault();

Recherchez une section xmlns:ab=... dans votre document pour savoir à quelle URI d'espace de noms "ab" se réfère.

2 votes

Cela fonctionne, mais le problème est que la valeur de xmlns:ab est générée dynamiquement en fonction de l'horodatage. Comment puis-je obtenir sa valeur ?

6 votes

@coure06: L'URI de l'espace de noms est dynamique ? C'est assez étrange. Mais oui, vous pouvez l'obtenir en trouvant la valeur d'attribut pour XNamespace.Xmlns + "ab" à partir de l'élément qui le déclare.

0 votes

Je reçois cette erreur : stackoverflow.com/questions/42839628/…

27voto

Serj Sagan Points 2731

Essayez de mettre votre espace de noms dans { ... } comme ceci :

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}";

1 votes

Pourquoi devriez-vous utiliser des accolades? Quel est le bénéfice?

1 votes

En utilisant la méthode XNamespace, cela fait essentiellement cela pour vous. .ToString sur un XNamespace formate évidemment correctement la chaîne pour vous. Donc, c'est la même chose faite différemment, il n'y a aucun avantage dans l'un ou l'autre.

19voto

barrypicker Points 654

J'avais la même erreur. J'ai découvert que j'ajoutais du code...

var ab = "http://whatever-the-url-is";

... mais ab était déterminé comme une chaîne de caractères. Cela a provoqué l'erreur signalée par l'utilisateur. Au lieu d'utiliser le mot-clé VAR, j'ai utilisé le type de données réel XNamespace...

XNamespace ab = "http://whatever-the-url-is";

... et le problème a disparu.

7voto

Blair Scott Points 1650

Il y a une surcharge de la méthode Get que vous voudrez peut-être essayer qui prend en compte l'espace de noms. Essayez ceci :

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault();

1 votes

ab n'est pas le véritable espace de noms ici mais simplement l'alias de l'espace de noms. (Je ne connais malheureusement pas le bon terme.) LINQ to XML facilite cela avec XNamespace. Il est rare que vous ayez besoin d'appeler explicitement XName.Get dans LINQ to XML.

5voto

Jason Dias Points 91

Essayez d'obtenir l'espace de noms du document

var ns = doc.Root.Name.Namespace;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X