2016-06-15 3 views
2

내가 쓰는 이유는 BaseX에 약 1k xml의 데이터베이스가 있기 때문입니다. 나는 이미 그것을 청소하고 내가 원하는 정보를 얻었다. 그럼에도 불구하고 해당 데이터를 CSV 형식으로 내보낼 수 있어야합니다. BaseX 문서에 주어진 코드를 사용하여 시도한 결과 다음과 같이 나타났습니다.xml을 BaseX의 XQuery에서 csv로 변환

Desc,Cantidad,Valor,Fecha,Lugar,UUID 
,,,,, 
,,,,, 

그리고 쉼표 사이에 데이터가 표시되어야합니다. 데이터를 표시하려면 코드를 어떻게 수정해야합니까? CSV 직렬화에 필요한

declare namespace tfd="http://www.sat.gob.mx/TimbreFiscalDigital"; 
declare namespace cfdi= "http://www.sat.gob.mx/cfd/3"; 

declare option output:method "csv"; 
declare option output:csv "header=yes, separator=comma"; 

    declare context item := document { 
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:detallista="http://www.sat.gob.mx/detallista" xmlns:psgecfd="http://www.sat.gob.mx/psgecfd" xmlns:ecc="http://www.sat.gob.mx/ecc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" folio="131556" fecha="2014-07-01T08:13:34" noCertificado="00001000000301092647" formaDePago="Pago en una sola exhibicion" subTotal="156.8966" descuento="0.00" Moneda="NAL" total="182.00" tipoDeComprobante="ingreso" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.posadas.com/MFE http://www.posadas.com/MFE/ADDENDAPOSADASVL1.xsd" xmlns:posadas="http://www.posadas.com/MFE" metodoDePago="TARJETA DE CREDITO" NumCtaPago="1093" LugarExpedicion="AVENIDA COSTERA MIGUEL ALEMAN ACAPULCO DE JUAREZ GUERRERO MEXICO"> 

    <cfdi:Emisor rfc="ASO0408178B2" nombre="HOTELES Y VILLAS POSADAS, S.A. DE C.V."> 

     <cfdi:DomicilioFiscal calle="AVENIDA PASEO DE LA REFORMA" noExterior="155" noInterior="PISO 4" colonia="LOMAS DE CHAPULTEPEC I SECCION" municipio="MIGUEL HIDALGO" estado="DISTRITO FEDERAL" pais="MEXICO" codigoPostal="11000"/> 

     <cfdi:ExpedidoEn calle="AVENIDA COSTERA MIGUEL ALEMAN" noExterior="97" colonia="FRACCIONAMIENTO CLUB DEPORTIVO" municipio="ACAPULCO DE JUAREZ" pais="MEXICO" codigoPostal="39690" estado="GUERRERO"/> 

     <cfdi:RegimenFiscal Regimen="NA"/> 

    </cfdi:Emisor> 

    <cfdi:Receptor rfc="MER551201D48" nombre="MERCK SA DE CV"> 

     <cfdi:Domicilio calle="CALLE 5 No. 7 FRACC. ALCE BLANCO" municipio="NAUCALPAN DE JUAREZ" estado="ESTADO DE MEXICO" pais="MX" codigoPostal="53370"/> 

    </cfdi:Receptor> 

    <cfdi:Conceptos> 

     <cfdi:Concepto cantidad="1.00" unidad="SERVICIO" noIdentificacion="CONSUM" descripcion="CONSUMO" valorUnitario="156.8966" importe="156.8966"/> 

    </cfdi:Conceptos> 

    <cfdi:Impuestos totalImpuestosTrasladados="25.1034"> 

     <cfdi:Traslados> 

      <cfdi:Traslado tasa="16.00" importe="25.1034" impuesto="IVA"/> 

     </cfdi:Traslados> 

    </cfdi:Impuestos> <cfdi:Complemento> 

    <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigital.xsd" FechaTimbrado="2014-07-01T08:15:15" UUID="8a4f1be7-bdcb-4b22-b144-b3e41dd92e69" version="1.0"/> 

    </cfdi:Complemento> 

<cfdi:Addenda> 
<posadas:RequestForPayment> 
<posadas:Hoteleria cajero="210" folio="539809" importeaPagar="   200.00" propina="  18.00" > 
</posadas:Hoteleria> 
</posadas:RequestForPayment> 
</cfdi:Addenda> 
</cfdi:Comprobante>}; 



