Понимание 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
};
Спасибо всем за помощь!
Ответы
Ответ 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");