Je veux lire ce XML mais il me donne seulement "La référence d'objet n'est pas définie sur une instance d'un objet.
<reponse><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></reponse>
Et voici mon exemple de responseString XML, je veux prendre la valeur de X et Y.
XDocument doc = XDocument.Parse(responseString); string valueX = doc.Root.Element("reponse").Element("point").Element("x").Value; string valueY = doc.Root.Element("reponse").Element("point").Element("y").Value; Console.WriteLine("TEST"); Console.WriteLine("Timb East" + valueX); Console.WriteLine("Timb North" + valueY);
Quelqu'un peut-il me donner une idée de ce qui ne va pas ici? Merci.
EDIT: correction de l'orthographe de la réponse à la réponse.
4 Réponses :
Quelque chose n'est pas ce que vous pourriez penser.
Tout appel à Element
peut retourner null
XContainer.Element (XName), méthode
Un XElement qui correspond au XName spécifié, ou null.
Si vous n'êtes pas sûr, utilisez un opérateur conditionnel nul
string valueX = doc.Root.Element("response")?.Element("point")?.Element("x")?.Value;
Cependant, il est fort probable que l'analyse ne soit pas conforme à vos attentes ou que les données ne correspondent pas à vos attentes.
Que faire si vous modifiez votre code comme ci-dessous pour utiliser la méthode GetElementsByTagName()
présente dans le type XmlDocument
string msg = "<response><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></response>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(msg); var valueX = doc.GetElementsByTagName("x")[0].InnerText; string valueY = doc.GetElementsByTagName("y")[0].InnerText; Console.WriteLine("TEST"); Console.WriteLine("Timb East" + valueX); Console.WriteLine("Timb North" + valueY);
Je ne suis pas sûr de recommander à OP de revenir à l'ancienne API XmlDocument
. En outre, dans la documentation de GetElementsByTagName()
Microsoft écrit, il est recommandé d'utiliser la méthode XmlNode.SelectNodes ou XmlNode.SelectSingleNode au lieu de la méthode GetElementsByTagName.
Deux problèmes, tous deux concernant la façon dont vous accédez à l'élément racine:
Il existe une incohérence (incohérence d'orthographe) entre le nom de l'élément racine dans le XML et le nom de l'élément racine attendu par votre code.
Le XML contient l'élément racine <reponse>
(mal orthographié) mais votre code c # utilise "response"
(orthographié correctement).
Vous devez corriger le code et les noms des éléments racine XML pour être cohérents.
Quand tu fais
var valueX = doc.Element("reponse").Element("point").Element("x").Value;
Vous essayez d'accéder à un élément enfant nommé <response>
de l'élément racine du document XML. Mais <response>
(ou <reponse>
) est déjà l'élément racine et n'a pas d'enfant. Ainsi, vous devez faire:
var valueX = doc.Root.Element("point").Element("x").Value;
Ou
doc.Root.Element("response")...
(Ie doc.Root
et doc.Element("reponse")
font la même chose, à savoir retourner l'élément racine, il n'est donc pas nécessaire de faire les deux.)
Exemple de violon ici .
En supposant que le xml ne contient qu'un seul nœud <x>
et <y>
, vous pouvez essayer le code ci-dessous
System.Xml.Linq.XElement xml = System.Xml.Linq.XElement.Parse("<response><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></response>"); var valueX = xml.Descendants().SingleOrDefault(x => x.Name.LocalName == "x")?.Value; var valueY = xml.Descendants().SingleOrDefault(x => x.Name.LocalName == "y")?.Value; Console.WriteLine("TEST"); Console.WriteLine("Timb East" + valueX); Console.WriteLine("Timb North" + valueY);
Orthographe: XML contient
<reponse>
(mal orthographié) mais votre code c # utiliseElement("response")
(correctement orthographié).@dbc Merci d'avoir mis en évidence l'erreur d'orthographe! Mais après avoir corrigé l'orthographe, toujours la même sortie d'erreur.
Oh
doc.Root.Element("response")
, vous faitesdoc.Root.Element("response")
maisRoot
est déjà l'élément racine donc il vous suffit de fairedoc.Element("response")
oudoc.Root.Element("point")
.