2010-02-25 21 views
40

Soy completamente nuevo a Linq2XML como código para tanto líneas para llevar a cabo las cosas simples, y en un proyecto simple que quería darle una oportunidad ...LINQ to XML - Descendientes devuelve ningún resultado

estoy con esto durante 2 horas y nada de lo que entiendo que es lo correcto :(

estoy realmente, realmente pensando volver a XmlNode de código idéntico

La Tarea:

  • que enviar un Acción de SOAP a un servicio de ASMX y me da la respuesta como XML
  • que analizar el código XML en un objeto XDocument
  • trato de obtener una lista de nodos ... err! ¡Problema!

como se puede ver en esta screenshot

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

mi XDocument tiene un nodo denominado TransactionInformationType bruja es una secuencia, y yo sencilla desea conseguir todos y recuperar el único 2 variables que necesito (puede ver el código comentado) justo debajo de select c;

en el ventana reloj se puede ver que

doc.Descendants("TransactionInformationType") 

devuelve nada en absoluto, y viendo por el contenido del texto XDocument en el visualizador, si existe!

¿Alguien me explica y me ayuda a pasar esta ENORME pared?

¡Gracias!


Agregado

XDocument content


respuesta

el XML de respuesta tiene

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

y debo utilizar esto como espacio de nombres!

resulta que, a recuperar valores, yo necesito utilizar el XNamespace así, por lo que el código final es el siguiente:

// 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 
      }; 

Gracias a todos de ¡la ayuda!

+1

Podría por favor puesto la cabecera del XML hasta el elemento que estan buscando. Puede haber un problema de espacio de nombres aquí. – AxelEckenberger

+0

hecho! agréguela a pasteBin ya que es grande (incluso si solo muestro 2 Transacciones) :) – balexandre

+2

+100 si pudiera ... :) – asifrc

Respuesta

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

selecciona todos los descendientes en el XDocument que tiene nombre de elemento "TransactionInformationType" y se encuentran en el espacio de nombres vacío. De tu captura de pantalla parece que el elemento que estás intentando seleccionar está en el espacio de nombres "https://ssl.ditonlinebetalingssystem.dk/remote/payment". Es necesario especificar que explícitamente:

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

Mismo pensamiento ... – AxelEckenberger

+0

Acabo de agregar el contenido de XDocument a mi respuesta. Si uso '" https://ssl.ditonlinebetalingsystem.dk/remote/payment/ "' como XNamespace, obtengo el mismo comportamiento ... en otras palabras, todavía nada :( – balexandre

+0

@balexandre: No hay '/' después de 'payment' en tu ejemplo, y falta' s'. Asegúrate de estar usando exactamente el mismo espacio de nombres en tu C# como se encuentra en el ejemplo XML. – dtb

11

Esto debería resolver isssue (reemplazar el espacio de nombres con la URL derecha):

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