web-dev-qa-db-fra.com

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

J'essaie d'analyser du code XML dans un programme d'installation WiX. Le XML serait un objet de toutes mes erreurs renvoyées par un serveur Web. Je reçois 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 ceci (comme indiqué dans la sortie de text.txt)

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

text.txt ressemble à ceci:

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

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

J'ai besoin de ce XML pour analyser afin que je puisse voir si j'ai eu des erreurs.

Modifier

Cette question n'est pas un duplicata comme indiqué. Dans cette question, la personne qui posait la question utilisait LoadXml pour analyser un fichier XML. J'analyse une chaîne, qui correspond à l'utilisation correcte de LoadXml

53
Chris

Le personnage caché est probablement BOM . L’explication du problème et la solution peuvent être trouvées ici , remerciements à James Schubert, sur la base d’une réponse de James Brankin trouvée ici

Bien que la réponse précédente supprime le caractère masqué, elle supprime également toute la première ligne. La version 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 à partir du blob Azure et de son chargement dans un objet XslCompiledTransform . 

86
Amit Merin

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

50
Ringo

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 était à l'origine de l'erreur. J'ai coupé la première ligne comme suit:

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

Cela a résolu mon problème.

12
Chris

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

Ma solution pour Les données au niveau racine sont invalides. Ligne 1, position 1. Dans XDocument.Parse(xmlString) le remplaçait par XDocument.Load( new MemoryStream( xmlContentInBytes ) );

J'ai remarqué que ma chaîne xml avait l'air d'aller bien:

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

mais dans un éditeur de texte différent, cela ressemblait à ceci:

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

À la fin, je n'avais pas besoin de la chaîne XML mais de l'octet XML []. Si vous devez utiliser la chaîne, vous devez rechercher des octets "invisibles" dans votre chaîne et jouer avec des encodages pour ajuster le contenu XML à analyser ou à charger.

J'espère que ça va aider

8
pawciu

J'ai résolu ce problème en modifiant directement le tableau d'octets . Collectez le préambule UTF8 et supprimez directement l'en-tête . Vous pourrez ensuite transformer l'octet [] en chaîne avec la méthode GetString, voir ci-dessous . Les\r et\t que j'ai enlevés aussi, juste par précaution.

XmlDocument configurationXML = new XmlDocument();
List<byte> byteArray = new List<byte>(webRequest.downloadHandler.data);

foreach(byte singleByte in Encoding.UTF8.GetPreamble())
{
     byteArray.RemoveAt(byteArray.IndexOf(singleByte));
}
string xml = System.Text.Encoding.UTF8.GetString(byteArray.ToArray());
       xml = xml.Replace("\\r", "");
       xml = xml.Replace("\\t", "");
2
Michael Planer

Enregistrez votre fichier avec un encodage différent:

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

Dans VS 2017, vous trouvez le codage sous forme de liste déroulante à côté du bouton Enregistrer.

1
MikeMajara

Si votre xml est dans une chaîne, utilisez ce qui suit pour supprimer toute marque d'ordre des octets:

        xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
0
Mister Cook

J'ai trouvé une des solutions . Pour votre code cela pourrait être comme suit -

XmlDocument xml = new XmlDocument();
try
{
    // assuming the location of the file is in the current directory 
    // assuming the file name be loadData.xml
    string myString = "./loadData.xml";
    xml.Load(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}
0
Shubhasish Bhunia