2010-11-26 2 views
2

J'ai un document XML que j'essaie de parcourir et qui est conforme à SDMX. Voici un court extrait:Comment obtenir un XElement avec des caractères spéciaux dans la balise XML

<root> 
    <csf:DataSet id="J10"> 
    <kf:Series> 
     <value> 107.92 
     </value> 
    </kf:Series> 
    </csf:DataSet> 
</root> 

Cependant, lorsque je tente de faire ce qui suit à l'aide de Linq Xml en C#, je reçois un XmlException.

XElement dataset = document.Element("csf:DataSet"); 

Le texte d'exception est: Le caractère ':', valeur hexadécimale 0x3A, ne peut pas être inclus dans un nom.

Je n'ai aucun contrôle sur le code XML. Des idées sur comment je peux surmonter cela?

+2

Notez que le « : » est pas un caractère spécial dans une balise. C'est un séparateur qui sépare le préfixe d'espace de noms du nom local de l'élément. –

+1

Il manque des déclarations d'espace de noms dans votre fichier XML. Voir mon exemple complet. Si vous essayez de l'exécuter sans "xmlns: crf = ..." la méthode Parse lève une exception. – m0sa

+0

@Saunders, @ m0sa: Merci pour le heads-up. Le document complet a une entrée xmlns, je ne savais pas que le ns était pour l'espace de noms! Merci encore. – jehuty

Répondre

3
var csf = XNamespace.Get("<csfNamespaceUri>"); 
document.Element(csf + "DataSet"); 

Notez que vous devez spécifier l'uri de l'espace de noms CSF. Un exemple complet:

var doc = XDocument.Parse(@" 
<root xmlns:csf=""http://tempuri.org/1"" xmlns:kf=""http://tempuri.org/2""> 
    <csf:DataSet id=""J10""> 
    <kf:Series> 
     <value> 107.92 
     </value> 
    </kf:Series> 
    </csf:DataSet> 
</root> 
"); 

var dataSet = doc.Descendants(XNamespace.Get("http://tempuri.org/1") + "DataSet").Single(); 
+0

Je l'aurais upvoted si vous aviez utilisé la syntaxe plus simple - et sera upvote si vous modifiez votre réponse pour l'utiliser. –

+0

Merci @Hightechrider, je n'étais pas au courant de ce raccourci. Très chouette! – m0sa

0

Essayez d'utiliser XNamespace pour qualifier l'élément DataSet que vous cherchez à extraire.

0

J'ai eu le même problème. L'une des réponses ici m'a aidé sur mon chemin, mais pas tout le chemin, alors voici ma solution/clarification:

Ce que vous devez faire est de spécifier une URL de votre espace de noms, comme ceci:

XNamespace ns = "http://www.example.com"; 

... PREPEND alors que l'espace de noms dans chaque Element:

var someElement = new XElement(ns + "ElementName", "Value"); 


pour que cela fonctionne cependant, vous devez inclure cette URI spécifique dans le fichier XML comme suit:

var rootElement = 
    new XElement(ns + "MyRootElement", 
       new XAttribute(XNamespace.Xmlns + "ns", 
           "http://www.example.com")); 

Maintenant, vous pouvez ajouter someElement (et d'autres) à rootElement, et l'espace de noms sera inclus, car il a été fait référence (par l'URL) dans la racine:

rootElement.Add(someElement); 
rootElement.Add(new XElement(ns + "OtherElement", "Other value")); 

cela va générer XML qui ressemble à ceci:

<ns:MyRootElement xmlns:ns="http://www.example.com"> 
    <ns:ElementName> (...) </ns:ElementName> 
    <ns:OtherElement> (...) </ns:OtherElement> 
</ns:MyRootElement> 
Questions connexes