【问题标题】:How to create nested XElement based on a condition?如何根据条件创建嵌套的 XElement?
【发布时间】:2011-02-24 21:14:26
【问题描述】:

我正在尝试将数据结构保存为 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。

编辑:所以对于不透明度,假设它是这样的:

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

【问题讨论】:

  • 你能告诉我们修改后的 XML 应该是什么样子吗?
  • 实际上,我希望更像 EBCEu4 所展示的方式。所以 Effect 有 2 个子值,Type 和 Opacity。虽然我不确定是否应该为每个效果创建不透明度部分,即使它们没有。不知道哪个更适合解析。

标签: c# .net xml xelement


【解决方案1】:

你最好这样存储你的文件:

<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();

【讨论】:

  • 谢谢,但对于你的,如果他们没有不透明度(不透明度 == null),我将为每个人提供空的不透明度。这样解析会更好吗?
  • 没有 标签所以如果你有 e.Opacity == null 你会得到 Blur 你也可以设置opacity 属性,如果你想摆脱 标签,如 Blur
【解决方案2】:

假设 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();

我补充的翻译:

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

如果不透明度 0,则应如下所示:

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

编辑:

要匹配您的新规范,只需将this.Opacity &gt; 0.0f 更改为this.Opacity != null,并确保您为Opacity 定义了适当的ToString 方法。生成的 XML 最终看起来或多或少相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 2021-07-08
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多