Comment obtenir un XElement avec des caractères spéciaux dans la balise XML
-
28-09-2019 - |
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?
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>