【问题标题】:Using LINQ to retrieve value from XML (Multiple selection)使用 LINQ 从 XML 中检索值(多选)
【发布时间】:2016-01-07 06:38:32
【问题描述】:

我正在尝试将此 VB.Net LINQ 转换为 C# LINQ。

基本上,最终解决方案试图实现的是接收一个 XML 文件;见sn-p:

<BasicFee>
        <TrialType>Trial</TrialType>
        <A>1326.85575</A>
        <B>992.409</B>
        <C>668.67075</C>
        <D>1260.50925</D>
        <E>318.8955</E>
        <F>323.30925</F>
        <G>323.30925</G>
        <H>323.44125</H>
        <I>323.169</I>
        <J>1326.85575</J>
        <K>932.877</K>
</BasicFee>

通过传递参数“Trial”和“B”,结果会给我这个值“992.409”(来自 Trial / B)。


编辑 - 此 VB 不是实现结果的正确语法。请查看已接受的答案。

VB 等价物显然是这样的;

Dim sResult As String = (From oRecord In oXML.Descendants("BasicFee") Where oRecord.< Name >.Value = "Trial").FirstOrDefault.< B >.Value

我尝试了很多不同的方法,但始终得到相同的结果(Trial 元素或 A 元素值(不能同时使用它们)。

我希望会有类似的东西:

var example = root.Elements("BasicFee").Elements().Where((c=>c.Value == "Trial" && c.Value == "A"));

有什么想法吗?

谢谢。

【问题讨论】:

  • 你的VB版本不会有任何结果,没有&lt;Name&gt;元素。
  • @JeffMercado 谢谢,我已经注意到(我会编辑问题)——在乔恩向我展示了正确的例子之后,现在一切都说得通了。

标签: c# xml vb.net linq xelement


【解决方案1】:

如 cmets 中所述,您的 VB 示例也不起作用,但在两种语言中都非常简单。您需要区分 namesvalues,以及过滤的具体工作方式:

var example = root.Elements("BasicFee")
                  .Where(x => (string) x.Element("TrialType") == "Trial")
                  .Select(x => (string) x.Element("B"))
                  .FirstOrDefault();

或者你可以使用 C# 6:

var example = root.Elements("BasicFee")
                  .FirstOrDefault(x => (string) x.Element("TrialType") == "Trial")
                  ?.Element("B")?.Value;

如果没有这样的元素(没有匹配的BasicFee 或其中没有B 元素),则值将为null

【讨论】:

  • 仍在等待接受...经过几个小时的尝试,您让它看起来如此简单!谢谢!
  • 您是否愿意加倍努力并为 VB 提供相同的结果(出于好奇)?
  • @Hexie:我不知道最惯用的 VB 形式是什么,但是将第一种形式直接翻译成 VB 就可以了。 (不确定最新的VB是否有空条件运算符。)
【解决方案2】:

在 C# 中查找具有该试用类型和 B 值的 BasicFee

var trialType = "Trial";
var propertyName = "B";
var query = oXML.Descendants("BasicFee")
    .Where(bf => (string)bf.Element("TrialType") == trialType)
    .Select(bf => (string)bf.Element(propertyName))
    .SingleOrDefault();

另一方面,VB 版本可以这样写:

Dim trialType = "Trial"
Dim propertyName = "B"
Dim query =
    (From bf In oXML...<BasicFee> ''// ... equivalent to Descendants
    Where bf.<TrialType>.Value = trialType
    Select bf.Element(propertyName).Value).SingleOrDefault

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多