Я только что столкнулся с этой проблемой. В моем случае XML генерируется кодом, который я контролирую, поэтому я смог добавить атрибут xml: space = preserve. Я использовал IXmlSerializable (по уважительной причине, что я не буду вдаваться здесь). Вот как я это сделал, на случай, если это кому-нибудь пригодится (трудно найти примеры значительной части этой сериализации / десериализации Xml). Этот метод WriteSettings () вызывается моим методом WriteXml (), реализующим IXmlSerializable.
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();
}
}
Это дает мне XML, который выглядит следующим образом (включающий элемент, записанный включающим объектом, а не методом WriteSettings, описанным выше):
<ResourceSettings>
<Setting>
<SettingType>SomeSettingName</SettingType>
<SettingValue>1</SettingValue>
</Setting>
<Setting>
<SettingType>AnotherSettingName</SettingType>
<SettingValue xml:space="preserve"> </SettingValue>
</Setting>
<Setting>
<SettingType>ADifferentSettingName</SettingType>
<SettingValue>some other value</SettingValue>
</Setting>
</ResourceSettings>
Я прочитал это, используя тот же код, что и раньше, и 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
}
}