0

プレフィックス付きのノードが必要ですが、彼は正しい方法でそれを行います。私のやり方は失敗ですか? またはコンパイラのバグですか?

メインモジュールコード

    function Generar_Addenda(PathCFD : String; ValidaOnly : Integer) : Integer;
const
  xmlns = 'xmlns=""';             (* Cadena String a Borrar, (se genera al obtener la interaz Factura) *)
var
  XMLFactura : IXMLDocument;
  Factura : IXMLFactura;
  CFD : TCFD;
begin

  Try
    CFD := TCFD.Create(cfdV22);       // AQUI CREO UNA INSTANCIA DEL CFD, PARA TENER LA CLASE COMPLETA
    CFD.LoadFromFile(PathCFD);       // AQUI CARGO EL XML YA SELLADO, LISTO PARA PEGAR LA ADDENDA

    XMLFactura := TXMLDocument.Create(Nil);
    XMLFactura.Active := True;

    Factura := GetFactura(XMLFactura);

// ************* PERSONALIZAR ADDENDA CHRYSLER PPY  **********************             AQUI LLENO LA ADDENDA CON LOS DATOS DE LA BASE DE DATOS
    With Factura do
     begin
       TipoDocumento := cds_cliente.FieldByName('TipoDocumento').AsString;
       TipoDocumentoFiscal := cds_Cliente.FieldByName('TipoDocumentoFiscal').AsString;   
       Version := cds_Cliente.FieldByName('Version').AsString;
      ......
      .....
    end;

    FACTURA.OwnerDocument.Options := [doAutoPrefix];


    CFD.Datos.Addenda.ChildNodes.Add(Factura);

    Factura.SetAttributeNS('xmlns:PPY','', 'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY');
    Factura.Attributes['xsi:schemaLocation'] :=  'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD';

    CFD.SaveToFile('C:\Paso\CFD_PRUEBA_ADDENDA_CHRYSLER.XML');
  Finally
     ......
     ......

  End;

インターフェイス Intf_PPY に変更を加えたのは次のとおりです。

    function Getfactura(Doc: IXMLDocument): IXMLFactura;
function Loadfactura(const FileName: string): IXMLFactura;
function Newfactura: IXMLFactura;

const
  TargetNamespace =
   'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY'; // xsi:schemaLocation="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD"';

implementation

{ Global Functions }

function Getfactura(Doc: IXMLDocument): IXMLFactura;
begin
  Result := Doc.GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;

function Loadfactura(const FileName: string): IXMLFactura;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;

function Newfactura: IXMLFactura;
begin
  Result := NewXMLDocument.GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;

そして、これは私が見つけたもので、ノードのメモ、otroscargos、一部の接頭辞はありませんが、それらの中に名前空間が含まれています

    <Addenda>
      <PPY:factura tipoDocumento="PPY" TipoDocumentoFiscal="FA" version="1.0" serie="A" folioFiscal="451" fecha="2012-06-20" montoTotal="9960.98" referenciaProveedor="A 451" xmlns:PPY="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" xsi:schemaLocation="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD">
         <PPY:moneda tipoMoneda="USD" tipoCambio="1.0000"/>
         <PPY:proveedor codigo="20215" nombre="NOMBRE DE LA EMPRESA S.A. DE C.V."/>
         <PPY:destino codigo="8476" nombre="PLANTA DE MOTORES 4 CILINDROS - SALTILLO"/>
         <nota xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY">Addenda de Prueba</nota>
         <otrosCargos xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" codigo="V6" monto="1373.93"/>
         <PPY:partes>
            <part xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" numero="123456" cantidad="1.0000" unidadDeMedida="EA" precioUnitario="8587.0500" montoDeLinea="8587.05">
               <references ordenCompra="XYZ6675" releaseRequisicion="XYZ4218000" ammendment="A"/>
               <nota>Probando Addenda</nota>
            </part>
         </PPY:partes>
      </PPY:factura>
   </Addenda>

私は何か間違ったことをしていますか?または別の方法がありますか?

ありがとう

4

1 に答える 1

1

子ノードと属性で効果的に使用する前に、名前空間の広告プレフィックスが DOM に登録されていることを確認する必要があります。notaostrosCargos、およびノー​​ドを作成するときに名前空間を指定しているが、その名前空間を事前にノードに登録していない場合、partこれらのノードには独自の属性が設定されます。現在行っているように、属性を手動で作成するだけでは十分ではありません。名前空間を DOM に実際に登録して、それを認識し、必要なときに使用できるようにする必要があります。xmlnsfacturaxmlns

XML データ バインディング ウィザードが作成する実装コードでネームスペース ノードを操作する方法のヒントについては、Embarcadero フォーラムのこのディスカッションを参照してください。

2 つの名前空間を持つドキュメントの作成

于 2012-12-14T21:55:09.757 に答える