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
.
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.
Verwenden Sie stattdessen die Load()
-Methode, um das Problem zu lösen. Mehr sehen
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.
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
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", "");
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.
Wenn sich Ihre XML-Datei in einer Zeichenfolge befindet, entfernen Sie die Bytereihenfolgezeichen folgendermaßen:
xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
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;
}