Ich versuche, XML in einem WiX-Installationsprogramm zu analysieren. Das XML wäre ein Objekt aller meiner Fehler, die von einem Webserver zurückgegeben wurden. Ich erhalte den Fehler im Fragentitel 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 gesehen text.txt
)
<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>
text.txt
kommt so aus:
<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>
Data at the root level is invalid. Line 1, position 1.
Ich benötige dieses XML zum Parsen, damit ich sehen kann, ob ich Fehler hatte.
Bearbeiten
Diese Frage ist kein Duplikat wie markiert. In dieser Frage hat die Person, die die Frage gestellt hat LoadXml
, eine XML-Datei analysiert. Ich analysiere einen String, der die richtige Verwendung von istLoadXml
c#
xml
xml-parsing
wix
Chris
quelle
quelle
text.txt
.LoadXml
.string
UTF-8 jemals wirklich sein? Was ist, wenn die Verarbeitungsanweisung (erste Zeile) vor dem Laden entfernt wird?Antworten:
Das versteckte Zeichen ist wahrscheinlich Stückliste. Die Erklärung des Problems und die Lösung finden Sie hier , James Schubert zu verdanken, basierend auf einer Antwort von James Brankin, die hier zu finden ist .
Die vorherige Antwort entfernt zwar das versteckte Zeichen, aber auch die gesamte erste Zeile. 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 trat auf, als ich eine XSLT-Datei aus dem Azure-Blob abrief und in ein XslCompiledTransform-Objekt lud. Auf meinem Computer sah die Datei gut aus, aber nachdem ich sie als Blob hochgeladen und zurückgerufen hatte, wurde das Stücklistenzeichen hinzugefügt.
quelle
xmlStartsWith(byteOrderMarkUtf8, StringComparison.Ordinal)
hat den Trick für mich getan. DankVerwenden Sie
Load()
stattdessen die Methode, um das Problem zu lösen. Mehr sehenquelle
Das Problem hier war,
myString
dass diese Kopfzeile hatte. Entweder befand sich am Anfang der ersten Zeile ein verstecktes Zeichen, oder die Zeile selbst verursachte den Fehler. Ich habe die erste Zeile so abgeschnitten:xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));
Dies löste mein Problem.
quelle
Ich denke, dass das Problem in der Codierung liegt. Aus diesem Grund kann das Problem durch Entfernen der ersten Zeile (mit Codierungsbyte) behoben werden.
Meine Lösung für Daten auf Stammebene ist ungültig. Zeile 1, Position 1. in
XDocument.Parse(xmlString)
wurde durch ersetztXDocument.Load( new MemoryStream( xmlContentInBytes ) );
Ich habe festgestellt, dass meine XML-Zeichenfolge in Ordnung aussah:
<?xml version="1.0" encoding="utf-8"?>
aber in verschiedenen Texteditor-Codierungen sah es so aus:
?<?xml version="1.0" encoding="utf-8"?>
Am Ende brauchte ich nicht die XML-Zeichenfolge, sondern XML-Byte []. Wenn Sie die Zeichenfolge verwenden müssen, sollten Sie nach "unsichtbaren" Bytes in Ihrer Zeichenfolge suchen und mit Codierungen spielen, um den XML-Inhalt für das Parsen oder Laden anzupassen.
Hoffe es wird helfen
quelle
Ich habe dieses Problem gelöst, indem ich das Byte-Array direkt bearbeitet habe. 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). Das \ r und \ t habe ich ebenfalls vorsichtshalber entfernt.
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", "");
quelle
Speichern Sie Ihre Datei mit einer anderen Codierung:
Datei> Datei speichern unter ...> Als UTF-8 ohne Signatur speichern.
In VS 2017 finden Sie die Codierung als Dropdown-Liste neben der Schaltfläche Speichern.
quelle
Zuerst hatte ich Probleme, dem "&" -Zeichen zu entkommen, dann wurden diakritische Zeichen und Sonderbuchstaben als Fragezeichen angezeigt und endeten mit dem erwähnten Problem OP.
Ich habe mir die Antworten angesehen und @ Ringos Vorschlag verwendet, um alternativ die Load () -Methode auszuprobieren. Dadurch wurde mir klar, dass ich mit meiner Antwort auf andere Weise umgehen kann, nicht nur als Zeichenfolge.
Die Verwendung von System.IO.Stream anstelle von String löste alle Probleme für mich.
var response = await this.httpClient.GetAsync(url); var responseStream = await response.Content.ReadAsStreamAsync(); var xmlDocument = new XmlDocument(); xmlDocument.Load(responseStream);
Das Coole an Load () ist, dass diese Methode das Zeichenfolgenformat des Eingabe-XML (z. B. UTF-8, ANSI usw.) automatisch erkennt. Mehr sehen
quelle
Wenn sich Ihre XML in einer Zeichenfolge befindet, verwenden Sie Folgendes, um alle Bytereihenfolgen zu entfernen:
xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");
quelle
Ich habe eine der Lösungen gefunden. Für Ihren Code könnte dies wie folgt sein:
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; }
quelle
wenn wir XDocument.Parse (@ "") verwenden. Use @ it behebt das Problem.
quelle
Hauptverursacher dieses Fehlers ist die Logik, die die Codierung beim Konvertieren
Stream
oderbyte[]
Array in .NET bestimmtstring
.Wenn Sie den
StreamReader
Parameter mit dem zweiten KonstruktordetectEncodingFromByteOrderMarks
auf true setzen, wird die richtige Codierung ermittelt und erstellt,string
wodurch dieXmlDocument.LoadXml
Methode nicht unterbrochen wird.public string GetXmlString(string url) { using var stream = GetResponseStream(url); using var reader = new StreamReader(stream, true); return reader.ReadToEnd(); // no exception on `LoadXml` }
Ein häufiger Fehler wäre, einfach blind die
UTF8
Codierung auf demstream
oder zu verwendenbyte[]
. Der folgende Code erzeugt einen Wertstring
, der gültig aussieht, wenn er im Visual Studio-Debugger überprüft oder irgendwo kopiert wird. Bei Verwendung mitLoad
oderLoadXml
wenn die Datei anders codiert ist als UTF8 ohne Stückliste , wird jedoch die Ausnahme erzeugt .public string GetXmlString(string url) { byte[] bytes = GetResponseByteArray(url); return System.Text.Encoding.UTF8.GetString(bytes); // potentially exception on `LoadXml` }
quelle