Página 1 de 1

Namespace prefix (o porque aparece cfdi: en nodos del CFDI)

Publicado: Vie Oct 29, 2010 9:10 am
por Dado
Conflicto entre nombre.
En XML los nombres de los elementos son definidos por el desarrollador. A menudo esto resulta en un conflicto cuando se trata de mezclar documentos XML de diferentes aplicaciones

Este XML contiene informacion de una tabla HTML

Código: Seleccionar todo

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>
Este XML contiene informacion de una mesa (table = "mesa" en ingles)

Código: Seleccionar todo

<table>
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>
Si estos fragmentos de XML se juntam habria un conflicto, los dos contienen el elemento <table> pero tienen distintos contenidos y significados.

Un interprete de XML no sabria como manejar las diferencias.

Resolviendo el conflicto de nombre usando Prefijos

El conflicto de nombres en XML se puede evitar usando un "name prefix" (prefijo de nombre)

Código: Seleccionar todo

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table> 
En el ejemplo no hay comflicto porque los dos elementos <table> tienen distintos nombres.

XML Namespaces - El atributo xmlns

Cuando se usa prefijos en XML se debe definir "namespace"

Este namespace esta definido por el atributo xmlns en el primer nodo de un elemento

La declaracion del namespace sigue la siguiente sintaxis : xmlns:prefijo="URI"

Código: Seleccionar todo

<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table xmlns:f="http://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>
En el ejemplo anterior el atributo xmlns en la etiqueta <table> le da a h: y a f: un namespace adecuado.

Cuando se define un namespace para un elemento, todos los elementos hijos con el mismo prefijo son asociados con el mismo namespace.

Sigue en la parte II.......

Re: Namespace prefix (o porque aparece cfdi: en nodos del CF

Publicado: Vie Oct 29, 2010 9:19 am
por Dado
PARTE II. Los CFDI

El SAT ha definido que los CFDI V3 tengan el siguiente namespace

xmlns:cfdi="http://www.sat.gob.mx/cfd/3"

Y por eso todos los nodos del CFDI llevan un prefijo cfdi:

Ahora, EN DELPHI para usar prefijos de namespace se debe usar algo similar al siguiente codigo :

Código: Seleccionar todo

	XMLDoc.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><cfdi:Comprobante></cfdi:Comprobante>';
	XMLDoc.Active := True;	
	CFD := GetComprobante(XMLDoc);
	CFD.DeclareNamespace('cfdi','http://www.sat.gob.mx/cfd/3');
Y eso es todo, ahora todos los elementos van a estar referenciados con el prefijo cfdi:

Re: Namespace prefix (o porque aparece cfdi: en nodos del CF

Publicado: Vie Oct 29, 2010 9:34 am
por mauricio
Mi estimado Dado:

¿Por que no publicaste esto hace unos meses, cuando me estuve peleando con esto?, jejeje...

Muy buen apunte, es muy útil para cuando haces tus filtros personalizados para importar directamente del XML...

Un abrazo

Re: Namespace prefix (o porque aparece cfdi: en nodos del CF

Publicado: Jue Feb 24, 2011 9:03 am
por manurobe
Hola:

Yo te compre la actualizacion a la v3 de los cfdi para Delphi 7
La pregunta es en que parte del codigo defines los prefijos cfdi?

Gracias

Re: Namespace prefix (o porque aparece cfdi: en nodos del CF

Publicado: Jue Feb 24, 2011 10:06 am
por Dado
manurobe escribió:Hola:

Yo te compre la actualizacion a la v3 de los cfdi para Delphi 7
La pregunta es en que parte del codigo defines los prefijos cfdi?

Gracias
Se definen con esta linea de codigo :

XMLDoc.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3".....etc

Antes lo hacia como lo menciona dos o tres mensajes arriba que tienen por titulo "Parte II" pero vi que en una sola linea se podia hacer

Re: Namespace prefix (o porque aparece cfdi: en nodos del CF

Publicado: Mar Ago 30, 2011 6:43 pm
por Czar
Duda:

...Estoy realizando actualmente la addenda de super neto, el nodo principal se llama 'ap' (por aquello de a-ddenda de p-roveedores). Bueno el caso es que yo genero una addenda con la estructura como sigue:

<cfdi:Addenda>
<ap xmlns="http://www.tiendasneto.com/ap" xsi:schemaLocation="http://www.tiendasneto.com/ap addenda_prov.xsd" plazoPago="CREDITO"
observaciones="Ninguna">
<Detalle folio="0950965">
<Producto codigoBarras="873647000067" cajasEntregadas="60" precioUnitarioCaja="147.60" piezasEntregadas="1080" precioUnitarioPieza="8.20">
<Impuestos totalImpuestosTrasladados="1416.96">
<Traslados>
<Traslado impuesto="IVA" tasa="16.00" importe="1416.96" />
</Traslados>
</Impuestos>
</Producto>
</Detalle>
</ap>
</cfdi:Addenda>

y el proveedor me hace la observación de que el prefijo debe de ir en todos los atributos, como sigue:

<cfdi:Addenda>
<ap:ap xmlns:ap="http://www.tiendasneto.com/ap" xsi:schemaLocation="http://www.tiendasneto.com/ap addenda_prov.xsd" plazoPago="CREDITO"
observaciones="Ninguna">
<ap:Detalle folio="0950965" tipoComprobante="FE">
<ap:Producto codigoBarras="873647000067" cajasEntregadas="60" precioUnitarioCaja="147.60" piezasEntregadas="1080" precioUnitarioPieza="8.20">
<ap:Impuestos totalImpuestosTrasladados="1416.96">
<ap:Traslados>
<ap:Traslado impuesto="IVA" tasa="16" importe="1416.96" />
</ap:Traslados>
</ap:Impuestos>
</ap:Producto>
</ap:Detalle>
</ap:ap>
</cfdi:Addenda>

Tengo mi función similar (por no decir igual) a la de la amece:

function GetAddendaSuperNeto(Doc: IXMLDocument): IXMLAddenda;
begin
Result := Doc.GetDocBinding('Addenda', TXMLAddenda, TargetNamespace) as IXMLAddenda;
end;

Si a esta función le modifico el parametro y lo mando como: Result := Doc.GetDocBinding('Addenda:ap', TXMLAddenda, TargetNamespace) as IXMLAddenda;
--esto no funciona

function Getap(Doc: IXMLDocument): IXMLAp;
begin
Result := Doc.GetDocBinding('ap', TXMLAp, TargetNamespace) as IXMLAp;
end;
Si a esta función le modifico el parámetro de 'ap' por 'ap:ap'
--tampoco funciona

Por ahí, en algún lugar del foro, leí que se puede usar la función DeclareNameSpace
intenté usarla, pero si se lo pongo al nivel de CFD.DeclareNameSpace(.... , lo coloca a nivel principal
si lo pongo como Addenda.DeclareNameSpace(... no me lo hace

Alguien se ha topado con éste problema? Alguna idea de como solucionarlo?