- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试在 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>09876543211</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>
关于xml - Delphi Berlin 10.1 IXMLDOCUMENT 根节点前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172801/
我有一个 XML 文件,它最初是使用空格缩进格式化的(每个嵌套项有 2 个空格)。 当我使用 IXMLDocument 加载和保存此文件时,空格缩进变为制表符(代码 #9)。 代码如下: var
我正在使用 Delphi 2010,仅使用库存标准 VCL 库。目标系统是win32。 如果我有对 IXMLDocument 的引用,如何获取 IXMLDocument 包装的基础对象的 IXMLDO
我正在尝试像这样从 IXMLDocument 中获取 xml 文本。 Doc.XML.Text; 这给了我 xml 文本,但它包含 xml 声明。 有没有办法获取不包括 xml 声明的 xml 文本
给出下面的 XML 示例; 如何轻松检查给定对象是否存在? 如何轻松添加组或用户类型的项目? (加一整 block ) group
我用 NewXMLDocument()生成我的数据的 XML 文档。 有一个SaveToXML()方法将文档保存到 XML 格式的字符串变量。 问题是 XML 字符串不包含 "encoding"头标签
使用 IXMLDocument(msxml 包装器)时,是否有理由在我的 DLL 函数中使用 CoInitialize? (或与此相关的其他 com 对象) 调用应用程序/线程是否负责调用CoInit
我正在尝试使用 Delphi TXMLDocument 解析器读取 XML 文件,但我无法访问节点中的数据,而且我无法弄清楚为什么会发生这种情况。 XML 是: 111 IT0123456
我正在尝试在 Delphi Berlin 10.1 中创建 XML我需要获取这样的文件: IT 01234567890
这个问题已经有答案了: What is the default value of 'Result' in Delphi? (3 个回答) 已关闭 6 年前。 下面的函数接受 XML 输入,对其进行解析
请我需要帮助来实现这个 xml,我对第三行有一个问题,这就是我的代码得到的: X X
我是一名优秀的程序员,十分优秀!