El error Xpath tiene un token no válido

Tengo el siguiente código C #:

var selectNode = xmlDoc.SelectSingleNode("//CodeType[@name='" + codetype + 
    "']/Section[@title='" + section + "']/Code[@code='" + code + "' and 
    @description='" + codedesc + "']") as XmlElement;

cuando ejecuto mi código, aparece el error que dice "la declaración anterior tiene un token no válido"

Estos son los valores para la declaración anterior.

codeType=cbc
section="Mental"
codedesc="Injection, enzyme (eg, collagenase), palmar fascial cord (ie, 
    Dupuytren's contracture"

preguntado el 03 de mayo de 12 a las 19:05

¿Te importaría pegar una muestra de tu xml? -

En mi caso recibí el mensaje de error porque olvidé cerrar la expresión XPath con el carácter "]". -

3 Respuestas

Note el apóstrofe (') en codedesc?

Tienes que escapar de alguna manera. El intérprete de XPath lo considera como un delimitador de cadena y no sabe cómo tratar el otro apóstrofo que lo sigue.

Una forma de hacerlo es encerrando su cadena entre comillas dobles en lugar de apóstrofes.

Por lo tanto, su código podría convertirse en:

var selectNode = xmlDoc.SelectSingleNode(
    "//CodeType[@name='" + codetype + "']" +
    "/Section[@title='" + section + "']" +
    "/Code[@code=\"" + code + "' and @description='" + codedesc + "\"]") 
    as XmlElement;

(nótese que en la cuarta línea, los apóstrofes(') se convirtió en comillas dobles (\"))

Si bien este enfoque funciona para los datos que presentó, todavía no está 100% seguro: otros registros podrían contener comillas dobles. Si eso sucede, también tendremos que pensar en algo para ese caso.

contestado el 03 de mayo de 12 a las 20:05

Muchas gracias, encontraré la manera de deshacerme del apóstrofe en mis datos de Codedesc. - user1373355

Puede obtener el nodo seleccionado según el índice, si hay caracteres especiales en el esquema xml. Entonces, aquí se ve a continuación la implementación para eliminar el nodo de índice seleccionado del esquema xml.

Operación de eliminación XML SelectSingleNode

var esquemaDocumento = nuevo XmlDocumento();

        schemaDocument.LoadXml(codesXML);

        var xmlNameSpaceManager = new XmlNamespaceManager(schemaDocument.NameTable);

        if (schemaDocument.DocumentElement != null)
            xmlNameSpaceManager.AddNamespace("x", schemaDocument.DocumentElement.NamespaceURI);

        var codesNode = schemaDocument.SelectSingleNode(@"/x:integration-engine-codes/x:code-categories/x:code-category/x:codes", xmlNameSpaceManager);
        var codeNode = codesNode.ChildNodes.Item(Convert.ToInt32(index) - 1);

        if (codeNode == null || codeNode.ParentNode == null)
        {
            throw new Exception("Invalid node found");
        }

        codesNode.RemoveChild(codeNode);
        return schemaDocument.OuterXml;

Respondido el 12 de junio de 19 a las 11:06

Duplique la comilla simple, para que diga "contractura de Dupuytren"

De esta manera, puede escapar de la comilla simple en la expresión xpath.

Respondido 16 Jul 14, 22:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.