Понимание Linq To Xml - потомки не дают результатов - PullRequest
41 голосов
/ 26 февраля 2010

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

Я с этим в течение 2 часов, и ничего, что я делаю, не понимаю, что это правильно

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

Задание:

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

Как видно из этого снимка экрана

альтернативный текст http://www.balexandre.com/temp/2010-02-26_0038.png

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

в окне Watch вы можете увидеть, что

doc.Descendants("TransactionInformationType")

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

Кто-нибудь хочет объяснить и помочь мне пройти эту огромную стену?

Спасибо!


Добавлена ​​

XДокументация


Ответ

Ответ 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
            };

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

Ответы [ 2 ]

48 голосов
/ 26 февраля 2010
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");
12 голосов
/ 26 февраля 2010

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

XNamespace ns = "https://ssl.ditonline...";
doc.Descendants(ns + "TransactionInformationType");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...