Удаление лишнего пространства в пустых элементах в XDocument.ToString () - PullRequest
0 голосов
/ 04 июня 2019

Я отправляю сообщения XML в систему, которая не может обработать пробелы в разметке. Пробелы в значениях в порядке. Я использовал linq / XDocument / XElements для манипулирования / генерации сообщений.

Проблема в том, что элемент пуст. Например:

XDocument xdoc = XDocument.Parse("<root><value/></root>");
Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));

Выводит строку с пробелом в разметке после заголовка элемента, даже если DisableFormatting включен.

<root><value /></root>

Так что я просто вставил замену:

Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting).Replace(" />","/>"));

Есть что-нибудь плохое, что я мог бы встретить там? Есть ли очевидный / более стандартный способ сделать это? Кажется, джанк.

1 Ответ

1 голос
/ 04 июня 2019

Если ваша целевая система обрабатывает пустые элементы xml таким же образом, как и самозакрывающиеся элементы xml - , как и в целом, оба считаются равными (но учитывайте замечания на этом post ) - вы можете реализовать пользовательский XmlWriter, который выводит самозакрывающиеся теги XML в виде пустых тегов XML.
Пустые теги xml не будут содержать пробелов в своем теге, например. <value></value>.

Пользовательский XmlTextWriter в приведенном ниже примере создает следующий xml.
Обратите внимание на теги <value></value> и то, что значение пробела для valueWithWhitespace было сохранено.

<root><value></value><valueWithWhitespace>   </valueWithWhitespace></root>
<час>
var xml = XElement.Parse(
    "<root><value /><valueWithWhitespace>   </valueWithWhitespace></root>",
    LoadOptions.PreserveWhitespace
    );

var stringWriter = new StringWriter();
using (var xmlWriter = new CustomXmlTextWriter(stringWriter))
{
    xml.WriteTo(xmlWriter);
    xmlWriter.Flush();
    Console.WriteLine(stringWriter);
}
<ч />
public class CustomXmlTextWriter : XmlTextWriter
{
    public CustomXmlTextWriter(TextWriter writer)
        : base(writer)
    {}

    public CustomXmlTextWriter(Stream stream, Encoding encoding)
        : base(stream, encoding)
    {}

    public CustomXmlTextWriter(string filename, Encoding encoding)
        : base(filename, encoding)
    {}

    public override void WriteEndElement()
    {
        this.WriteFullEndElement();
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...