使用LINQ从XML检索值(多选)

时间:2016-01-07 06:38:33

标签: c# xml vb.net linq xelement

我试图将此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>

通过传递参数,&#34;试用&#34;和&#34; B&#34;,结果会给我这个价值&#34; 992.409&#34; (试验/ 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"));

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

如评论中所述,您的VB示例也不会起作用,但在两种语言中都很简单。您需要区分名称,以及过滤的确切工作方式:

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;

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

答案 1 :(得分:0)

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

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