С#:XmlTextWriter.WriteElementString не работает с пустыми строками?

StackOverflow https://stackoverflow.com/questions/1176202

Вопрос

я использую 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/>.

Вы можете принудительно использовать полный тег, вызвав WriteFullEndElement().

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();

Хитрость заключалась в том, чтобы установить XmlWriterSettings.Indent = true и добавьте его в XmlWriter.

Редактировать:

В качестве альтернативы вы также можете использовать

w.Formatting = Formatting.Indented;

вместо добавления XmlWriterSettings.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top