none
Ayuda con lectura de archivo XML. RRS feed

  • Pregunta

  • Estimados,

    Tengo el siguiente documento XML (el archivo real tiene 760 registros y los campos son diferentes) (ANEXO I)

    Y lo que quiero es listar los clientes con sus pedidos, dentro del mismo Query, yo lo defini de la siguiente forma:

    declare @doc xml

    select    @doc = BulkColumn
    from    openrowset(
    bulk 'D:\Util\Prb.xml', SINGLE_CLOB
    ) as xmlData

    select
    cliente.value('(//id/text())[1]', 'int') AS IdCliente
    ,pedido.value('(//id/text())[1]', 'int') AS IdPedido
    ,producto.value('(//cod/text())[1]', 'varchar(15)') AS CodigoProducto
    ,producto.value('(//cant/text())[1]', 'int') AS Cantidad
    ,producto.value('(//imp/text())[1]', 'money') AS Importe
    from    @doc.nodes('/movimiento') as x0(movimiento)
    cross apply x0.movimiento.nodes('./cliente') as x1(cliente)
    cross apply x1.cliente.nodes('./pedido') as x2(pedido)
    cross apply x2.pedido.nodes('./producto') as x3(producto)

    Pero el hecho de poner el numero de fila me repite la información. Y no se como cambiar el Query para obtener los resultados deseados, he tratado de utilizar: 

    cliente.value('(@id', 'int') AS IdCliente

    Pero la forma en que esta el archivo XML (esto es la información dentro de tag y no como atribnutos) no me permite utilizar este tipo de referencia, también he tratado de utilizar text() con la referencia "." pero tampoco me funciona. El archivo no puede ser modificado ya que me lo envían externamente. 

    Por favor su ayuda.

    Muchas gracias. 

    ANEXO I (Archivo c:\prb.xml)

    ---------------------------------------------------------------------------------------

    <movimiento>
    <cliente>
    <id>1</id>
      <pedido>
    <id>2</id>
        <producto>
    <cod>DS1820</cod>
    <cant>12</cant>
    <imp>0.24</imp>
        </producto>
      </pedido>
      <pedido>
    <id>2</id>
        <producto>
    <cod>DS1820</cod>
    <cant>10</cant>
    <imp>0.24</imp>
        </producto>
      </pedido>
      <pedido>
    <id>3</id>
        <producto>
    <cod>DS1820</cod>
    <cant>2</cant>
    <imp>0.24</imp>
        </producto>
      </pedido>
    </cliente>
    <cliente>
    <id>2</id>
      <pedido>
    <id>4</id>
        <producto>
    <cod>DS1820</cod>
    <cant>1</cant>
    <imp>0.24</imp>
        </producto>
      </pedido>
    </cliente>
    <cliente>
    <id>3</id>
      <pedido>
    <id>5</id>
        <producto>
    <cod>DS1820</cod>
    <cant>3</cant>
    <imp>0.24</imp>
        </producto>
      </pedido>
    </cliente>
    </movimiento>

    ---------------------------------------------------------------------------------------

    viernes, 30 de agosto de 2019 13:40

Respuestas

  • Encontré la respuesta:

    SELECT
    cliente.query('./id').value('.', 'int') AS IdCliente
    ,pedido.query('./id').value('.', 'int') AS IdPedido
    ,producto.query('./cod').value('.', 'varchar(15)') AS CodigoProducto
    ,producto.query('./cant').value('.', 'varchar(15)') AS Cantidad
    ,producto.query('./imp').value('.', 'varchar(15)') AS Importe

    from    @doc.nodes('/movimiento') as x0(movimiento)
    cross apply x0.movimiento.nodes('./cliente') as x1(cliente)
    cross apply x1.cliente.nodes('./pedido') as x2(pedido)
    cross apply x2.pedido.nodes('./producto') as x3(producto)

    Pero si me ayudan con una dirección paras conocer como trabajar mejor con datos XML agradecería.

    viernes, 30 de agosto de 2019 14:07