Подтвердить что ты не робот

Понимание Linq To Xml - Потомки не возвращают результатов

Я совершенно новый для Linq2XML, поскольку я кодирую много строк для выполнения простых вещей, и в простом проекте я хотел попробовать...

Я с этим в течение 2 часов и ничего не понимаю: (

Я действительно, действительно думаю вернуться к XmlNode-code-alike

Задача:

  • Я отправляю SOAP-действие службе ASMX, и получаю ответ как XML
  • Я проанализирую XML в объекте XDocument
  • Я пытаюсь получить список узлов... err! Проблема!

как вы можете видеть из этого снимок экрана

alt text http://www.balexandre.com/temp/2010-02-26_0038.png

my XDocument имеет Node, называемый TransactionInformationType, который является последовательностью, и я просто хочу получить все и получить только 2 переменные, которые мне нужны (вы можете см. комментарий в коде) чуть ниже выберите c;

в окне Часы вы можете видеть, что

doc.Descendants("TransactionInformationType")

ничего не возвращает и видит содержимое XDocument в Text Visualizer, он существует!

Кто-нибудь хочет объяснить и помочь мне пройти эту ОГРОМНУЮ стену?

Спасибо!


Добавлен

XDocument content


Ответ

XML-ответ имеет

<gettransactionlistResponse xmlns="https://ssl.ditonlinebetalingssystem.dk/remote/payment">

и я должен использовать это как пространство имен!

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

// Parse XML
XDocument doc = XDocument.Parse(strResponse);
XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";

var trans = from item in doc.Descendants(ns + "TransactionInformationType")
            select new TransactionInformationType
            {
                capturedamount = Convert.ToInt32(item.Element(ns + "capturedamount").Value),
                orderid = item.Element(ns + "cardtypeid").Value
            };

Спасибо всем за помощь!

4b9b3361

Ответ 1

var result = doc.Descendants("TransactionInformationType");

выбирает всех потомков в XDocument, которые имеют имя элемента "TransactionInformationType" и находятся в пустом пространстве имен. С вашего скриншота кажется, что элемент, который вы пытаетесь выбрать, находится в пространстве имен "https://ssl.ditonlinebetalingssystem.dk/remote/payment". Вы должны указать это явно:

XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";
                                              ↑↑                      ↑
var result = doc.Descendants(ns + "TransactionInformationType");

Ответ 2

Это должно решить вас isssue (замените пространство имен правильным URL-адресом):

XNamespace ns = "https://ssl.ditonline...";
doc.Descendants(ns + "TransactionInformationType");