查询xml:未定义的名称空间前缀

时间:2018-01-12 05:18:53

标签: xml postgresql

我遇到问题,在Postgresql 9.4中查询带有命名空间的xml字段。

我使用以下内容:

select unnest(xpath('/cfdi:Comprobante/cfdi:Receptor/text()',  
       xmlfield,  
       array[array['cfdi:','http://www.sat.gob.mx/cfd/3']])) AS "receptor"  
       from mytable;  

我的xml字段看起来像

<cfdi:Comprobante  
  Version="3.3" Serie="W" Folio="713" 
  Fecha="2018-01-09T20:18:41" FormaPago="99" 
  NoCertificado="0022" CondicionesDePago="CONTADO" 
  SubTotal="5450.53" Moneda="MXN" 
  Total="6322.61" TipoDeComprobante="I" 
  MetodoPago="PUE" LugarExpedicion="55525" 
  Sello="N4MxzjrIqV/GOgUOw=="  
  xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 
  http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd" 
  Certificado="MIIsK2A==" 
  xmlns:cfdi="http://www.sat.gob.mx/cfd/3" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
<cfdi:Emisor 
  Rfc="MIO180526WW9" 
  Nombre="MI EMPRESA" 
  RegimenFiscal="601"   />
<cfdi:Receptor 
  Rfc="TUYO191111SOY" 
  Nombre="OSCAR TUNEZ YUNEZ" 
  UsoCFDI="P01"   />
<cfdi:Conceptos>
 <cfdi:Concepto 
   ClaveProdServ="151" Cantidad="599.299526" Descripcion="CHIVA FLACA" 
   Importe="5450.53" ClaveUnidad="LTR" Unidad="LITRO"
   ValorUnitario="9.094828">
  <cfdi:Impuestos>
   <cfdi:Traslados>
    <cfdi:Traslado 
      Base="5450.53"
      Impuesto="002"
      TipoFactor="Tasa"
      TasaOCuota="0.16"
      Importe="872.08"   />
   </cfdi:Traslados>
  </cfdi:Impuestos> 
</cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos TotalImpuestosTrasladados="872.08">
 <cfdi:Traslados>
  <cfdi:Traslado 
   Impuesto="002"
   TipoFactor="Tasa"
   TasaOCuota="0.16" 
   hImporte="872.08" />
 </cfdi:Traslados>
</cfdi:Impuestos>
<cfdi:Complemento>
 <tfd:TimbreFiscalDigital 
   Version="1.1" UUID="138" 
   FechaTimbrado="2019-07-09T20:18:48" 
   RfcProvCertif="MET310111MX9" 
   SelloCFD="fQVVPfUOw==" 
   SelloSAT="6PHUGnorpHQ=="
   NoCertificadoSAT="007" 
   xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital 
   http://www.sat.gob.mx/sitio_internet/cfd/timbrefl/TimbreFlv11.xsd"
   xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" />
  </cfdi:Complemento>
</cfdi:Comprobante

我想要得到       的 CFDI:Comprobante        的 CFDI:受体          RFC = “TUYO191111SOY”          Nombre =“OSCAR TUNEZ YUNEZ”

但使用先前的查询返回

ERROR:  could not create XPath object
DETAIL:  Undefined namespace prefix
********** Error **********

ERROR: could not create XPath object
SQL state: XX000
Detail: Undefined namespace prefix

我做错了什么? 提前致谢

1 个答案:

答案 0 :(得分:0)

您需要从nsarray中删除冒号。

这将有效:

select unnest(xpath('/cfdi:Comprobante/cfdi:Receptor/text()',  
       xmlfield,  
       array[array['cfdi','http://www.sat.gob.mx/cfd/3']])) AS "receptor"  
       from mytable;

但是会返回空结果,因为该元素下没有文本值。如果你想获得整个元素,那么只需/cfdi:Comprobante/cfdi:Receptor,或者如果你想要某些属性,那么就像@一样使用/cfdi:Comprobante/cfdi:Receptor/@Nombre