2009-10-09 3 views
3

У меня есть следующий XML. Как прочитать значение атрибута корневого узла и его декаденты с использованием LINQ? Я пытаюсь читать «dId» и «dTime» из корневого узла, «id» из элемента Customer и номера заказа.Как получить значение атрибута корневого узла с помощью linq

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

ответ

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 в исходный код.

+0

Я только что скачал Linqpad: абсолютно потрясающе! – Dabblernl

1

Вы должны закончить тег порядка с: />

xDoc.Descendants("Customers") должен работать, а также xDoc.Elements("Customers").

Крис, есть ли конкретное преимущество при использовании .Elements?

+0

.Elements позволяет вам запрашивать элемент для дочерних элементов с указанным типом элемента (в данном случае «Клиенты») –

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> 
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
请 按 任意 键 继续. , ,

0

Это не работает так, как вы его написали: при печати вышеуказанного кода будет жаловаться на анонимный тип.

Однако с помощью этой простой измененной версии d.Document.Root.Attribute("dId").Value; вы можете назначить ее строке.

+0

Код OP не имеет созданной переменной 'd' и не существует принятого ответа для этого вопроса. В чем заключается ваш ответ и как он отличается от 'cc.Document.Root.Attribute (« dId »). Значение« answer »предоставлено Laurel.Wu? – newfurniturey

Смежные вопросы