none
error al cargar xml en SQL con sp_xml_preparedocument, marca 'falta text/xmldecl'

    Pregunta

  • saludos a tod@s.

    Tengo un documento xml... y lo cargo asi en sql:

    DECLARE @docHandle int
    DECLARE
    @xmlDocument xml

    SET @xmlDocument = N'
    <?xml version="1.0" encoding="UTF-8"?>
        <Respuesta:ConsultaNotarios xmlns:Salida="http://services.notarios.org.mx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://services.notarios.org.mx ConsultaNotarios.xsd">
    <codigoRespuesta>00000000</codigoRespuesta>
    <descripcionRespuesta>Transacción Exitosa</descripcionRespuesta>
    <fechaRegistro>2008-09-02</fechaRegistro>
    <notarios>
        <claveNotario>0100100001</claveNotario>
        <nombreNotario>ACEVEDO MANRIQUE MIGUEL</nombreNotario>
    </notarios>
    <notarios>
        <claveNotario>0900100001</claveNotario>
        <nombreNotario>ADAME LOPEZ ANGEL GILBERTO</nombreNotario>
    </notarios>
    <notarios>
        <claveNotario>0901600085</claveNotario>
        <nombreNotario>AGUILAR MOLINA VICTOR RAFAEL</nombreNotario>
    </notarios>
    <notarios>
        <claveNotario>1503300034</claveNotario>
        <nombreNotario>AGUILERA GONZALEZ JUAN JOSE</nombreNotario>
    </notarios>
    </Respuesta:ConsultaNotarios>'

    EXEC
    sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument

    SELECT * FROM OPENXML (@docHandle, '/Respuesta:ConsultaNotarios/notarios',2)
    WITH (claveNotario varchar(10),nombreNotario varchar(100))

    EXEC
    sp_xml_removedocument @docHandle

    1.- Lo primero que me marca es:  Msg 9438, Level 16, State 1, Line 4 Análisis de XML: línea 2, carácter 6; falta text/xmldecl al principio de la entrada

    y no se a que se refiera con eso, porque he buscado solucion pero no encuentro.
    2.- y la otra es que le quite la parte de <?xml version="1.0" encoding="UTF-8"?>, lo ejecute y ya no me marco lo primero, pero me marco lo siguiente:
    Referencia a un prefijo de espacio de nombres no declarado: 'Respuesta'.

    Como debo declarar el prefijo de espacios de nombres?
    y no se si algo me falta en la parte de <?xml version="1.0" encoding="UTF-8"?>, para que no me marque el primer error al cargarlo,

    si alguien me pudiera ayudar, se los agradecere mucho de verdad. 
    Saludos.
     

    lunes, 16 de febrero de 2009 17:52

Respuestas

  • Alberto ya señalo el primer problema, que es cambia el encoding a UTF-16, o eliminar esta linea prolog.
    El segundo problema es que al parecer falta una declaracion de namespace, por lo que cuando referencias un elemento como "Respuesta:ConsultaNotarios" reciviras el error:

    Msg 2229, Level 16, State 1, Line 31
    XQuery [nodes()]: The name "Respuesta" does not denote a namespace.

    Yo me tome la libertas de cambiar la declaracion del namespace "Salida" por "Respuesta", para mostrar lo dicho. Ademas, noto que usas una variable tipo xml, por lo que eso me dice que usas SS 2005 o mayor, y por lo tanto te recomiendo que te familiarzes con los metodos de este tipo de dato y evites usar los procedimientos sp_xml_preparedocument / sp_xml_removedocument.

    DECLARE @xmlDocument xml;
    
    SET @xmlDocument = N'<?xml version="1.0" encoding="UTF-16"?>
    <Respuesta:ConsultaNotarios xmlns:Respuesta="http://services.notarios.org.mx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://services.notarios.org.mx ConsultaNotarios.xsd">
    <codigoRespuesta>00000000</codigoRespuesta>
    <descripcionRespuesta>Transacción Exitosa</descripcionRespuesta>
    <fechaRegistro>2008-09-02</fechaRegistro>
    <notarios>
      <claveNotario>0100100001</claveNotario>
      <nombreNotario>ACEVEDO MANRIQUE MIGUEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0900100001</claveNotario>
      <nombreNotario>ADAME LOPEZ ANGEL GILBERTO</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0901600085</claveNotario>
      <nombreNotario>AGUILAR MOLINA VICTOR RAFAEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>1503300034</claveNotario>
      <nombreNotario>AGUILERA GONZALEZ JUAN JOSE</nombreNotario>
    </notarios>
    </Respuesta:ConsultaNotarios>';
    
    with xmlnamespaces (
    	'http://services.notarios.org.mx' as Respuesta,
    	'http://www.w3.org/2001/XMLSchema-instance'as xsi
    	)
    SELECT
    	N.x.value('(claveNotario/text())[1]', 'char(10)') as clave,
    	N.x.value('(nombreNotario/text())[1]', 'varchar(50)') as nombre
    FROM
    	@xmlDocument.nodes('Respuesta:ConsultaNotarios/notarios') as N(x);
    go

    Nota que cambie la declaracion del namespace "Salida" por "Respuesta".

     


    AMB

    Some guidelines for posting questions...

    domingo, 21 de agosto de 2011 16:33

Todas las respuestas

  • Encuentro 3 errores en el xml:

    • La primera línea contiene un salto de línea, hay que quitársela.
    • Esa misma línea, el encoding no puede ser cambiado a UTF-8. Se puede indicar UTF-16 o directamente quitar la cláusula de encoding.
    • No se pueden usar ":" dentro del nombre de un nodo. Debe sustituirse por otro caracter, por ejemplo un "_".

    De esta manera, el XML (y la sentencia) quedaría así:

    DECLARE @docHandle int
    DECLARE @xmlDocument xml
    
    SET @xmlDocument = N'<?xml version="1.0"?>
      <Respuesta_ConsultaNotarios xmlns:Salida="http://services.notarios.org.mx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://services.notarios.org.mx ConsultaNotarios.xsd">
    <codigoRespuesta>00000000</codigoRespuesta>
    <descripcionRespuesta>Transacción Exitosa</descripcionRespuesta>
    <fechaRegistro>2008-09-02</fechaRegistro>
    <notarios>
      <claveNotario>0100100001</claveNotario>
      <nombreNotario>ACEVEDO MANRIQUE MIGUEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0900100001</claveNotario>
      <nombreNotario>ADAME LOPEZ ANGEL GILBERTO</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0901600085</claveNotario>
      <nombreNotario>AGUILAR MOLINA VICTOR RAFAEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>1503300034</claveNotario>
      <nombreNotario>AGUILERA GONZALEZ JUAN JOSE</nombreNotario>
    </notarios>
    </Respuesta_ConsultaNotarios>'
    
    EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
    
    SELECT * FROM OPENXML (@docHandle, '/Respuesta_ConsultaNotarios/notarios',2) 
    WITH (claveNotario varchar(10),nombreNotario varchar(100))
    
    EXEC sp_xml_removedocument @docHandle
    

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 21 de agosto de 2011 11:10
    Moderador
  • Alberto ya señalo el primer problema, que es cambia el encoding a UTF-16, o eliminar esta linea prolog.
    El segundo problema es que al parecer falta una declaracion de namespace, por lo que cuando referencias un elemento como "Respuesta:ConsultaNotarios" reciviras el error:

    Msg 2229, Level 16, State 1, Line 31
    XQuery [nodes()]: The name "Respuesta" does not denote a namespace.

    Yo me tome la libertas de cambiar la declaracion del namespace "Salida" por "Respuesta", para mostrar lo dicho. Ademas, noto que usas una variable tipo xml, por lo que eso me dice que usas SS 2005 o mayor, y por lo tanto te recomiendo que te familiarzes con los metodos de este tipo de dato y evites usar los procedimientos sp_xml_preparedocument / sp_xml_removedocument.

    DECLARE @xmlDocument xml;
    
    SET @xmlDocument = N'<?xml version="1.0" encoding="UTF-16"?>
    <Respuesta:ConsultaNotarios xmlns:Respuesta="http://services.notarios.org.mx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://services.notarios.org.mx ConsultaNotarios.xsd">
    <codigoRespuesta>00000000</codigoRespuesta>
    <descripcionRespuesta>Transacción Exitosa</descripcionRespuesta>
    <fechaRegistro>2008-09-02</fechaRegistro>
    <notarios>
      <claveNotario>0100100001</claveNotario>
      <nombreNotario>ACEVEDO MANRIQUE MIGUEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0900100001</claveNotario>
      <nombreNotario>ADAME LOPEZ ANGEL GILBERTO</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>0901600085</claveNotario>
      <nombreNotario>AGUILAR MOLINA VICTOR RAFAEL</nombreNotario>
    </notarios>
    <notarios>
      <claveNotario>1503300034</claveNotario>
      <nombreNotario>AGUILERA GONZALEZ JUAN JOSE</nombreNotario>
    </notarios>
    </Respuesta:ConsultaNotarios>';
    
    with xmlnamespaces (
    	'http://services.notarios.org.mx' as Respuesta,
    	'http://www.w3.org/2001/XMLSchema-instance'as xsi
    	)
    SELECT
    	N.x.value('(claveNotario/text())[1]', 'char(10)') as clave,
    	N.x.value('(nombreNotario/text())[1]', 'varchar(50)') as nombre
    FROM
    	@xmlDocument.nodes('Respuesta:ConsultaNotarios/notarios') as N(x);
    go

    Nota que cambie la declaracion del namespace "Salida" por "Respuesta".

     


    AMB

    Some guidelines for posting questions...

    domingo, 21 de agosto de 2011 16:33