2012-06-19 53 views
0

我有以下xml,我需要从同一个查询中获得2个值(请参阅*注释): 这两个值是关联的,我可以获得一组() or the other() but not using a single query.找到一个节点,它在一个查询中匹配后代节点

Update I updated the xml below to include 2 nodes that exist under the node and added the namespace

Ideally I would like to get them both in a single query into a Dictionary

<root xmlns="http://www.blah.net/xsd/layout/2003-10-16"> 
    <header/> 
    <movement> 
     <movementHeader> 
      <desc>xyz</desc> 
     </movementHeader> 
     <detailHeader> 
      <desc>abc</desc> 
     </detailHeader> 
     <detail> 
      <!-- * need this value --> 
      <code>90125</code> 
      <subDetail> 
       <!-- * and need this value at same time --> 
       <amount>1200.00</amount> 
      </subDetail> 
     </detail> 
     <detail> 
      <!-- * need this value --> 
      <code>90126</code> 
      <subDetail> 
       <!-- * and need this value at same time --> 
       <amount>1300.00</amount> 
      </subDetail> 
     </detail> 
     <detail> 
      <!-- * need this value --> 
      <code>9012</code> 
      <subDetail> 
       <!-- * and need this value at same time --> 
       <amount>1400.00</amount> 
      </subDetail> 
     </detail> 
    </movement> 

回答

3

You can project to an anonymous type that holds the properties you want:

var results = xdoc.Descendants("detail") 
        .Select(x => new 
        { 
         Code = x.Element("code").Value, 
         Amount = x.Element("subDetail") 
           .Element("amount").Value 
        }); 

foreach (var item in results) 
{ 
    Console.WriteLine("Code = {0}, Amount = {1}", item.Code, item.Amount); 
} 

Tested and works, returns 3 results as expected.

To add this to a dictionary just add ToDictionary()

var dict = xdoc.Descendants("detail") 
       .Select(x => new 
       { 
        Code = x.Element("code").Value, 
        Amount = x.Element("subDetail") 
          .Element("amount").Value 
       }).ToDictionary(x => x.Code, x => x.Amount); 

编辑:

要考虑,你必须声明和使用它的XML命名空间,更新下面的例子:

XNamespace ns = "http://www.blah.net/xsd/layout/2003-10-16"; 
var dict = xdoc.Descendants(ns + "detail") 
       .Select(x => new 
       { 
        Code = x.Element(ns + "code").Value, 
        Amount = x.Element(ns + "subDetail") 
          .Element(ns + "amount").Value 
       }).ToDictionary(x => x.Code, x => x.Amount); 
+0

尝试了您的解决方案,结果没有任何结果。 xml稍微复杂一点(上面已更新),因为它具有添加到节点的奇怪节点,并且它有一个名称空间。我怀疑NS是一个问题,并且将XNamespace添加到您的代码示例中,但仍然不返回结果 – Tab

+1

@Tab:使用'Element((XNamespace)nsString +“tagname”)' – abatishchev

+0

我在发表评论之前尝试了以下内容: XNamespace nsr = Settings.DefaultNamespace; ... 元素(nsr +“代码”)。值, – Tab

0
var r = from d in doc.Root.Element("movement").Elements("detail") 
     let amount = (string)d.Element("subDetail").Element("amount") 
     select new 
     { 
      Code = (string)d.Element("code"), 
      Amount = Decimal.Parse(amount) 
     }; 
+0

此示例给出了一个NullReferenceException - 用于... – Tab

+0

@Tab:什么行? – abatishchev

+0

由于您给出的整个样本都作为单个语句处理,因此很难区分哪个'行' – Tab

相关问题