ich gerade auf dieses Problem gestoßen. In meinem Fall wird der XML-Code vom Code generiert, den ich kontrolliere, sodass ich das xml: space = preserve-Attribut hinzufügen konnte. Ich habe IXmlSerializable verwendet (aus einem guten Grund, dass ich hier nicht eingehen werde). Hier ist, wie ich es getan habe, falls dies für jemanden hilfreich ist (es ist schwer, Beispiele für viele dieser Xml-Serialisierung/Deserialisierung zu finden). Diese WriteSettings() -Methode wird von meiner WriteXml() - Methode aufgerufen, die IXmlSerializable implementiert.
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();
}
}
Das gibt mir XML-Code, wie diese (durch Einschließen Objekt geschrieben umschließenden Element, nicht die write Methode oben) aussieht:
<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>
Ich lese diese den gleichen Code in Verwendung ich vorher hatte und die XmlReader respektiert die xml: space = bewahren Attribut, zB:
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
}
}