2015-03-31 78 views
0

的XML响应我有结构如下的XML响应:迭代IN C#

<e:Parents> 
    <d1p1:Parent> 
    <d1p1:Name>A</d1p1:Name> 
    <d1p1:Child>a1</d1p1:Child> 
    <d1p1:Id>101</d1p1:Id> 
    </d1p1:Parent> 
    <d1p1:Parent> 
    <d1p1:Name>A</d1p1:Name> 
    <d1p1:Child>a2</d1p1:Child> 
    <d1p1:Id>102</d1p1:Id> 
    </d1p1:Parent> 
    <d1p1:Parent> 
    <d1p1:Name>B</d1p1:Name> 
    <d1p1:Child>b1</d1p1:Child> 
    <d1p1:Id>201</d1p1:Id> 
    </d1p1:Parent> 
    <d1p1:Parent> 
    <d1p1:Name>B</d1p1:Name> 
    <d1p1:Child>b2</d1p1:Child> 
    <d1p1:Id>202</d1p1:Id> 
    </d1p1:Parent> 
</e:Parents> 

现在基于给定的输入(例如,A a2)的我需要来获取ID(例如102)。

在我的功能我想使用的东西这样

int getId(string str)       // str = A a2 
{ 
    int index = str.IndexOf(' '); 
    string p = str.Substring(0, index);  //A 
    string c = str.Substring(index);  //a2 
    var parent = response.Parents.FirstOrDefault(e => e.Name == p && e.Child == c); 
    return parent.Id; 
} 

它给了我这说的错误:

“的类型参数的方法“System.Linq.Enumerables.FirstOrDefault(系统.Collections.Generics.IEnumerable,System.Func)'不能根据用法推断,请尝试明确指定参数。“

我需要知道如何获得基于父母和孩子的ID。

+0

你看着'XPath'? – user1 2015-03-31 16:15:26

+0

不,我还没有尝试过。 – 2015-03-31 16:22:03

回答

1

以下LINQ表达式应该给你你正在寻找的价值:

XElement xmlSet = XElement.Parse (yourXmlStringHere); 

// Will contain the <parent>..</parent> you want 
var parentNode = 
     xmlSet.Elements("d1p1:Parent") 
      .First(e => e.Elements("d1p1:Name").First().Value == "B" 
         && e.Elements("d1p1:Child").First().Value == "a2"); 

// This will fetch the value - 102 in this case: 
var value = parentNode.Elements("d1p1:Id").First().Value; 
+0

可能有多个父节点,其子值为a2。 例如父母A和父母B都可以有一个名为a2的孩子。 但是如果输入是'B a2',我需要返回它的Id。意思是说我需要检查父值和子值。 – 2015-03-31 16:35:13

+0

我有一个XML响应。不是一个XML字符串。 – 2015-03-31 16:39:17

+0

我已经更新了我的答案,以检查“Name”和“Child”。至于你的回应,你可能能够运行linq查询(?)。如果没有,我相信你可以找出一种方法来将xml提取为一个字符串,可以像我在这里展示的那样解析它。如果你不需要,那么就忽略它。查询是这里的要点。 – Kjartan 2015-03-31 16:52:51