Patrick Skelton Ответов: 1

Как получить дополнительные XML-элементы с помощью синтаксиса LINQ lamda?


Это продолжение другого вопроса, который я задал здесь: https://www.codeproject.com/Answers/5162098/How-do-I-convert-this-LINQ-query-to-function-synta#answer1

Я генерирую XML, который мне нужен, используя следующий код:
bool includeDetails = true;
XElement breakdown = new XElement
( "Breakdown",
	new XElement( "DetailsIncluded", includeDetails ),
	new XElement
	( "Sections", estimateBreakdown.Sections.Select( x => new XElement
		( "Section",
			new XAttribute( "SectionNumber", x.SectionNumber ),
			new XAttribute( "SectionName", x.SectionName ),
			x.CostItems.Select( c => new XElement
			( "CostItem",
				new XElement( "Name", c.Name ),
				new XElement( "Units", c.Units.ToString() ),
				( !includeDetails ) ? null : new XElement( "UnitCost", c.UnitCost.ToString() )
			))
		)
	))
);
return breakdown.ToString();

Который генерирует следующий XML-код, когда includeDetails правдивый:
<Breakdown>
  <DetailsIncluded>true</DetailsIncluded>
  <Sections>
    <Section SectionNumber="1" SectionName="Design">
      <CostItem>
        <Name>Site Survey</Name>
        <Units>NotSpecified</Units>
        <UnitCost>0</UnitCost>
      </CostItem>
      <CostItem>
        <Name>Concept Design</Name>
        <Units>NotSpecified</Units>
        <UnitCost>0</UnitCost>
      </CostItem>
    </Section>
  </Sections>
</Breakdown>

И следующий XML когда includeDetails ложный:
<Breakdown>
  <DetailsIncluded>false</DetailsIncluded>
  <Sections>
    <Section SectionNumber="1" SectionName="Design">
      <CostItem>
        <Name>Site Survey</Name>
        <Units>NotSpecified</Units>
      </CostItem>
      <CostItem>
        <Name>Concept Design</Name>
        <Units>NotSpecified</Units>
      </CostItem>
    </Section>
  </Sections>
</Breakdown>

Пока все хорошо. Моя проблема в том, что, когда includeDetails это правда, мне действительно нужно добавить два XElement объекты в XML. Это показывает, что я имею в виду, я думаю, однако это компилируется, но не действовать:
( "CostItem",
	new XElement( "Name", c.Name ),
	new XElement( "Units", c.Units.ToString() ),
	( includeDetails ) ? new XElement( "UnitCost", c.UnitCost.ToString() ) : null,
	( includeDetails ) ? new XElement( "Quantity", c.Quantity.ToString() ) : null
))

Помимо очевидной неэффективности, что я тестирую флаг дважды, я ничего не получаю в своем XML, что, как я подозреваю, означает, что я получаю исключение в XElement конструктор.

Кто-нибудь может показать мне, как это делается?

Что я уже пробовал:

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

Richard Deeming

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

Демонстрация[^]

Maciej Los

Звучит как ответ...

Patrick Skelton

Как все это странно! Теперь это работает и для меня. И я ни за что на свете не смогу воссоздать сломанную версию.

Вызовы ToString() удалены. Спасибо за подсказку!

Richard Deeming

Ага! Появляется дикое плавающая ошибка. :)

1 Ответов

Рейтинг:
10

Richard Deeming

Как обсуждалось в комментариях, код, который вы показали, является правильным, и теперь ошибка исчезла.

Демонстрация: Необязательный онлайн-компилятор Xml | C# | .NET Fiddle[^]


Maciej Los

5ed!