2015-07-15 1 views
0

Я пытаюсь проанализировать XML-документ и хранить данные в массиве с помощью LINQ в C#, где у меня есть несколько внутренних элементов с разными данными, их атрибуты с тем же именем и выглядит какИспользование условия where внутри внутреннего элемента в XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Catalog> 
<Book ISBN="1.1.1.1" Genre="Thriller"> 
    <Title PublishDt="2015-07-09"> 
    <Pty R="1" ID="Buyer_Company"> 
    </Pty> 
    <Pty R="2" ID="Seller_Company"> 
    </Pty> 
    </Title> 
</Book> 
</Catalog> 

Я пытаюсь сохранить все вышеуказанные данные в массиве, я не знаю, как иметь дело с элементом Pty, где я должен хранить Buyer_Company в Buy и Seller_Company в Sell, поскольку они имеют такое же имя элемента и Идентификатор имени атрибута.

Я получил данные, оставшихся следующим

var result = doc.Descendants("Book") 
     .Select(b => new 
     { 
      ISBN= b.Attribute("ISBN").Value, 
      Genre=b.Attribute("Genre").Value, 

      PublishDate= b.Element("Title").Attribute("MMY").Value,   
      Sell=b.Element("Title").Element("Pty").Attribute("ID").Value.Where...... 
Buy=b.Element("Title").Element("Pty").Attribute("ID").Value.Where......(this is where I have issues) 
     }) 
     .ToArray(); 

Может ли я знать, как я могу использовать WHERE условие в внутреннем элементе и атрибуты XML в LINQ в C# таком R = 1 представляет Покупатель и R = 2 представляют собой Продавец?

ответ

1

Вам нужно думать последовательно. Вы хотите запросить более все ваших Pty элементов, а затем отфильтровать их по значению атрибута R, а затем получить требуемое свойство.

Так что ваш покупатель идентификатор может быть получен:

b.Descendants("Pty") 
    .Where(e => (int)e.Attribute("R") == 1) 
    .Select(e => (string)e.Attribute("ID")) 
    .Single(); 

И подобный запрос для продавца идентификатора (изменить 1 к 2). Соединяя все это, вы можете получить что-то вроде этого. Я переместил бросок в начало выражения, чтобы уточнить, какими будут ваши свойства.

var result = from book in doc.Descendants("Book") 
      select new 
      { 
       ISBN = (string)book.Attribute("ISBN"), 
       Genre = (string)book.Attribute("Genre"), 
       PublishDate = (DateTime)book.Elements("Title") 
        .Select(e => e.Attribute("PublishDt")) 
        .Single(), 
       Buyer = (string)book.Descendants("Pty") 
        .Where(e => (int)e.Attribute("R") == 1) 
        .Select(e => e.Attribute("ID")) 
        .Single(), 
       Seller = (string)book.Descendants("Pty") 
        .Where(e => (int)e.Attribute("R") == 2) 
        .Select(e => e.Attribute("ID")) 
        .Single() 
      }; 
1

Если вы применили предложение Where, то вы снова получите IEnumerable<XElement>, и из этого вы должны выбрать одного продавца \ покупателя или вывести массив продавца \ покупателя. Я считал, что вы будете иметь только два узла для покупателя и продавца и соответственно запрос: -

var result = doc.Descendants("Book") 
       .Select(b => 
        { 
         var buyerNode = b.Element("Title").Elements("Pty") 
              .First(x => x.Attribute("R").Value == "1"); 
         var sellerNode = b.Element("Title").Elements("Pty") 
              .First(x => x.Attribute("R").Value == "2"); 
         return new 
         { 
          ISBN = b.Attribute("ISBN").Value, 
          Genre = b.Attribute("Genre").Value, 
          PublishDate = b.Element("Title").Attribute("PublishDt").Value, 
          Buy = buyerNode.Attribute("ID").Value, 
          Sell = sellerNode.Attribute("ID").Value, 
         }; 
        } 
        ).ToArray(); 

Кроме того, Обратите внимание, вы будете нуждаться в Elements вместо Element для извлечения нескольких Pty узлов.

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