linq - obtener - manejo de xml en c#
¿Cómo consultar un XDocument con LINQ cuando los elementos tienen dos puntos en su nombre? (2)
Estoy tratando de usar LINQ to XML en un objeto XDocument. ¿Cómo se consulta el elemento de resultado en el siguiente ejemplo?
<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, obtengo la excepción ''Información adicional: el carácter'': '', valor hexadecimal 0x3A, no se puede incluir en un nombre''
XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants("serv:header").First().Descendants("serv:response").First().Descendants("serv:result").First().Value;
Los dos puntos significan que el XML está usando namespaces . En base a este blogpost alguien publicó sobre LINQ, XML y espacios de nombres, aquí hay una versión de su código que tal vez quiera 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;
serv
en tu XML es un prefijo de espacio de nombres . Debe 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 tu código C #, usas ese URI para crear un objeto XNamespace
:
private static readonly XNamespace serv = "...";
Y luego puedes usar eso en consultas como esta:
string value = doc
.Descendants(serv + "header").First()
.Descendants(serv + "response").First()
.Descendants(serv + "result").First()
.Value;
Por cierto, deberías considerar usar .Element()
lugar de .Descendants().First()
.