Delphi Berlin 10.1 IXMLDOCUMENT根节点前缀
发布时间:2020-12-15 09:09:56 所属栏目:大数据 来源:网络整理
导读:我正在尝试在Delphi Berlin 10.1中创建 XML 我需要获得这样的文件: ?xml version="1.0" encoding="UTF-8"?p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/x
我正在尝试在Delphi Berlin 10.1中创建
XML
我需要获得这样的文件: <?xml version="1.0" encoding="UTF-8"?> <p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd"> <FatturaElettronicaHeader> <DatiTrasmissione> <IdTrasmittente> <IdPaese>IT</IdPaese> <IdCodice>01234567890</IdCodice> </IdTrasmittente> <ProgressivoInvio>00001</ProgressivoInvio> <FormatoTrasmissione>FPA12</FormatoTrasmissione> <CodiceDestinatario>AAAAAA</CodiceDestinatario> </DatiTrasmissione> ... 我写了这个程序 procedure Tfattura2_new_form.Button1Click(Sender: TObject); Var XML : IXMLDOCUMENT; RootNode,CurNode,header[...]: IXMLNODE; begin XML := NewXMLDocument; XML.Encoding := 'utf-8'; XML.Options := [doNodeAutoIndent]; RootNode := XML.AddChild('FatturaElettronica'); RootNode.Attributes['versione']:='FPA12'; RootNode.DeclareNamespace('ds','http://www.w3.org/2000/09/xmldsig#'); RootNode.DeclareNamespace('p','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); RootNode.DeclareNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance'); [...] header := RootNode.AddChild('FatturaElettronicaHeader'); DatiTrasmissione := header.AddChild('DatiTrasmissione'); IdTrasmittente := DatiTrasmissione.AddChild('IdTrasmittente'); [...] XMl.SaveToFile('C:file.xml'); end; 现在问题是我需要在根节点中有前缀p(p:FatturaElettronica ……) RootNode := XML.AddChild('p:FatturaElettronica'); 在xml文件中,我在每个标签中都有前缀p :. <?xml version="1.0" encoding="utf-8"?> <p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd"> <p:FatturaElettronicaHeader> <p:DatiTrasmissione> <p:IdTrasmittente> <p:IdPaese>IT</p:IdPaese> <p:IdCodice>03444630135</p:IdCodice> </p:IdTrasmittente> <p:ProgressivoInvio>23</p:ProgressivoInvio> <p:FormatoTrasmissione>FPR12</p:FormatoTrasmissione> <p:CodiceDestinatario>0000000</p:CodiceDestinatario> </p:DatiTrasmissione> 我该怎么办呢? 解决方法
简而言之,单独使用IXMLNode.AddChild()就无法做到这一点.
当您使用AddChild()添加新的子元素,并且您没有显式指定命名空间时,新子元素继承其父元素的命名空间,如果父元素具有命名空间前缀,则该前缀也会被继承.这是AddChild()中的硬编码行为,您无法更改它.这就是您在所有子节点上看到p:前缀的原因. 如果使用带有命名空间作为输入的重载AddChild(),则可以省略子元素上的前缀,并且不会继承父节点的前缀.但是,新的子元素将具有自己的xmlns声明,即使命名空间与父命名空间相同: header := RootNode.AddChild('FatturaElettronicaHeader','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); 结果: <FatturaElettronicaHeader xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"> 您也无法更改此行为. 但是,有一种解决方法 – 单独创建子节点而不包含任何父元素或命名空间,然后将其原样插入父元素中,例如: //header := RootNode.AddChild('FatturaElettronicaHeader'); header := XML.CreateElement('FatturaElettronicaHeader',''); RootNode.ChildNodes.Add(header); 然后,您可以将AddChild()用于后续子元素,并且它们将继承FatturaElettronicaHeader元素的不存在的命名空间,例如: XML := NewXMLDocument; XML.Encoding := 'utf-8'; XML.Options := [doNodeAutoIndent]; RootNode := XML.AddChild('p:FatturaElettronica','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); RootNode.Attributes['versione']:='FPA12'; RootNode.DeclareNamespace('ds','http://www.w3.org/2000/09/xmldsig#'); RootNode.DeclareNamespace('p','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); RootNode.DeclareNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance'); //header := RootNode.AddChild('FatturaElettronicaHeader'); header := XML.CreateElement('FatturaElettronicaHeader',''); RootNode.ChildNodes.Add(header); DatiTrasmissione := header.AddChild('DatiTrasmissione'); IdTrasmittente := DatiTrasmissione.AddChild('IdTrasmittente'); IdTrasmittente.AddChild('IdPaese').Text := 'IT'; IdTrasmittente.AddChild('IdCodice').Text := '01234567890'; DatiTrasmissione.AddChild('ProgressivoInvio').Text := '00001'; DatiTrasmissione.AddChild('FormatoTrasmissione').Text := 'FPA12'; DatiTrasmissione.AddChild('CodiceDestinatario').Text := 'AAAAAA'; XML.SaveToFile('C:file.xml'); 结果: <?xml version="1.0" encoding="utf-8"?> <p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <FatturaElettronicaHeader> <DatiTrasmissione> <IdTrasmittente> <IdPaese>IT</IdPaese> <IdCodice>01234567890</IdCodice> </IdTrasmittente> <ProgressivoInvio>00001</ProgressivoInvio> <FormatoTrasmissione>FPA12</FormatoTrasmissione> <CodiceDestinatario>AAAAAA</CodiceDestinatario> </DatiTrasmissione> </FatturaElettronicaHeader> </p:FatturaElettronica> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |