2010-04-04 6 views
60

J'ai un fichier xml qui contient son élément commeLe caractère « : », valeur hexadécimale 0x3A, ne peut pas être inclus dans un nom

<ab:test>Str</ab:test> 

Quand je suis en train d'y accéder en utilisant le code:

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

il me donne cette erreur:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.

Comment dois-je accéder?

+0

Vous avez certainement un moyen de gérer les espaces de noms afin que vous n'ayez pas à les mettre dans le nom (ou dans ce cas, vous ne pouvez pas). Vous devriez regarder dans cette direction. – p4bl0

+1

Non seulement la spécification XML dit que ":" est [autorisé pour les noms] (http://www.w3.org/TR/REC-xml/#NT-NameStartChar) (et pour commencer les noms!), Mais le [Get method] (http://msdn.microsoft.com/en-us/library/bb357369.aspx) de XName ne documente pas qu'il lève XmlException! – yoozer8

Répondre

90

Si vous souhaitez utiliser les espaces de noms, LINQ to XML rend ce vraiment facile:

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

Rechercher une section xmlns:ab=... dans votre document pour savoir quel espace de noms URI "ab" se réfère.

+2

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? – coure2011

+5

@ coure06: L'espace de noms URI est-il dynamique? C'est plutôt bizarre. Mais oui, vous pouvez l'obtenir en trouvant la valeur d'attribut pour 'XNamespace.Xmlns +" ab "' de n'importe quel élément le déclare. –

+0

Je reçois cette erreur: http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 – Si8

6

Il existe une surcharge de la méthode Get que vous pourriez vouloir essayer qui prend en compte l'espace de noms. Essayez ceci:

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

'ab' n'est pas l'espace de nom réel ici cependant - c'est juste l'alias pour l'espace de noms. (Je ne connais malheureusement pas la bonne terminologie.) LINQ to XML rend cette tâche facile avec 'XNamespace'. Il est rare que vous deviez appeler explicitement 'XName.Get' dans LINQ to XML. –

+0

ah mon erreur, merci pour la clarification –

17

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

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

pourquoi devriez-vous utiliser des accolades? Quel est le bénéfice? – barrypicker

+10

Cela le fait fonctionner :) –

+0

Essayé que ... ne fonctionne pas unf: / – Si8

3

Essayer d'obtenir l'espace de noms à partir du document

var ns = doc.Root.Name.Namespace; 
10

Je faisais la même erreur . J'ai trouvé que j'ajoutais le code ...

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

... mais ab a été déterminé pour être une chaîne. Cela a provoqué l'erreur signalée par OP. 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.

Questions connexes