Ich habe den folgenden XML-Parsing-Code in meiner Anwendung:XmlReader bricht auf UTF-8 BOM
public static XElement Parse(string xml, string xsdFilename)
{
var readerSettings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = new XmlSchemaSet()
};
readerSettings.Schemas.Add(null, xsdFilename);
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
readerSettings.ValidationEventHandler +=
(o, e) => { throw new Exception("The provided XML does not validate against the request's schema."); };
var readerContext = new XmlParserContext(null, null, null, XmlSpace.Default, Encoding.UTF8);
return XElement.Load(XmlReader.Create(new StringReader(xml), readerSettings, readerContext));
}
ich bin mit Strings zu analysieren, um meinen WCF-Dienst in XML-Dokumente gesendet werden, für individuelle Deserialisierung.
Es funktioniert gut, wenn ich Dateien einlese und sie über die Leitung (die Anfrage) sende; Ich habe überprüft, dass die Stückliste nicht gesendet wird. In meinem Request-Handler serialisiere ich ein Response-Objekt und sende es als String zurück. Der Serialisierungsprozess fügt eine UTF-8-Stückliste an der Vorderseite der Zeichenfolge hinzu, wodurch derselbe Code beim Analysieren der Antwort unterbrochen wird.
System.Xml.XmlException : Data at the root level is invalid. Line 1, position 1.
In der Forschung, die ich in der letzten Stunde oder so getan habe, scheint XmlReader die Stückliste zu beachten. Wenn ich die Stückliste manuell vor der Zeichenfolge lösche, analysiert die Antwort-XML.
Fehle ich etwas offensichtlich, oder zumindest etwas heimtückisch?
EDIT: Hier ist die Serialisierungscode ich die Antwort zurück bin mit:
private static string SerializeResponse(Response response)
{
var output = new MemoryStream();
var writer = XmlWriter.Create(output);
new XmlSerializer(typeof(Response)).Serialize(writer, response);
var bytes = output.ToArray();
var responseXml = Encoding.UTF8.GetString(bytes);
return responseXml;
}
Wenn es nur eine Frage der xml falsch die BOM enthält, dann werde ich zu
wechselnvar responseXml = new UTF8Encoding(false).GetString(bytes);
aber aus meinen Nachforschungen war überhaupt nicht klar, dass die Stückliste in der eigentlichen XML-Zeichenfolge unzulässig war; siehe z.B. c# Detect xml encoding from Byte Array?
Ich hatte dieses Problem hier: http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid –