У меня в приложении есть следующий код синтаксического анализа XML:
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));
}
Я использую его для анализа строк, отправленных моей службе WCF, в документы XML для пользовательской десериализации.
Этоотлично работает, когда я читаю файлы и отправляю их по проводам (запрос);Я проверил, что спецификация не пересылается.В моем обработчике запросов я сериализую объект ответа и отправляю его обратно в виде строки.Процесс сериализации добавляет спецификацию UTF-8 в начало строки, что приводит к разрыву того же кода при анализе ответа.
System.Xml.XmlException : Data at the root level is invalid. Line 1, position 1.
В исследовании, которое я провел за последний час или около тогоПохоже, что XmlReader должен соблюдать спецификацию.Если я вручную удаляю спецификацию в начале строки, xml-ответ разбирается нормально.
Мне не хватает чего-то очевидного или хотя бы чего-то коварного?
РЕДАКТИРОВАТЬ: Вот код сериализации, который я использую для возврата ответа:
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;
}
Если дело в том, что XML неправильно содержит спецификацию, то я переключусь на
var responseXml = new UTF8Encoding(false).GetString(bytes);
, но из моих исследований вообще не было ясно, что эта спецификация была незаконной вактуальная строка XML;см. например c # Обнаружить кодировку xml из массива байтов?