如何使用linq获取根节点属性值

时间:2009-10-09 17:55:33

标签: c# linq-to-xml

我有以下XML。如何使用LINQ读取根节点attribite值及其后代?我试图从根节点读取“dId”和“dTime”,从Customer元素和订单号读取“id”。

<?xml version="1.0" encoding="utf-8" ?>
 <Customers dId="wqwx" dTime="10-9-09 11:23">
   <Customer id="1">
      <Orders>
        <Order number="22" status="ok">
      </Orders>
   </Customer>
 </Customers>

我尝试了以下代码,但它不起作用。

XDocument doc= XDocument.Load(@"C:\Customers.xml");
var q = from c in doc.Descendants("Customers")
        select new        
          {   
           dID = c.Attribute("dId"),
           dTime = c.Attribute("dTime");
          }

5 个答案:

答案 0 :(得分:1)

首先修复你的xml(<Order .... />) 那么,你的linq应该是这样的......

// .Elements(...) selects all elements of type "Customer"
    var q = from c in xDoc.Elements("Customers") 
    select new
    {
        dID = c.Attribute("dId"), 
        dTime = c.Attribute("dTime")
    }; 

你应该dl LinqPad ...它可以让你即时查询Linq查询,甚至是SQL数据库。然后,一旦获得所需的结果,请将linq复制并复制到源代码中。

答案 1 :(得分:1)

您必须使用以下代码结束订单代码:/>

xDoc.Descendants("Customers")应该与xDoc.Elements("Customers")一样有效。

Chris,使用.Elements是否具有特定优势?

答案 2 :(得分:0)

您无法使用LINQ访问根标记。 下面的代码可以满足您的需求(我还包含了一个格式良好的xml文件):

using System;
using System.Linq;
using System.Xml.Linq;

namespace ReadXmlSpike
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Reading file...");
            XDocument doc = XDocument.Load("Customers.xml");
            var customers =
                new
                    {
                        DID = (string) doc.Element("Customers").Attribute("did"),
                        DTime = (DateTime) doc.Element("Customers").Attribute("dTime"),
                        Customers = from customerxml in doc.Descendants("Customer")
                                    select
                                        new
                                            {
                                                ID = (string)customerxml.Attribute("id"),
                                                Orders = from orderxml in customerxml.Descendants("Order")
                                                         select
                                                             new
                                                                 {
                                                                     Number =(string) orderxml.Attribute("number")
                                                                 }
                                            }
                    };
            Console.WriteLine("Customersfile with id: {0} and time {1}",customers.DID,customers.DTime);
            foreach (var customer in customers.Customers)
            {
                Console.WriteLine("Customer with id {0} has the following orders:",customer.ID);
                foreach (var order in customer.Orders)
                {
                    Console.WriteLine("Order with number {0}",order.Number);
                }
            }
            Console.ReadLine();
        }
    }
}

和xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<Customers did="www" dTime="10-09-09 11:23">
  <Customer id="1">
    <Orders>
      <Order number="22" status="ok"/>
      <Order number="23" status="bad"/>
    </Orders>
  </Customer>
  <Customer id="2">
    <Orders>
      <Order number="24" status="ok"/>
      <Order number="25" status="bad"/>
    </Orders>
  </Customer>
</Customers>

答案 3 :(得分:0)

    XDocument d = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8' ?>
        <Customers dId='wqwx' dTime='10-9-09 11:23'>
            <Customer id='1'>      
                <Orders>        
                    <Order number='22' status='ok'/>      
                </Orders>   
            </Customer> 
        </Customers>");
    var cu = d.Root.Elements().Where(n => n.Name == "Customer");


    var c = from cc in cu
            select new
            {
                dId = cc.Document.Root.Attribute("dId").Value,
                dTime = cc.Document.Root.Attribute("dTime").Value,
                ID = cc.Attribute("id").Value,
                number = cc.Element("Orders").Element("Order").Attribute("number").Value
            };

    foreach (var v in c)
    {
        Console.WriteLine("dId \t\t= {0}", v.dId);
        Console.WriteLine("dTime \t\t= {0}", v.dTime);
        Console.WriteLine("CustomerID \t= {0}", v.ID);
        Console.WriteLine("OrderCount \t= {0}", v.number);
    }

控制台输出:
 ================================
 dId = wqwx
 dTime = 10-9-09 11:23
 CustomerID = 1
 OrderCount = 22
 请按任意键继续。 。点。

答案 4 :(得分:0)

它不会像你编写的那样工作:打印上面的代码时会抱怨匿名类型。

但是,使用这个简单的修改版本d.Document.Root.Attribute("dId").Value;,您可以将其分配给字符串。