.net XmlSerializer和嵌入式空白

.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

我有下面的xml,它包含一个空格Field1Value。当我反序列化xml时,我丢失了单个空格字符。Request.Field2的值为“”。这是xml序列化程序中的错误吗? 有人能推荐一种解决方案/解决方法来保留此空间吗

  ...
            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;