gpt4 book ai didi

c# - XmlReader 在 UTF-8 BOM 上中断

转载 作者:太空狗 更新时间:2023-10-29 20:00:41 26 4
gpt4 key购买 nike

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

最佳答案

In my request handler I'm serializing a response object and sending it back as a string. The serialization process adds a UTF-8 BOM to the front of the string, which causes the same code to break when parsing the response.

因此,您希望防止将 BOM 添加为序列化过程的一部分。不幸的是,您没有提供您的序列化逻辑是什么。

你应该做的是提供一个 UTF8Encoding通过 UTF8Encoding(bool) 创建的实例构造函数以禁用 BOM 的生成,并将此 Encoding 实例传递给您正在使用的生成中间字符串的任何方法。

关于c# - XmlReader 在 UTF-8 BOM 上中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3104158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com