我在我的应用程序中有以下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文档,以进行自定义反序列化。
当我读取文件并将它们通过网络发送(请求)时,它可以正常工作;我已经验证BOM没有被发送。 在我的请求处理程序中,我正在将响应对象序列化并将其作为字符串发送回来。 序列化过程在字符串前面添加了UTF-8 BOM,这会导致相同的代码在解析响应时出现错误。
System.Xml.XmlException : Data at the root level is invalid. Line 1, position 1.
根据我在过去一个小时左右所做的研究,XmlReader应该会遵循BOM。如果我手动从字符串前面删除BOM,则响应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文件不正确包含BOM的问题,那么我将切换到
var responseXml = new UTF8Encoding(false).GetString(bytes);
但是从我的研究中并不清楚BOM在实际XML字符串中是否是非法的;例如,请参见c# Detect xml encoding from Byte Array?