如何根据条件创建嵌套的XElement?

时间:2011-02-24 21:14:26

标签: c# .net xml xelement

我正在尝试将数据结构保存为xml,如下所示:

return new XElement ( "EffectFile",
    new XElement ( "Effects", this.Effects.Select ( e => new XElement ( "Effect", e.EffectType ) ) )
).ToString ( );

创建了这样的东西:

<EffectFile>
  <Effects>
    <Effect>Blur</Effect>
    <Effect>Sharpen</Effect>
    <Effect>Median</Effect>
  </Effects>
</EffectFile>

但是我还想要一个条件,如果一个效果具有不透明度,我想在效果中保存它。

我无法锻炼如何在lambda表达式中嵌套该条件以创建嵌套的XElement。

编辑:那么对于Opacity,让我们说它是这样的:

if (e.Opacity != null) new xElement("Opacity", e.Opacity)

2 个答案:

答案 0 :(得分:4)

最好像这样存储文件:

<EffectFile>
  <Effects>
    <Effect>
       <EffectType>Blur</EffectType>
       <Opacity>100</Opacity>
    </Effect>
  </Effects>
</EffectFile>

_

 return new XElement("EffectFile",
                                    new XElement("Effects", this.Effects.Select(e => new XElement("Effect", new XElement("EffectType", e.EffectType), e.Opacity != null ? new XElement("Opacity", e.Opacity) : null)))
                    ).ToString();

答案 1 :(得分:1)

假设Opacity是您班级的float实例属性,您可以将三元运算符(?:)与Concat扩展方法结合使用。

return new XElement("EffectFile",
    new XElement("Effects",
        this.Effects
            .Select(e => new XElement("Effect", e.EffectType))
            .Concat(this.Opacity > 0.0f
                ? new[] { new XElement("Opacity", this.Opacity) }
                : Enumerable.Empty<XElement>()
                )
        )
    )
    .ToString();

我的补充的翻译:

如果不透明度大于零,请创建一个大小为1的新列表(带有不透明度元素),并将其附加到效果列表。如果不透明度小于或等于零,则创建一个大小为零的新列表,并将其附加到效果列表(基本上是无操作,就列表而言)。

如果不透明度为&lt; = 0,您的输出文件将类似于您在问题中指定的输出文件,如果是&gt;则输出文件应如下所示: 0:

<EffectFile>
  <Effects>
    <Effect>Blur</Effect>
    <Effect>Sharpen</Effect>
    <Effect>Median</Effect>
    <Opacity>0.75</Opacity>
  </Effects>
</EffectFile>

编辑:

要符合您的新规范,只需将this.Opacity > 0.0f更改为this.Opacity != null,并确保为ToString定义了相应的Opacity方法。生成的XML最终会看起来或多或少相同。