【问题标题】:How to get the value in an xml section, and if not present set the value as null?如何获取 xml 部分中的值,如果不存在,则将值设置为 null?
【发布时间】:2011-07-05 23:48:21
【问题描述】:

我有一个这样的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<EffectFile>
  <Effects>
    <Effect>
      <Type>Blur</Type>
    </Effect>
    <Effect>
      <Type>Sharpen</Type>
    </Effect>
    <Effect>
      <Type>Zoom</Type>
      <Options>
        <Option>88</Option>
        <Option>"miles"</Option>
      </Options>
    </Effect>
  </Effects>
</EffectFile>

我是这样解析的:

xElement.Elements ( "Effects" ).Elements ( "Effect" ).Select (
    e => new Effect (
        ( EffectType ) Enum.Parse ( typeof ( EffectType ), ( string ) e.Elements ( "Type" ).FirstOrDefault ( ) ),
        e.Elements ( "Options" ).Select ( p => ( object ) p.Elements ( "Option" ) ) ) );

但是在这个版本中,每个Effect 至少会得到一个空的EffectOptions 值。有没有办法指定如果Effect 没有Options 部分,则该值应收集为空?

Effect 类型有这样的构造函数:

new Effect (EffectType type, EffectOptions options)

如果没有Options 部分,则只想将 null 传递给第二个参数。

【问题讨论】:

  • 说实话,我不明白,为什么代码完全有效。语句末尾对object 的强制转换与构造函数所需的参数类型EffectOptions 冲突。
  • 你说得对,我遗漏了一个细节。发生的情况是 Effect 也有一个构造函数,其中第二个参数是 IEnumerable 选项,它被传递给 EffectOptions,后者知道如何将 IEnumerable 转换为其内部选项列表。

标签: c# .net linq xmlreader xelement


【解决方案1】:

只需使用Any()

e.Elements("Options").Any() 
           ? e.Elements("Options").Select (p => (object) p.Elements("Option")) 
           : null ) 

【讨论】:

  • 谢谢,如果存在的话,Any 还会给我多个 Option 值吗?
  • @Joan: Any() 只是检查集合中是否至少有一项,其余的通过使用? &lt;original clause&gt; : null 完成,因此如果至少有一项,则使用您的集合,否则为空
  • 非常感谢,这正是我所需要的。
  • @BrokenGlass:这有点不相关,但我现在注意到存储的 Option 值似乎是 System.Xml.Linq.XContainer+d__11 类型。所以我认为我没有得到 xml 文件中 Options 标记内的实际值。你知道怎么做吗?我以为 p.Elements("Option") 会给我 88 和分别的“英里”。
  • 为什么不直接将构造函数更改为接受IEnumerable&lt;XElement&gt; 而不是object?据我所知,没有理由那么不安全......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2023-03-13
  • 2017-09-20
  • 2022-01-06
  • 2022-01-20
相关资源
最近更新 更多