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>
4

2 回答 2

3

您可以投影到包含所需属性的匿名类型:

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);
}

经过测试并正常工作,按预期返回 3 个结果。

要将其添加到字典中,只需添加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);
于 2012-06-19T14:17:13.860 回答
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)
        };
于 2012-06-19T14:19:43.977 回答