سؤال

أنا استخدم XmlTextWriter و WriteElementString الطريقة، على سبيل المثال:

XmlTextWriter writer = new XmlTextWriter("filename.xml", null);

writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();

writer.Close();

إخراج XML المتوقع هو:

<User>
    <Username>value</Username>
    <Email>value</Email>
</User>

ومع ذلك، إذا كان على سبيل المثال Inputemail فارغ، فإن النتيجة XML أحصل عليها كما يلي:

<User>
    <Username>value</Username>
    <Email/>
</User>

في حين أن أتوقع أن تكون:

<User>
    <Username>value</Username>
    <Email></Email>
</User>

ما الخطأ الذي افعله؟ هل هناك طريقة لتحقيق النتيجة المتوقعة بطريقة بسيطة باستخدام XmlTextWriter?

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

المحلول

الإخراج الخاص بك هو الصحيح. يجب كتابة عنصر مع عدم وجود محتوى <tag/>.

يمكنك إجبار استخدام العلامة الكاملة عن طريق الاتصال Westfullendelement ()

writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();

هذا سوف يخرج <Email></Email> عندما inputemail فارغة.

إذا كنت ترغب في القيام بذلك أكثر من مرة، فيمكنك إنشاء طريقة تمديد:

public static void WriteFullElementString(this XmlTextWriter writer,
                                          string localName, 
                                          string value)
{
    writer.WriteStartElement(localName);
    writer.WriteString(value);
    writer.WriteFullEndElement();
}

ثم يصبح الكود الخاص بك:

writer.WriteStartElement("User");
writer.WriteFullElementString("Username", inputUserName);
writer.WriteFullElementString("Email", inputEmail);
writer.WriteEndElement();

نصائح أخرى

لا يفشل <Tag/> هو مجرد اختصار ل <Tag></Tag>

يجب أن يكون الكود الخاص بك:

using (XmlWriter writer = XmlWriter.Create("filename.xml"))
{
    writer.WriteStartElement("User");
    writer.WriteElementString("Username", inputUserName);
    writer.WriteElementString("Email", inputEmail);
    writer.WriteEndElement();
}

هذا يتجنب تسرب الموارد في حالة الاستثناءات، ويستخدم الطريقة المناسبة لإنشاء XMLReader (منذ .NET 2.0).

ترك هذا هنا في حالة يحتاج شخص ما؛ نظرا لأن أيا من الإجابات أعلاه حلها بالنسبة لي، أو بدا وكأنها مبالغة.

FileStream fs = new FileStream("file.xml", FileMode.Create);

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

XmlWriter w = XmlWriter.Create(fs, settings);
w.WriteStartDocument();
w.WriteStartElement("tag1");
w.WriteStartElement("tag2");
w.WriteAttributeString("attr1", "val1");
w.WriteAttributeString("attr2", "val2");
w.WriteFullEndElement();
w.WriteEndElement();
w.WriteEndDocument();

w.Flush();
fs.Close();

كانت الحيلة لتعيين xmlwriterstertings.indent = صحيح وأضفها إلى XMLWriter..

يحرر:

بدلا من ذلك يمكنك أيضا استخدام

w.Formatting = Formatting.Indented;

بدلا من إضافة XmlWriterSettings.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top