web-dev-qa-db-fra.com

Il y a une erreur dans le document XML (1, 41)

Quand je fais Deserialize of xml, j'obtiens "Il y a une erreur dans le document XML (1, 41)". . Quelqu'un peut-il me dire quel est le problème? 

 public static T DeserializeFromXml<T>(string xml)
        {
            T result;
            XmlSerializer ser = new XmlSerializer(typeof(T));
            using (TextReader tr = new StringReader(xml))
            {
                result = (T)ser.Deserialize(tr);
            }
            return result;
        }

J'utilise cette fonction pour le faire.

<?xml version='1.0' encoding='utf-16'?>
<Message>
<FirstName>Hunt</FirstName>
<LastName>DAvid</LastName>
</Message>
9
Pradeep

Assurez-vous que votre classe Message ressemble à celle ci-dessous:

[Serializable, XmlRoot("Message")]
public class Message
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Cela fonctionne bien pour moi:

string xml = File.ReadAllText("c:\\Message.xml");
var result = DeserializeFromXml<Message>(xml);

MSDN, XmlRoot.ElementName :

Nom de l'élément racine XML généré et reconnu dans une instance de document XML. La valeur par défaut est le nom du. Sérialisé classe.

Il se peut donc que votre nom de classe n’est pas Message et c’est pourquoi le désérialiseur n’a pas pu le trouver avec le comportement par défaut.

17
sll

Acceptez la réponse de sll, mais rencontrez un autre obstacle qui consiste à spécifier un espace de nom dans les attributs. Lors de la réception du xml de retour, cet espace de nom n’était pas inclus et n’a donc pas réussi à trouver la classe.

je devais trouver une solution de contournement pour spécifier l'espace de noms dans l'attribut et cela fonctionnait.

c'est à dire.

[Serializable()]
    [XmlRoot("Patient", Namespace = "http://www.xxxx.org/TargetNamespace")]
    public class Patient

généré

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxxx.org/TargetNamespace">

mais je devais le changer pour 

[Serializable()]
[XmlRoot("Patient")]
public class Patient

qui a généré à 

<Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Cela a résolu mon problème, espérons que cela aidera quelqu'un d'autre.

2
Neville

Commencez par vérifier les variables déclarées à l'aide des types de données appropriés ..__ J'ai eu le même problème que j'ai vérifié, par erreur, j'ai déclaré SAPUser comme type de données int, de sorte que l'erreur se produise . tableau mais son premier index commence à avoir +1 . si une erreur est dans (7,2), alors vérifie toujours la 6ème ligne .....

2
Gopal Pendalwar

J'avais la même chose. Tous sont descendus à un "d" au lieu d'un "D" dans un nom de tag dans le schéma.

2
Dan

Dans mon cas, j'avais une valeur float attendue alors que xml avait une valeur null alors assurez-vous de rechercher le type de données float et int dans votre carte xsd 

0
Sofia Khwaja

Sur un projet WEC7 sur lequel je travaille, j'ai une erreur similaire. Le fichier dans lequel j'étais en train de sérialiser a été sérialisé à partir d'un tableau d'objets. J'ai donc pensé que le XML était bon. En outre, cela a fonctionné pendant quelques cours précédents, donc c'était tout un casse-tête.

Ensuite, j'ai remarqué dans mon travail précédent que chaque classe que je sérialisais/désérialisais avait un constructeur par défaut. Cela manquait dans mon cas qui a échoué alors je l'ai ajouté et et le tour est joué ... ça a bien fonctionné.

Il me semble me rappeler avoir lu quelque part que c'était nécessaire. Je devine que c'est.

0
user547176