gpt4 book ai didi

c# - 使用 XmlWriterSettings 和 XmlSerializer 编写 XML 片段会产生额外的字符

转载 作者:太空狗 更新时间:2023-10-29 21:51:19 25 4
gpt4 key购买 nike

我需要编写一个 XML 片段以供网络服务使用。任何 xml 声明都会导致 Web 服务拒绝请求。为了支持这一点,我有以下类(class):

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 声明或任何 namespace 。但是,我宁愿将数据捕获到内存流中,而不是文件中。

使用以下方法(取自 http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks )我能够取得成果,但由于某种原因我有一个?列为字符串的一部分。

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>

如果我设置 OmitXmlDeclaration = false,我会得到以下字符串:

?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>

任何人都可以帮我确定为什么额外的吗?有没有,我该如何删除它?

没有 BOM 的工作 SerializeToString 方法

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());


}

最佳答案

您看到 BOM(字节顺序掩码)是从流的字节数组转换而来的字符串中的第一个字符。

关闭输出 BOM 就可以了。

使用不生成BOM的编码对象:UnicodeEncoding

settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)

关于c# - 使用 XmlWriterSettings 和 XmlSerializer 编写 XML 片段会产生额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456632/

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