103 votes

xml.LoadData - Les données au niveau de la racine ne sont pas valides. Ligne 1, position 1

J'essaie d'analyser un fichier XML dans un programme d'installation WiX. Le XML serait un objet de toutes mes erreurs retournées par un serveur web. J'obtiens l'erreur dans le titre de la question avec ce code :

XmlDocument xml = new XmlDocument();
try
{
    xml.LoadXml(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}

myString est le suivant (comme on le voit dans la sortie de text.txt )

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

text.txt ressemble à ça :

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

Data at the root level is invalid. Line 1, position 1.

J'ai besoin que ce XML soit analysé pour que je puisse voir si j'ai eu des erreurs.

174voto

Amit Merin Points 1446

Le personnage caché est probablement la MOB. L'explication du problème et la solution se trouvent à l'adresse suivante aquí crédits à James Schubert, basé sur une réponse de James Brankin trouvé aquí .

Bien que la réponse précédente supprime le caractère caché, elle supprime également toute la première ligne. La version la plus précise serait :

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}

J'ai rencontré ce problème lors de l'extraction d'un fichier XSLT d'un blob Azure et de son chargement dans un objet XslCompiledTransform. Sur ma machine, le fichier avait l'air parfait, mais après l'avoir téléchargé en tant que blob et l'avoir récupéré, le caractère BOM a été ajouté.

85voto

Ringo Points 3591

Utilice Load() à la place, cela résoudra le problème. Voir plus

16voto

Chris Points 471

Le problème ici était que myString avait cette ligne d'en-tête. Soit il y avait un caractère caché au début de la première ligne, soit la ligne elle-même causait l'erreur. J'ai coupé la première ligne comme ceci :

xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));

Cela a résolu mon problème.

12voto

pawciu Points 123

Je pense que le problème est lié à l'encodage. C'est pourquoi la suppression de la première ligne (avec l'octet d'encodage) pourrait résoudre le problème.

Ma solution pour Les données du niveau Root ne sont pas valides. Ligne 1, position 1. sur XDocument.Parse(xmlString) le remplaçait par XDocument.Load( new MemoryStream( xmlContentInBytes ) );

J'ai remarqué que ma chaîne xml semblait correcte :

<?xml version="1.0" encoding="utf-8"?>

mais dans un encodage différent de l'éditeur de texte, ça ressemblait à ça :

?<?xml version="1.0" encoding="utf-8"?>

A la fin, je n'avais pas besoin de la chaîne xml mais de xml byte[]. Si vous avez besoin d'utiliser la chaîne, vous devez rechercher les octets "invisibles" dans votre chaîne et jouer avec les encodages pour ajuster le contenu du xml pour l'analyse ou le chargement.

J'espère que cela vous aidera

4voto

MikeMajara Points 99

Enregistrez votre fichier avec un encodage différent :

Fichier > Enregistrer le fichier sous... > Enregistrer en UTF-8 sans signature.

Dans VS 2017, vous trouvez l'encodage comme une liste déroulante à côté du bouton Enregistrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X