2012-12-14 73 views
0

需要一個帶有前綴的節點,但他這樣做是正確的方式,是我做的失敗嗎?或者是一個編譯器錯誤?XML節點中的不完整前綴

主要模塊代碼

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我所做的更改內容如下所示,在PPY前置節點名稱將factura

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> 

我做錯了什麼?還是有另一種方法可行?

感謝

+1

你有什麼期望_see_?如果編譯好的話,這可能是一個編譯器錯誤? – jachguate

+0

**必須在所有項目上出現PPY前綴**,並且如果您查看元素** nota,otrosCargos,part,參考**不是名稱的一部分 –

回答

1

你必須確保命名空間的廣告前綴與DOM註冊才能子節點和屬性上有效地使用它們。如果您在創建節點時指定了命名空間,但您之前未將該名稱空間註冊到factura節點,則您的nota,ostrosCargospart節點最終會擁有自己的xmlns屬性。僅僅手動創建一個xmlns屬性是不夠的,就像您目前正在做的那樣。您需要實際向DOM註冊名稱空間,以便知道它並可以在需要時使用它。

看一看這個討論Embarcadero的論壇,就如何與命名空間節點在執行代碼打交道的技巧,將XML數據綁定向導創建:

Creating a doc with two namespaces

+0

**所有節點都使用RegisterChildNodes函數註冊Afterconstruction TXMLFactura,其他收藏**作爲IXMLFactura_cargosCreditosList的FCargosCreditos:= CreateCollection(TXMLFactura_cargosCreditosList,IXMLFactura_cargosCreditos,'cargosCreditos');作爲IXMLFactura_otrosCargosList;' –

+0

'RegisterChildNode('otrosCargos',TXMLFactura_otrosCargos); RegisterChildNode('partes',TXMLFactura_partes);' –

相關問題