سؤال

لدي فئة مع خاصية ملحوظ مع [XmlText], ، وهذا يقبل المدخلات المتعددة. في ملف XML الخاص بي، قمت بالتحقق من أن النهايات السطرية داخل محتوى النص أصبحت infact "\r\n", ، نفس بقية الملف.

الرمز الذي أستخدمه لتحمل هو:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList));
string file = "test.xml";

if (File.Exists(file))
{
    using (TextReader r = new StreamReader(file))
    {
        foo = configSerializer.Deserialize(r);
    }
}

ولكن، داخل المؤشر ل [XmlText] خاصية، value عنده من قبل "\n" كخط ينتهي. السبب الرئيسي هذا مزعج هو ل "\n" النهايات الخطية لا تعرض بشكل صحيح في TextBox... أنا لست متأكدا تماما من الجزء الذي يسبب المشاكل، لكنني اعتقدت أن شخصا ما قد يكون قادرا على إلقاء بعض الضوء على الوضع.

هل كانت مفيدة؟

المحلول

لقد غيرت نموذج التعليمات البرمجية لتسهيل وضع التعليمات البرمجية بسرعة في بيئة تطوير C #. لقد لم يتم إدراجها أيضا باستخدام عبارات - فهي فقط نموذج التعليمات البرمجية.

على سبيل المثال، لدينا فئة متابعة نود التسلسل:

   public class DataToSerialize
   {
       public string Name { get; set; }
   }

إذا حاولنا التسلسل والتحالين في الطريقة التي تصفها في الطريقة التي تصفها، فلن يتم تنفيذ "نفس" طباعة "(أفترض أن الرمز سيتم تشغيله على Windows مع بيئة .NEWLINE، استبدل ب" r n " إذا لم تكن):

    DataToSerialize test = new DataToSerialize();
    test.Name = "TestData" + Environment.NewLine;
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize));
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);
    configSerializer.Serialize(sw, test);
    ms.Position = 0;
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms);
    if (deserialized.Name.Equals("TestData" + Environment.NewLine))
    {
        Console.WriteLine("Same");
    }

ومع ذلك، يمكن إصلاح ذلك، من خلال تعيين XMLTExTreader يدويا إلى Serializer، مع تعيين خاصية التطبيع الخاصة بها إلى False (يتم تعيين واحد المستخدم بشكل افتراضي في Serializer إلى True):

    DataToSerialize test = new DataToSerialize();
    test.Name = "TestData" + Environment.NewLine;
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize));
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);

    configSerializer.Serialize(sw, test);
    ms.Position = 0;
    XmlTextReader reader = new XmlTextReader(ms);
    reader.Normalization = false;
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader);
    if (deserialized.Name.Equals("TestData" + Environment.NewLine))
    {
        Console.WriteLine("Same");
    }

سيتم الآن الطباعة الآن، والتي ما لم أكن مخطئا هل السلوك الذي تحتاجه؟

نصائح أخرى

إذا كنت تسلسل, ، ومن بعد XmlWriterSettings.NewLineHandling (Replace) سيكون يستحق المحاولة - لكن هذا لن يساعد في القراءة. Grungy بعض الشيء، ولكن ربما تفعل هذا مباشرة في setter:

private string text;
[XmlText]
public string Text {
    get { return text; }
    set 
    {
        Regex r = new Regex("(?<!\r)\n");
        text = r.Replace(value, "\r\n"); 
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top