LINQ查询到XML文件以获取子标记

时间:2014-04-04 19:52:26

标签: c# xml linq

我正在将XML加载到XMLDocument中。

以下是其结构:

<REPORT id="Loan" version="20120710160558">
    <FILE id="Loan_20120710">
        <INDEX NAME="Amount" VALUE="45000" PAGE="1"/>
        <INDEX NAME="Amount" VALUE="20000" PAGE="2"/>
        <INDEX NAME="Amount" VALUE="32494" PAGE="3"/>
        <INDEX NAME="Name" VALUE="Christie" PAGE="1"/>
        <INDEX NAME="Name" VALUE="Christie" PAGE="2"/>
        <INDEX NAME="Name" VALUE="Christie" PAGE="3"/>
        <INDEX NAME="Date" VALUE="02082012" PAGE="1"/>
        <INDEX NAME="Date" VALUE="02082012" PAGE="2"/>
        <INDEX NAME="Date" VALUE="02082012" PAGE="3"/>
    </FILE>
    <FILE id="Loan_20120712">
        <INDEX NAME="Amount" VALUE="34984" PAGE="1"/>
        <INDEX NAME="Amount" VALUE="34984" PAGE="2"/>
        <INDEX NAME="Amount" VALUE="34984" PAGE="3"/>
        <INDEX NAME="Name" VALUE="Charles" PAGE="1"/>
        <INDEX NAME="Name" VALUE="Charles" PAGE="2"/>
        <INDEX NAME="Name" VALUE="Charles" PAGE="3"/>
        <INDEX NAME="Date" VALUE="03082012" PAGE="1"/>
        <INDEX NAME="Date" VALUE="03082012" PAGE="2"/>
        <INDEX NAME="Date" VALUE="03082012" PAGE="3"/>
    </FILE>
</REPORT>

我正在尝试使用以下LINQ查询:

XmlDocument doc = new XmlDocument();
doc.Load(XMLFile);

var query = from xml in xdoc.Descendants("File")
                               select new 
                               {
                                   Amount = (string)xml.Element("Amount"),
                                   Name = (string)xml.Element("Name"),
                                   Date = (string)xml.Element("Date")

                               };

我在上述查询时遇到错误。

我想使用LINQ查询来获取Amount,Name和contract的值,以便我在数据库中更新?

1 个答案:

答案 0 :(得分:3)

试试这个:

var doc= XDocument.Load(filePath);

var query = from file in doc.Element("REPORT").Elements("FILE")
            from index in file.Elements("INDEX")
            select new 
            {
                File = file.Attribute("id").Value,
                Name = index.Attribute("NAME").Value,
                Value = index.Attribute("VALUE").Value,
                Page = Int32.Parse(index.Attribute("PAGE").Value)
            };

然后,如果您想转动列表:

var pivotQuery = query.GroupBy(p => new {p.File, p.Page}).Select(g => new
{
    File = g.Key.File,
    Page = g.Key.Page,
    Amount = g.Where(p => p.Name == "Amount").First().Value,
    Name = g.Where(p => p.Name == "Name").First().Value,
    Date = g.Where(p => p.Name == "Date").First().Value
});

如果您愿意,也可以将这些查询合并为一个。