it-swarm.com.de

xml.LoadData - Daten auf Stammebene sind ungültig. Zeile 1, Position 1

Ich versuche, etwas XML in einem WiX-Installationsprogramm zu analysieren. Das XML wäre ein Objekt aller meiner von einem Webserver zurückgegebenen Fehler. Ich erhalte den Fehler im Fragetitel mit diesem 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 ist dies (wie in der Ausgabe von text.txt gesehen)

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

text.txt sieht so aus:

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

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

Ich brauche dieses XML zum Parsen, damit ich sehen kann, ob ich Fehler hatte.

Bearbeiten

Diese Frage ist kein Duplikat wie markiert. In dieser Frage verwendete die Person, die die Frage stellte, LoadXml, um eine XML-Datei zu analysieren. Ich analysiere eine Zeichenfolge. Dies ist die korrekte Verwendung von LoadXml.

53
Chris

Der verborgene Charakter ist wahrscheinlich BOM . Die Erklärung des Problems und die Lösung finden Sie hier , Credits James Schubert, basierend auf einer Antwort von James Brankin hier

Obwohl die vorige Antwort das ausgeblendete Zeichen entfernt, wird auch die gesamte erste Zeile entfernt. Die genauere Version wäre:

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

Dieses Problem ist aufgetreten, als eine XSLT-Datei aus einem Azure-Blob abgerufen und in ein XslCompiledTransform-Objekt geladen wurde .. Auf meinem Computer sah die Datei einwandfrei aus, aber nachdem sie als Blob hochgeladen und wieder abgerufen wurde, wurde das Stücklistenzeichen hinzugefügt. 

86
Amit Merin

Verwenden Sie stattdessen die Load()-Methode, um das Problem zu lösen. Mehr sehen

50
Ringo

Das Problem hier war, dass myString diese Kopfzeile hatte. Entweder war ein verstecktes Zeichen am Anfang der ersten Zeile oder die Zeile selbst verursachte den Fehler. Ich schnitt die erste Zeile so ab:

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

Das hat mein Problem gelöst.

12
Chris

Ich denke, das Problem liegt in der Kodierung. Daher kann das Entfernen der ersten Zeile (mit Codierungsbyte) das Problem lösen.

Meine Lösung für Daten auf Stammebene ist ungültig. Zeile 1, Position 1 In XDocument.Parse(xmlString) wurde durch XDocument.Load( new MemoryStream( xmlContentInBytes ) ); ersetzt.

Ich habe festgestellt, dass mein XML-String in Ordnung war:

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

in einer anderen Text-Editor-Kodierung sah es jedoch so aus:

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

Am Ende brauchte ich nicht den XML-String, sondern das XML-Byte []. Wenn Sie den String verwenden müssen, sollten Sie in Ihrem String nach "unsichtbaren" Bytes suchen und mit Kodierungen spielen, um den XML-Inhalt für das Analysieren oder Laden anzupassen.

Ich hoffe es wird helfen

8
pawciu

Ich habe dieses Problem durch direktes Bearbeiten des Byte-Arrays gelöst Sammeln Sie die UTF8-Präambel und entfernen Sie direkt den Header . Anschließend können Sie das Byte [] mit der GetString-Methode in einen String umwandeln, siehe unten . Die\r und\t habe ich ebenso entfernt, genauso wie die Vorsichtsmaßnahme.

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

Speichern Sie Ihre Datei mit einer anderen Kodierung:

Datei> Datei speichern unter ...> Als UTF-8 speichern ohne Signatur.

In VS 2017 finden Sie die Codierung als Dropdown neben der Schaltfläche Speichern.

1
MikeMajara

Wenn sich Ihre XML-Datei in einer Zeichenfolge befindet, entfernen Sie die Bytereihenfolgezeichen folgendermaßen:

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

Ich habe eine der Lösungen herausgefunden ... Für Ihren Code könnte dies wie folgt lauten:

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