Скрытие узлов XElement без данных

У меня возникли проблемы с сокрытием XElements без данных.

Если у меня есть этот код:

string missing = string.Empty;
XElement missingNodes = new XElement("TOPLEVEL",
    new XElement("FIELD1", "VALUE1"),
    new XElement("FIELD2", missing),
    new XElement("FIELD3", "VALUE3")
);

В итоге я строю эту схему:

<TOPLEVEL>
  <FIELD1>VALUE1</FIELD1>
  <FIELD2></FIELD2>
  <FIELD3>VALUE3</FIELD3>
</TOPLEVEL>

Если я изменю отсутствующее значение на null вместо String.Empty, второе поле станет следующим:

<FIELD2 />

Есть ли простой способ скрыть узлы с пустыми/нулевыми данными?

Я бы хотел, чтобы это выглядело примерно так:

<TOPLEVEL>
  <FIELD1>VALUE1</FIELD1>
  <FIELD3>VALUE3</FIELD3>
</TOPLEVEL>

ИЗМЕНИТЬ:

Следуя совету @sine и @gunr2171, я пошел по пути отказа от добавления пустых/нулевых узлов.

Поскольку я хотел сохранить все во вложенном новом формате (без большого количества ветвей if/then), я попытался использовать проверку с тремя условиями для нулевого значения. Интересно, что XElement не оставляет артефактов, если вы передаете null как содержимое чего-либо.

Итак, это сделало трюк:

string missing = null;
XElement missingNodes = new XElement("TOPLEVEL",
    new XElement("FIELD1", "VALUE1"),
    (missing != null ) ? new XElement("FIELD2", missing) : null,
    new XElement("FIELD3", "VALUE3")
);

person micahhoover    schedule 06.03.2013    source источник
comment
Я думаю, что единственный способ сделать это - не добавлять XElements с нулевым значением...   -  person makim    schedule 06.03.2013
comment
Да, либо не добавлять узлы, либо добавлять нули должны давать те же результаты. Я бы предпочел не добавлять узлы, потому что мне не нужно тратить время на вызов метода. Помните, что вы также можете использовать XElement.Add для добавления дочерних элементов вместо конструктора.   -  person gunr2171    schedule 06.03.2013


Ответы (1)


Я считаю, что @sine прав. Вам просто нужно проверить, является ли значение нулевым/пустым, а не вставлять значение.

public void AddIfValid(XElement root, string tagName, string value, string excludeValue)
{
    if (value != excludeValue)
        root.Add(new XElement(tagName, value);
}
person gunr2171    schedule 06.03.2013