Tengo el siguiente código de análisis XML en mi solicitud:rompe XmlReader en 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));
}
lo estoy usando para analizar cadenas enviados a mi servicio WCF en documentos XML, para la deserialización personalizado.
Funciona bien cuando leo en archivos y los envío a través del cable (la solicitud); Verifiqué que la lista de materiales no se envió. En mi controlador de solicitudes estoy serializando un objeto de respuesta y enviándolo como una cadena. El proceso de serialización agrega una lista de materiales UTF-8 al frente de la cadena, lo que hace que se rompa el mismo código al analizar la respuesta.
System.Xml.XmlException : Data at the root level is invalid. Line 1, position 1.
En la investigación que he hecho durante la última hora o así, parece que XmlReader debe respetar la lista de materiales. Si elimino manualmente la lista de materiales de la parte frontal de la cadena, la respuesta xml analiza bien.
¿Me falta algo obvio, o al menos algo insidioso?
EDIT: Aquí está el código de serialización que estoy usando para devolver la respuesta:
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;
}
Si es sólo una cuestión de forma incorrecta el código XML que contiene la lista de materiales, a continuación, voy a cambiar a
var responseXml = new UTF8Encoding(false).GetString(bytes);
pero no estaba claro en absoluto de mi investigación que la lista de materiales era ilegal en la cadena XML real; ver p. c# Detect xml encoding from Byte Array?
Tuve ese problema aquí: http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid –