2012-03-06 3 views
1

У меня есть следующий XMLКак использовать Linq для чтения XML

<Transaction><TransactionID>1559183866</TransactionID><Email>[email protected]</Email><Frequency>Yearly</Frequency><Amount>10</Amount><Status>1</Status><CreateDate>2/7/2012 8:29:43 AM</CreateDate></Transaction> 

Я пытаюсь использовать ссылку, чтобы создать объект для ссылки на содержимое

XDocument result = XDocument.Load(readStream); 

var detail = (from x in result.Descendants("transaction") 
       select new { 
        TransactionID = x.Element("transactionid").Value, 
        Frequency = x.Element("frequency").Value, 
        Amount = x.Element("amount").Value, 
        Email = x.Element("email").Value, 
        Status = x.Element("status").Value 
       }).First(); 

Но держать получение последовательности исключений не содержит элементов.

Любая идея, что я делаю неправильно?

Благодаря

+5

Я не использую Linq для XML, чтобы убедиться, но, взглянув на это, XML чувствителен к регистру ... Является ли LINQ для XML? Обратите внимание, что элементы заглавны, а ваш запрос на ссылку - в нижнем регистре. Если чувствительность к регистру является проблемой, то это только помешает вам найти совпадения в вашем запросе. – David

+0

@DavidStratton, вы правы, вы должны написать это как ответ. –

+0

@DavidStratton Я бы конвертировал ваш комментарий в ответ ... :) –

ответ

4

Соответствующие элементы - это чувствительная к регистру операция.

eg. ! «Сделка» = «сделка»

Попробуйте вместо этого:

var detail = (from x in result.Descendants("Transaction") 
          select new { 
           TransactionID = x.Element("TransactionID").Value, 
           Frequency = x.Element("Frequency").Value, 
           Amount = x.Element("Amount").Value, 
           Email = x.Element("Email").Value, 
           Status = x.Element("Status").Value }) 
           .First(); 
+1

Darn! Ты подтолкнул меня на это! Наконец-то я получил свой код для работы. +1 для вас. – David

+0

Извините за это, не комментировали! –

+0

Нет проблем. Как я уже сказал, я не был уверен. Я только догадывался, и ты избил меня до честного и квадратного. – David

0

Учитывая ваш XML, вы должны изменить эту строку [EDIT: учитывая ваше использование XML-ответ Джона]

var detail = (from x in result.Descendants("Transaction") 

в

var detail = (from x in result.Element("Transaction") 

Это предотвратит любые вложенные элементы сделки по быть включенным в результат. Очевидно, у вас тоже проблема с корпусом.

4

Если это весь в XML, то вы делаете жизнь более сложной, чем вам нужно. Transaction элемент является корневым элементом, и вы знаете, там будет ровно один:

XDocument result = XDocument.Load("test.xml"); 

// Just for brevity 
var x = result.Root; 
var detail = new { 
      // Note the fixed capitalization 
      TransactionID = x.Element("TransactionID").Value, 
      Frequency = x.Element("Frequency").Value, 
      Amount = x.Element("Amount").Value, 
      Email = x.Element("Email").Value, 
      Status = x.Element("Status").Value 
     }; 
Console.WriteLine(detail); 

Конечно, если это является частью более крупного документа, то вы можете использовать:

var x = result.Descendants("Transaction").First(); 
// Same as before 

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

var detail = new { 
      // Note the fixed capitalization 
      TransactionID = (string) x.Element("TransactionID"), 
      Frequency = (string) x.Element("Frequency"), 
      Amount = (int) x.Element("Amount"), 
      Email = (string) x.Element("Email"), 
      Status = (int) x.Element("Status") 
     }; 

Обратите внимание, что любые забросы к NULLABLE типов (либо ссылочные типы или NULLABLE типы значений) будет просто возвращать нулевое значение, если входной равна нулю, поэтому недостающий элемент будет в конечном итоге дает вам нулевой результат. Иногда это хорошо; в других случаях вы действительно хотите исключение.

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