Ответ 1
Нет установки параметров для этого в .Net. Это одно и то же, и любой парсер должен иметь возможность обрабатывать действительный XML.
По умолчанию
someXmlWriter.WriteElementString("my-tag", someString);
производит <my-tag />
Я просмотрел XmlWriterSettings класс для возможных параметров, которые заставили бы автора создавать <my-tag></my-tag>
вместо этого ничего не нашел.
Есть ли простой способ заставить XmlWriter выдавать пустые элементы с помощью "открытого тега, тега close" "а не с короткой формой?
Edit:
Да! Я понимаю, что в отношении XML-обоснованности две записи эквивалентны, действительны и все... Я, тем не менее, работаю с устаревшим кодом, который анализирует такой XML, используя Read(), т.е. на уровне node (!) И искажает вещи вверх по Read(), когда на пустой node...
Следовательно, мой вопрос приходит в контексте ограничения количества изменений этого устаревшего кода. Вопрос действительно перекрывается с этим SO-вопросом, как было предложено; ни один из предложенных вариантов, однако, легко применим к моей ситуации.
Нет установки параметров для этого в .Net. Это одно и то же, и любой парсер должен иметь возможность обрабатывать действительный XML.
Это сработало для меня:
writer.WriteStartElement("my-tag");
writer.WriteRaw(someString);
writer.WriteFullEndElement();
WriteEndElement по-прежнему закрывает тег
Если вы получите сообщение Extension method can only be declared in non-generic, non-nested static class
, поскольку слово this
может быть выделено, просто создайте класс расширения, как показано ниже:
public static class Extension
{
public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
{
writer.WriteStartElement(localName);
writer.WriteRaw(value);
writer.WriteFullEndElement();
}
}
Надеемся, что это окажется полезным: -)
Попробуйте следующее:
x.WriteStartElement("my-tag");
//Value of your tag is null
If (<"my-tag"> == "")
{
x.WriteWhitespace("");
}else
x.WriteString(my-tag);
x.WriteEndElement();
Вы пробовали что-то вроде этого:
if (someString.Length > 0)
{
someXmlWriter.WriteElementString("my-tag", someString);
}
else
{
someXmlWriter.WriteStartElement("my-tag");
someXmlWriter.WriteEndElement("my-tag");
}
Может быть, сделать класс утилиты с помощью функции-члена.
Оставив это здесь, если кому-то это понадобится; так как ни один из вышеперечисленных ответов не разрешил это для меня или не казался излишним.
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.
Я просто столкнулся с этой одной и той же проблемой, и хотя это похоже на хак, это действительно работало и было очень неинтрузивным для существующего кода, с которым мне приходилось работать.
private static XElement MakeElementLongHand(this XElement rootElem)
{
rootElem.Value = " ";
rootElem.Value = string.Empty;
return rootElem;
}
Я использую следующий код:
if (string.IsNullOrEmpty(myStringValue))
{
myWriter.WriteStartElement("mytag");
myWriter.WriteFullEndElement();
}
else
{
myWriter.WriteElementString("mytag", myStringValue);
}