Как использовать Linq для чтения XML - PullRequest
1 голос
/ 07 марта 2012

У меня есть следующий XML

<Transaction><TransactionID>1559183866</TransactionID><Email>joe@xyz.com</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();

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

Есть идеи, что я делаю не так?

Спасибо

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Сопоставление элементов выполняется с учетом регистра.

например.«Транзакция»! = «Транзакция»

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

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();
4 голосов
/ 07 марта 2012

Если это целое 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);

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

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

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

0 голосов
/ 07 марта 2012

Учитывая ваш XML, вы должны изменить эту строку [РЕДАКТИРОВАТЬ: учитывая ваш XML использовать ответ Джона]

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

до

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...