使用 LINQ 从 XML 中检索值(多选)
Using LINQ to retrieve value from XML (Multiple selection)
我正在尝试将此 VB.Net LINQ 转换为 C# LINQ。
基本上,最终解决方案试图实现的是接收一个 XML 文件;见片段:
<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”(试验 / B 的结果)。
编辑 - VB 不是实现结果的正确语法。请查看已接受的答案。
VB 等价物显然是这样的;
Dim sResult As String = (From oRecord In oXML.Descendants("BasicFee") Where oRecord.< Name >.Value = "Trial").FirstOrDefault.< B >.Value
我尝试了很多不同的方法,但一直得到相同的结果(试用元素或 A 元素值(无法同时使用它们))。
我希望有类似这样的东西:
var example = root.Elements("BasicFee").Elements().Where((c=>c.Value == "Trial" && c.Value == "A"));
有什么想法吗?
谢谢。
如评论中所述,您的 VB 示例也不起作用,但用两种语言都非常简单。您需要区分 names 和 values,以及过滤的具体工作方式:
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
。
要在 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
我正在尝试将此 VB.Net LINQ 转换为 C# LINQ。
基本上,最终解决方案试图实现的是接收一个 XML 文件;见片段:
<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”(试验 / B 的结果)。
编辑 - VB 不是实现结果的正确语法。请查看已接受的答案。
VB 等价物显然是这样的;
Dim sResult As String = (From oRecord In oXML.Descendants("BasicFee") Where oRecord.< Name >.Value = "Trial").FirstOrDefault.< B >.Value
我尝试了很多不同的方法,但一直得到相同的结果(试用元素或 A 元素值(无法同时使用它们))。
我希望有类似这样的东西:
var example = root.Elements("BasicFee").Elements().Where((c=>c.Value == "Trial" && c.Value == "A"));
有什么想法吗?
谢谢。
如评论中所述,您的 VB 示例也不起作用,但用两种语言都非常简单。您需要区分 names 和 values,以及过滤的具体工作方式:
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
。
要在 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