2009-10-28 11 views
20

Sto cercando di utilizzare LINQ in XML in un oggetto XDocument. Come si fa a interrogare l'elemento risultato nell'esempio seguente?Come interrogare un XDocument con LINQ quando gli elementi hanno due punti nel loro nome?

<serv:header> 
    <serv:response> 
     <serv:result>SUCCESS</serv:result> 
     <serv:gsbStatus>PRIMARY</serv:gsbStatus> 
    </serv:response> 
</serv:header> 

Quando uso una dichiarazione come questa, ottengo l'eccezione 'Informazioni aggiuntive: L' ':' carattere, valore esadecimale 0x3A, non può essere incluso in un nome.'

XDocument doc = XDocument.Parse(xml); 
string value = doc.Descendants("serv:header").First().Descendants("serv:response").First().Descendants("serv:result").First().Value; 

risposta

38

serv in XML è un prefisso namespace . Deve essere associato a qualche URI, che identifica lo spazio dei nomi. Cercare un attributo come questo nel tuo XML:

xmlns:serv="..." 

Il valore all'interno delle virgolette sarà lo spazio dei nomi. Ora, nel codice C#, è possibile utilizzare che URI per creare un XNamespace oggetto:

private static readonly XNamespace serv = "..."; 

E quindi è possibile utilizzare che nelle query come questa:

string value = doc 
    .Descendants(serv + "header").First() 
    .Descendants(serv + "response").First() 
    .Descendants(serv + "result").First() 
    .Value; 

A proposito, si dovrebbe considerare l'utilizzo di .Element() anziché .Descendants().First().

+0

Sono stato in grado di utilizzare 'doc.Root.GetNamespaceOfPrefix (" serv ")' –

6

Ciò significa che il colon XML sta usando namespaces. Sulla base di questa blogpost qualcuno ha postato su LINQ, XML, e gli spazi dei nomi, ecco una versione del codice che si potrebbe desiderare di provare .:

static XName serv(string name) 
{ 
    return XNamespace.Get("<THE_NAMESPACE_URL>") + name; 
} 

XDocument doc = XDocument.Parse(xml); 
string value = doc.Descendants(serv("header")).First().Descendants(serv("response")).First().Descendants(serv("result")).First().Value; 
Problemi correlati