我的应用程序中有以下 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?