Delphi Berlin 10.1 IXMLDOCUMENT根节点前缀

Delphi Berlin 10.1 IXMLDOCUMENT根节点前缀,第1张

概述我正在尝试在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.agenz 我正在尝试在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>
总结

以上是内存溢出为你收集整理的Delphi Berlin 10.1 IXMLDOCUMENT根节点前缀全部内容,希望文章能够帮你解决Delphi Berlin 10.1 IXMLDOCUMENT根节点前缀所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存