我有以下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>
答案 0 :(得分: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);
答案 1 :(得分: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)
};