मैं सिर्फ इस समस्या का सामना करना पड़ा। मेरे मामले में एक्सएमएल कोड I नियंत्रण द्वारा उत्पन्न होता है, इसलिए मैं xml: space = preserve संरक्षित करने में सक्षम था। मैं IXmlSerializable का उपयोग कर रहा था (एक अच्छे कारण के लिए कि मैं यहां नहीं जाऊंगा)। यहां बताया गया है कि मैंने इसे कैसे किया है, अगर यह किसी के लिए सहायक है (इस एक्सएमएल क्रमबद्धता/deserialization के उदाहरणों को खोजने में मुश्किल है)। यह WriteSettings() विधि को IXmlSerializable लागू करने वाली मेरी WriteXml() विधि द्वारा बुलाया जाता है।
<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>
मैं एक ही कोड मैं पहले था उसका उपयोग करके इस पढ़ सकते हैं और:
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();
}
}
यह मैं एक्सएमएल है कि इस (संलग्न वस्तु enclosing, नहीं WriteSettings उपरोक्त विधि द्वारा लिखित तत्व) की तरह दिखता है देता है XmlReader का सम्मान करता है xml: space = बनाए रखने विशेषता, जैसे:
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
}
}