Удаление пробелов в закрывающих тегах при записи xml-документа

При написании XML-документа мне нужно написать все самозакрывающиеся теги без пробелов, например:

<foo/> 

вместо:

<foo />

Причиной этого является то, что система поставщика, с которой я взаимодействую, бросает по-другому. В идеальном мире поставщик исправит свою систему, но я не уверен, что это произойдет в ближайшее время. Какой лучший способ получить XmlWriter для вывода закрывающих тегов без пробела?

Моя текущая схема - сделать что-то вроде:

return xml.Replace(" />", "/>");

Очевидно, это далеко не идеально. Можно ли подклассифицировать XmlWriter для этой одной операции? Есть ли настройка как часть XmlWriterSettings, которую я пропустил?

Ответ 1

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

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

Надеюсь, вы могли бы написать синтаксис <elementName></elementName> вместо нежелательного <elementName />, для этого используйте метод XmlWriter.WriteFullEndElement, например:

using System.Xml;
..

static void Main(string[] args)
{
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
    xmlWriterSettings.Indent = true;
    xmlWriterSettings.IndentChars = ("\t");
    xmlWriterSettings.OmitXmlDeclaration = true;
    XmlWriter writer = XmlWriter.Create("example.xml", xmlWriterSettings);

    writer.WriteStartElement("root");

    writer.WriteStartElement("element1");
    writer.WriteEndElement();

    writer.WriteStartElement("element2");
    writer.WriteFullEndElement();

    writer.WriteEndElement();
    writer.WriteEndDocument();
    writer.Close();
}

создает следующий XML-документ:

<root>
    <element1 />
    <element2></element2>
</root>

Ответ 2

Используйте другой сериализатор, например саксонский сериализатор, который также работает в .NET. Так получилось, что саксонский сериализатор делает то, что вы хотите.

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

Ответ 3

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

 x.WriteStartElement("my-tag"); 

//Value of your tag is null
If (<"my-tag"> == "")
{
 x.WriteWhitespace("");
}else
 x.WriteString(my-tag);

x.WriteEndElement();