Можем ли мы заставить XmlWriter выдавать <my-tag> </ my-tag>, а не <my-tag />? - PullRequest
20 голосов
/ 26 января 2012

По умолчанию

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

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

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

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

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

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

Ответы [ 8 ]

18 голосов
/ 11 июля 2012

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

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

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

3 голосов
/ 29 января 2015

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

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

2 голосов
/ 06 января 2016

Попробуйте это:

x.WriteStartElement("my-tag"); 

//Value of your tag is null

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

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

x.WriteEndElement();
1 голос
/ 15 апреля 2016

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

if (string.IsNullOrEmpty(myStringValue))
{
   myWriter.WriteStartElement("mytag");
   myWriter.WriteFullEndElement();
}
else
{
   myWriter.WriteElementString("mytag", myStringValue);
}
1 голос
/ 26 января 2012

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

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

Возможно, создайте служебный класс с функцией-членом.

0 голосов
/ 09 сентября 2015

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

    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.

0 голосов
/ 21 сентября 2012

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

private static XElement MakeElementLongHand(this XElement rootElem)
{
   rootElem.Value = " ";
   rootElem.Value = string.Empty;
   return rootElem;
}
0 голосов
/ 26 января 2012

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

...