Можем ли мы заставить XmlWriter выдавать <my-tag></my-tag> вместо <my-tag/">?

По умолчанию

someXmlWriter.WriteElementString("my-tag", someString);

производит <my-tag />

Я просмотрел XmlWriterSettings класс для возможных параметров, которые заставили бы автора создавать <my-tag></my-tag> вместо этого ничего не нашел.

Есть ли простой способ заставить XmlWriter выдавать пустые элементы с помощью "открытого тега, тега close" "а не с короткой формой?

Edit:
Да! Я понимаю, что в отношении XML-обоснованности две записи эквивалентны, действительны и все... Я, тем не менее, работаю с устаревшим кодом, который анализирует такой XML, используя Read(), т.е. на уровне node (!) И искажает вещи вверх по Read(), когда на пустой node...

Следовательно, мой вопрос приходит в контексте ограничения количества изменений этого устаревшего кода. Вопрос действительно перекрывается с этим SO-вопросом, как было предложено; ни один из предложенных вариантов, однако, легко применим к моей ситуации.

Ответ 1

Нет установки параметров для этого в .Net. Это одно и то же, и любой парсер должен иметь возможность обрабатывать действительный XML.

Ответ 2

Это сработало для меня:

writer.WriteStartElement("my-tag");
writer.WriteRaw(someString);
writer.WriteFullEndElement();

WriteEndElement по-прежнему закрывает тег

Ответ 3

Если вы получите сообщение 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();
    }
}

Надеемся, что это окажется полезным: -)

Ответ 4

Попробуйте следующее:

x.WriteStartElement("my-tag"); 

//Value of your tag is null

If (<"my-tag"> == "")

{
  x.WriteWhitespace("");
}else
  x.WriteString(my-tag);

x.WriteEndElement();

Ответ 5

Вы пробовали что-то вроде этого:

if (someString.Length > 0)
{
  someXmlWriter.WriteElementString("my-tag", someString);
}
else
{
  someXmlWriter.WriteStartElement("my-tag");
  someXmlWriter.WriteEndElement("my-tag");
}

Может быть, сделать класс утилиты с помощью функции-члена.

Ответ 6

Оставив это здесь, если кому-то это понадобится; так как ни один из вышеперечисленных ответов не разрешил это для меня или не казался излишним.

    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.

Edit:

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

w.Formatting = Formatting.Indented;

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

Ответ 7

Я просто столкнулся с этой одной и той же проблемой, и хотя это похоже на хак, это действительно работало и было очень неинтрузивным для существующего кода, с которым мне приходилось работать.

private static XElement MakeElementLongHand(this XElement rootElem)
{
   rootElem.Value = " ";
   rootElem.Value = string.Empty;
   return rootElem;
}

Ответ 8

Я использую следующий код:

if (string.IsNullOrEmpty(myStringValue))
{
   myWriter.WriteStartElement("mytag");
   myWriter.WriteFullEndElement();
}
else
{
   myWriter.WriteElementString("mytag", myStringValue);
}