Question

J'ai un document XML que je suis en train de traverser, ce qui est conforme SDMX. Voici un court extrait:

<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 XML. Toutes les idées sur la façon dont je peux surmonter cela?

Était-ce utile?

La solution

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

Notez que vous devez spécifier les 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();

Autres conseils

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

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";

... préfixer alors que l'espace de noms dans chaque Element:

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


Pour que cela fonctionne cependant, vous doit 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"));

Vous pouvez maintenant 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 à quelque chose comme ceci:

<ns:MyRootElement xmlns:ns="http://www.example.com">
    <ns:ElementName> (...) </ns:ElementName>
    <ns:OtherElement> (...) </ns:OtherElement>
</ns:MyRootElement>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top