for $x in //cfdi:Comprobante, 
$y in $x//cfdi:Conceptos/cfdi:Concepto, 
$z in $x//cfdi:Complemento/tfd:TimbreFiscalDigital, 
$w in $x//cfdi:ExpedidoEn 
return 
<csv> 
    <Desc>{$y/@descripcion}</Desc> 
    <Cantidad>{$y/@cantidad}</Cantidad> 
    <Valor>{$y/@valorUnitario}</Valor> 
    <Fecha>{$z/@FechaTimbrado}</Fecha> 
    <Lugar>{$w/@codigoPostal}</Lugar> 
    <UUID>{$z/@UUID}</UUID> 
</csv> 

답변

3

는 XML은 CSV module 문서에 설명되어 있습니다 :

내 코드는 다음과 같다. BaseX 문서에서 예제 : 환언 함께

<csv> 
    <record> 
    <Name>Huber</Name> 
    <First_Name>Sepp</First_Name> 
    <Address>Hauptstraße 13</Address> 
    <City>93547 Hintertupfing</City> 
    </record> 
</csv> 

<csv/> 요소는 모든 데이터가 배치되고, 각 레코드는 <csv/> 소자 분리 마지막 열은 텍스트 노드의 어린이 요소로서 저장된다.

(직렬화 옵션을 제거하여) 현재 출력을 보면, 반환 다음 :

  • 없는 <record/> 요소
  • :

    <csv> 
        <Desc descripcion="CONSUMO"/> 
        <Cantidad cantidad="1.00"/> 
        <Valor valorUnitario="156.8966"/> 
        <Fecha FechaTimbrado="2014-07-01T08:15:15"/> 
        <Lugar codigoPostal="39690"/> 
        <UUID UUID="8a4f1be7-bdcb-4b22-b144-b3e41dd92e69"/> 
    </csv> 
    

    두 가지 방법으로 요구 사항과 일치하지 않습니다

  • 값은 텍스트 노드가 아닌 속성으로 저장됩니다.

당신은 같은 쿼리 이러한 두 가지 문제를 해결하는 경우 :

for $x in //cfdi:Comprobante, 
$y in $x//cfdi:Conceptos/cfdi:Concepto, 
$z in $x//cfdi:Complemento/tfd:TimbreFiscalDigital, 
$w in $x//cfdi:ExpedidoEn 
return 
<csv><record> 
    <Desc>{$y/@descripcion/data()}</Desc> 
    <Cantidad>{$y/@cantidad/data()}</Cantidad> 
    <Valor>{$y/@valorUnitario/data()}</Valor> 
    <Fecha>{$z/@FechaTimbrado/data()}</Fecha> 
    <Lugar>{$w/@codigoPostal/data()}</Lugar> 
    <UUID>{$z/@UUID/data()}</UUID></record> 
</csv> 

이 예상되는 CSV 출력을 얻을 :

Desc,Cantidad,Valor,Fecha,Lugar,UUID 
CONSUMO,1.00,156.8966,2014-07-01T08:15:15,39690,8a4f1be7-bdcb-4b22-b144-b3e41dd92e69 
+0

자동으로 특정 위치로 가져 오는 방법을 알고 계십니까? –

+0

나 자신을 더 잘 설명하게 해줘. 결과를 BaseX에 저장하면 여전히 CSV가 아니라 XML이 표시됩니다. 어떻게 수정할 수 있습니까? –

+1

직렬화는 결과가 인쇄 될 때만 발생합니다. 위의 같은 문서 링크에 설명 된'csv : serialize ($ input as node()) as xs : string' 함수를 통해 문자열에 직렬화를 적용합니다. –

0

이 편집기에서 파일을 열고 모든 < \로 교체를; < \
다음으로 BaseX에서 파일을 열고 CSV로 내보내기