2009-10-28 12 views
20

Estoy tratando de usar LINQ a XML en una con el objeto XDocument. ¿Cómo consulta el elemento de resultado en el siguiente ejemplo?¿Cómo consultar un XDocument con LINQ cuando los elementos tienen dos puntos en su nombre?

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

Cuando uso una declaración como esta, me sale la excepción 'Información adicional: La ':'. Carácter, valor hexadecimal 0x3A, no puede ser incluido en un nombre'

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

Respuesta

38

serv en su XML es un prefijo de espacio de nombres . Tiene que estar asociado con algún URI, que identifica el espacio de nombres. Busque un atributo como este en su XML:

xmlns:serv="..." 

El valor dentro de las comillas será el espacio de nombres. Ahora, en su código C#, utilice ese URI para crear un XNamespace objeto:

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

Y entonces usted puede utilizar eso en las consultas de la siguiente manera:

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

Por cierto, usted debe considerar el uso de .Element() en lugar de .Descendants().First().

+0

Pude usar 'doc.Root.GetNamespaceOfPrefix (" serv ")' –

6

Eso significa que el de colon que utiliza XML namespaces. En base a esta blogpost alguien publicado acerca de LINQ, XML y espacios de nombres, he aquí una versión de su código que es posible que desee probar .:

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; 
Cuestiones relacionadas