【问题标题】:Delphi Berlin 10.1 IXMLDOCUMENT root node prefixDelphi Berlin 10.1 IXMLDOCUMENT 根节点前缀
【发布时间】:2018-01-09 16:39:43
【问题描述】:

我正在尝试在 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>

我该如何解决? 谢谢。

【问题讨论】:

  • 何 avuto lo stesso 问题。里索托。

标签: xml delphi xmldocument


【解决方案1】:

简而言之,你不能单独使用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>

【讨论】:

  • 很好的答案。我有同样的问题。多谢 !关于 Stefano
  • 谢谢!我也一直有这个问题。现在好了!
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 2023-03-17
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多