2010-02-25 10 views
40

Sono un completamente nuovo per Linq2XML come codice per molto linee per eseguire le cose semplici, e in un semplice progetto ho voluto fare un tentativo ...Comprendere LINQ to XML - Discendenti non dà risultati

sono con questo per 2 ore e nulla che io capisco che è bene :(

sono davvero, davvero pensando di tornare a XmlNode-codice-alike

La Task:

  • mando un azione SOAP per un servizio ASMX e ottengo la risposta come XML
  • ho analizzare il codice XML in un oggetto XDocument
  • cerco di ottenere un elenco di nodi ... err! Problema!

come si può vedere da questo screenshot

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

mia XDocument ha un nodo chiamato TransactionInformationType strega è una sequenza, ed io semplice voglia di ottenere tutto e recuperare gli unici 2 variabili di cui ho bisogno (puoi vedere il codice commentato) appena sotto selezionare c;

nella finestra Guarda si può vedere che

doc.Descendants("TransactionInformationType") 

restituisce nulla a tutti, e vedendo dal contenuto del XDocument nel testo Visualizer, esiste!

cura Chiunque per spiegare e mi aiuta a passare questo enorme muro?

Grazie!


Aggiunto

XDocument content


risposta

l'XML Response ha

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

e devo usare questo come spazio dei nomi!

scopre che, a recuperare i valori, ho bisogno di utilizzare la XNamespace pure, in modo che il codice finale è simile al seguente:

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

Grazie a tutti per l'aiuto!

+1

La prego di inviare l'intestazione del XML fino all'elemento voi stanno cercando. Potrebbe esserci un problema di namespace qui. – AxelEckenberger

+0

fatto! aggiungerlo al pastebin come è grande (anche se mi mostra solo 2 Transazioni) :) – balexandre

+2

100 se potessi .. :) – asifrc

risposta

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

seleziona tutti discendenti in XDocument che hanno nome elemento "TransactionInformationType" e sono nello spazio vuoto. Da voi screenshot sembra che l'elemento che si sta cercando di selezionare è nel namespace "https://ssl.ditonlinebetalingssystem.dk/remote/payment" però. È necessario specificare che in modo esplicito:

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

stesso pensiero ... – AxelEckenberger

+0

Appena aggiunto di contenuti XDocument alla mia risposta. Se uso ' "https://ssl.ditonlinebetalingsystem.dk/remote/payment/"' come XNamespace, ottengo lo stesso comportamento ... in altre parole, ancora nulla :( – balexandre

+0

@balexandre: Non v'è alcun '/' dopo '' di pagamento nel tuo esempio, e di una 's' manca assicurarsi che si sta utilizzando esattamente lo stesso spazio dei nomi in C# come si trova nell'esempio XML – dtb

11

Questo dovrebbe risolvere si isssue (sostituire lo spazio dei nomi con l'URL a destra):

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