С#:XmlTextWriter.WriteElementString не работает с пустыми строками?
-
19-09-2019 - |
Вопрос
я использую 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
.