- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要编写一个 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/
我正在使用 XmlWriterSettings 将 Xml 写入文件。我有只有属性的元素,没有 child 。我希望它们输出为: 代替 我可以使用 XmlWriterSettings 来实现吗?
我正在尝试为 XDocument 创建一个 XMLWriter,并对其应用设置,但我不知道如何做。 这是我目前所拥有的。 var writerSettings = new XmlWri
我目前有一些直接实例化 XmlTextWriter 对象的代码,它允许我将引号字符设置为单引号(我需要它来生成 XML 以匹配遗留系统)。 EG var fred = new XmlTextWrit
我需要将 XmlWriter 的 XmlWriterSettings 的 OmitXmlDeclaration 属性设置为 false 以不创建 XML 声明。问题是我通过调用 XPathNaviga
我正在使用不导入缩写的空 xml 元素的遗留应用程序。例如: 坏空: 好空: 我知道实现此目标的解决方案,现在我将介绍: public class XmlTextWriterFull : XmlT
我需要使用 ISO Latin 1 编码,但使用编写器设置下方的代码默认返回 UTF8。我在这里缺少什么? XmlDocument xmlDoc = new XmlDocument(); XmlWri
在 VS2008 中使用 .Net 3.5 SP1 我有一个 XmlDocument 并尝试将其写入文件: using (XmlTextWriter tw = new XmlTextWriter(ou
我需要编写一个 XML 片段以供网络服务使用。任何 xml 声明都会导致 Web 服务拒绝请求。为了支持这一点,我有以下类(class): public class ContentQueryCrite
我是一名优秀的程序员,十分优秀!