2012-12-14 1 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, part без префикса, но с включенным в них пространством имен

<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, прежде чем вы сможете эффективно использовать их на дочерние узлы и атрибуты. nota, ostrosCargos и part узлы имеют свои собственные атрибуты xmlns, если вы указываете пространство имен при их создании, но вы ранее не регистрировали это пространство с узлом factura. Недостаточно просто создать атрибут xmlns вручную, как вы сейчас делаете. Вы должны фактически зарегистрировать пространство имен с DOM, чтобы он знал об этом и мог использовать его, когда это необходимо.

Посмотрите на это обсуждение на форуме Embarcadero для советов о том, как работать с пространствами имен узлов в коде реализации, что Binding мастер XML Data создает:

Creating a doc with two namespaces

+0

** все узлы зарегистрированы с помощью функции RegisterChildNodes. После создания TXMLFactura, другие - коллекции ** 'FCargosCreditos: = CreateCollection (TXMLFactura_cargosCreditosList, IXMLFactura_cargosCreditos, 'cargosCreditos') как IXMLFactura_cargosCreditosList; FOtrosCargos: = CreateCollection (TXMLFactura_otrosCargosList, IXMLFactura_otrosCargos, 'otrosCargos') как IXMLFactura_otrosCargosList; ' –

+0

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