.net XmlSerializer和嵌入式空白
我有下面的xml,它包含一个空格Field1Value。当我反序列化xml时,我丢失了单个空格字符。Request.Field2的值为“”。这是xml序列化程序中的错误吗? 有人能推荐一种解决方案/解决方法来保留此空间吗.net XmlSerializer和嵌入式空白,.net,xml-serialization,.net,Xml Serialization,我有下面的xml,它包含一个空格Field1Value。当我反序列化xml时,我丢失了单个空格字符。Request.Field2的值为“”。这是xml序列化程序中的错误吗? 有人能推荐一种解决方案/解决方法来保留此空间吗 ... var encoding = new System.Text.UTF8Encoding(); var _xmlData = "<Request><Field1>Field1Value</F
...
var encoding = new System.Text.UTF8Encoding();
var _xmlData = "<Request><Field1>Field1Value</Field1><Field2> </Field2></Request>";
var _xmlDataAsByteArray = new byte[_xmlData.Length];
_xmlDataAsByteArray = encoding.GetBytes(_xmlData);
var _memoryStream = new MemoryStream(_xmlDataAsByteArray);
var _XmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(Request));
Request _request = _XmlSerializer.Deserialize(_memoryStream) as Request;
...
public class Request
{
public string Field1;
public string Field2;
}
。。。
var encoding=new System.Text.UTF8Encoding();
var_xmlData=“Field1Value”;
var_xmlDataAsByteArray=新字节[_xmlData.Length];
_xmlDataAsByteArray=encoding.GetBytes(_xmlData);
var_memoryStream=新的memoryStream(_xmlDataAsByteArray);
var_XmlSerializer=new System.Xml.Serialization.XmlSerializer(typeof(Request));
Request _Request=_XmlSerializer.将(_memoryStream)反序列化为请求;
...
公共类请求
{
公共字符串字段1;
公共字符串字段2;
}
将xml:space属性设置为“保留”可能会有所帮助。请参阅作为起点。不,这不是错误,而是预期的行为。除非您选择保留空间,否则XML处理器(即读取和写入XML的应用程序)应该规范化空白。参见XML1.1规范的第2.1节
要保留空白,必须包含xml:space=“preserve”
属性。因此,XML应如下所示:
<Request>
<Field1>Field1Value</Field1>
<!-- spaces inside Field2 will be preserved -->
<Field2 xml:space="preserve"> </Field2>
</Request>
字段1值
我正在研究如何处理保留空白的问题,这个答案在这方面很有用:我刚刚遇到了这个问题。在我的例子中,XML是由我控制的代码生成的,因此我能够添加XML:space=preserve属性。我使用的是IXmlSerializable(有一个很好的理由,我不在这里讨论)。我是这样做的,以防这对某人有帮助(很难找到这种Xml序列化/反序列化的示例)。此WriteSettings()方法由实现IXmlSerializable的WriteXml()方法调用
public static void WriteSettings(XmlWriter writer, Dictionary<string, string> settings)
{
foreach (string key in settings.Keys)
{
string value = settings[key];
writer.WriteStartElement("Setting");
writer.WriteElementString("SettingType", key);
//writer.WriteElementString("SettingValue", value);
// I replaced the above line, which I had previously,
// with the below 5 lines.
writer.WriteStartElement("SettingValue");
if (value != value.Trim())
writer.WriteAttributeString("xml", "space", null, "preserve");
writer.WriteString(value);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
公共静态无效写入设置(XmlWriter编写器、字典设置)
{
foreach(settings.Keys中的字符串键)
{
字符串值=设置[键];
writer.writeStart元素(“设置”);
WriteElementString(“设置类型”,键);
//WriteElementString(“SettingValue”,value);
//我替换了前面的行,
//用下面的5行。
writer.writeStart元素(“设置值”);
if(value!=value.Trim())
WriteAttributeString(“xml”,“space”,null,“preserve”);
writer.WriteString(值);
writer.writeedelement();
writer.writeedelement();
}
}
这使我看到了如下XML(由封闭对象编写的封闭元素,而不是上面的WriteSettings方法):
SomeSettingName
1.
另一个设置名称
A不同的设置名称
其他价值
我使用与以前相同的代码阅读了本文,XmlReader尊重xml:space=preserve属性,例如:
public void ReadXml(XmlReader reader)
{
_cache = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "ResourceSettings")
{
// Deal with the case where there are no settings
if (reader.ReadToDescendant("Setting"))
{
while (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Setting")
{
reader.ReadStartElement("Setting");
string key = reader.ReadElementString("SettingType");
string value = reader.ReadElementString("SettingValue");
reader.ReadEndElement();
_cache.Add(key, value);
}
}
reader.Read(); // move past container
}
}
public-void-ReadXml(XmlReader)
{
_cache=新字典(StringComparer.InvariantCultureInogoreCase);
if(reader.MoveToContent()==XmlNodeType.Element&&reader.LocalName==“ResourceSettings”)
{
//处理没有设置的情况
if(reader.ReadToDescendant(“设置”))
{
while(reader.MoveToContent()==XmlNodeType.Element&&reader.LocalName==“设置”)
{
reader.ReadStartElement(“设置”);
字符串键=reader.ReadElementString(“设置类型”);
字符串值=reader.ReadElementString(“设置值”);
reader.ReadEndElement();
_cache.Add(键、值);
}
}
reader.Read();//移过容器
}
}
您可以使用XmlReader在IngrewHiteSpace设置为false的情况下加载xml
new XmlSerializer(typeof(Request)).Deserialize(XmlReader.Create(_memoryStream, new XmlReaderSettings { IgnoreWhitespace = false })) as Request;
new XmlSerializer(typeof(Request)).Deserialize(XmlReader.Create(_memoryStream, new XmlReaderSettings { IgnoreWhitespace = false })) as Request;