[XML] Error – "Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

14 11 2009

buenas,

Aquí mi solución para este problema , supongamos que tenemos el siguiente archivo XML, que puede ser una respuesta de consumir un WebService, un archivo que generamos, etc.

Archivo Xml

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetReportResultsResponse xmlns="https://myservice">
      <GetReportResultsResult>FileXml</GetReportResultsResult>
    </GetReportResultsResponse>
  </soap:Body>
</soap:Envelope>

Como se pueden dar cuenta, se observan prefijos en cada nodo, este prefijo es “soap” y el archivo Xml contiene el namespace para usar este prefijo, pero al momento de seleccionar un nodo de la siguiente manera:

XmlDocument document = new XmlDocument();
document.Load(@"../../FileXml.xml");

XmlNodeList nodes =
    document.SelectNodes(@"soap:Body");

Visual Studio nos informa de la siguiente excepción:

“Exception: Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.”

Esto se debe a que no se reconoce el nombre de espacio que contiene nuestro archivo Xml, para solucionarlo debemos agregar un administrador de namespace y agregarlo a la selección de la siguiente manera:

Solución:

XmlNamespaceManager nms =
    new XmlNamespaceManager(document.NameTable);
nms.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope");

XmlNodeList nodes =
    document.SelectNodes(@"soap:Body",nms);

Con esto es suficiente para poder seleccionar nuestros nodos, y así manipularlo a nuestro antojo. Espero que les ayude este tip, así que saludos….. :D

Saludos,

Norberto :P

Etiquetas de Technorati: ,,,

Acciones

Información

Deja un comentario