C# 使用XmlWriterSettings和XmlSerializer编写XML片段会增加一个字符
我需要编写一个XML片段供web服务使用。任何xml声明都会导致web服务拒绝请求。为了支持这一点,我有以下课程:C# 使用XmlWriterSettings和XmlSerializer编写XML片段会增加一个字符,c#,xml-serialization,C#,Xml Serialization,我需要编写一个XML片段供web服务使用。任何xml声明都会导致web服务拒绝请求。为了支持这一点,我有以下课程: public class ContentQueryCriteria { public int Type { get; set; } public string Value { get; set; } public int Condition { get; set; } } 这允许我设置请求标准,然后获得结果 代码的使用方式如下: ContentQueryC
public class ContentQueryCriteria
{
public int Type { get; set; }
public string Value { get; set; }
public int Condition { get; set; }
}
这允许我设置请求标准,然后获得结果
代码的使用方式如下:
ContentQueryCriteria content = new ContentQueryCriteria();
content.Type = 1;
content.Value = "NAVS500";
content.Condition = 1;
string requestBody = SerializeToString(content);
Console.WriteLine(requestBody);
当我将其序列化为XML文件时,我得到了正确的响应,而没有XML声明或任何名称空间。然而,我宁愿将数据捕获到内存流中,而不是文件中
使用以下方法(摘自)我能够获得结果,但出于某种原因,我有一个?作为字符串的一部分列出
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = Encoding.Unicode;
XmlWriter writer = XmlWriter.Create(ms, settings);
serializer.Serialize(writer, obj, ns);
return Encoding.Unicode.GetString(ms.ToArray());
}
结果字符串为:
?<ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>
您将BOM(字节顺序掩码)视为从流的字节数组转换而来的字符串中的第一个字符
关闭输出BOM表,您会没事的
使用不生成BOM表的编码对象:
有趣的是,XML声明的一部分似乎被遗漏了,或者是因为编码问题——出于好奇,您尝试过其他编码吗?我也是这么想的,但我尝试了UTF8和unicode两种编码,结果相同。如果将OmitXmlDeclaration更改为false,是否有效(当然,您得到了XML声明,但它输出的是ok XML吗?)奇怪的…字符串返回为:?1NAVS5001那么它看起来与流有关-您是否检查了MemoryStream以查看写入后的第一个字节是什么?至少您可以消除编码
?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = new UnicodeEncoding(bigEndian: false, byteOrderMark: false);
XmlWriter writer = XmlWriter.Create(ms, settings);
serializer.Serialize(writer, obj, ns);
return Encoding.Unicode.GetString(ms.ToArray());
}
settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)