0
votes

Référence d'objet XML non définie sur une instance d'un objet

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.


3 commentaires

Orthographe: XML contient <reponse> (mal orthographié) mais votre code c # utilise Element("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 faites doc.Root.Element("response") mais Root est déjà l'élément racine donc il vous suffit de faire doc.Element("response") ou doc.Root.Element("point") .


4 Réponses :


0
votes

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.


0 commentaires

0
votes

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


1 commentaires

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.



0
votes

Deux problèmes, tous deux concernant la façon dont vous accédez à l'élément racine:

  1. 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.

  2. 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 .


0 commentaires

0
votes

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


0 commentaires