Rub*_*ube 3 xml delphi xmldocument
我想在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>
...
Run Code Online (Sandbox Code Playgroud)
我写了这个程序
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;
Run Code Online (Sandbox Code Playgroud)
现在问题是我需要在根节点中有前缀p(p:FatturaElettronica ...)但如果我不知道如何:如果我设置
RootNode := XML.AddChild('p:FatturaElettronica');
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
我怎么解决它?谢谢.
Rem*_*eau 13
简而言之,你不能IXMLNode.AddChild()单独做到这一点.
当您使用AddChild()添加新的子元素并且未显式指定命名空间时,新子元素将继承其父元素的命名空间,如果父元素具有命名空间前缀,则该前缀也会被继承.这是硬编码行为AddChild(),你不能改变它.这就是您p:在所有子节点上看到前缀的原因.
如果使用AddChild()带有命名空间作为输入的重载,则可以省略子元素上的前缀,并且不会继承父节点的前缀.但是,xmlns即使命名空间与父命名空间相同,新的子元素也会有自己的声明:
header := RootNode.AddChild('FatturaElettronicaHeader', 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2');
Run Code Online (Sandbox Code Playgroud)
结果:
<FatturaElettronicaHeader xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2">
Run Code Online (Sandbox Code Playgroud)
您也无法更改此行为.
但是,有一种解决方法 - 单独创建子节点而不包含任何父元素或命名空间,然后将其原样插入父元素中,例如:
//header := RootNode.AddChild('FatturaElettronicaHeader');
header := XML.CreateElement('FatturaElettronicaHeader', '');
RootNode.ChildNodes.Add(header);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用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');
Run Code Online (Sandbox Code Playgroud)
结果:
<?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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |