You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi7生成XML时如何移除子节点的父命名空间前缀p:

在Delphi 7中创建XML时避免子节点继承父节点的命名空间前缀

嘿,我懂你碰到的这个问题了——给根节点加了命名空间前缀后,所有子节点自动跟着带上了p:,但你希望HeadNode和它下面的节点都不带这个前缀。在Delphi 7里调整起来很简单,核心就是给子节点显式指定空命名空间,不让它们默认继承父节点的。

问题根源

Delphi的AddChild方法默认会让子节点继承父节点的命名空间,所以当你给根节点p:test设置了xmlns:p命名空间后,所有后续添加的子节点都会自动使用这个命名空间,从而带上p:前缀。

解决方法

调用AddChild方法时,给第二个参数传入空字符串,明确告诉XML解析器这个子节点属于空命名空间,不要继承父节点的。

修改后的完整代码如下:

var XML : IXMLDOCUMENT; RootNode, CurNode : IXMLNODE;
    s: string;
begin
XML := NewXMLDocument;
XML.Encoding := 'utf-8';
XML.Options := [doNodeAutoIndent]; // 让XML格式更美观
RootNode := XML.AddChild('p:test');
RootNode.Attributes['xmlns:ds'] := 'Attributes1';
RootNode.Attributes['xmlns:p'] := 'Attributes2';
RootNode.Attributes['versione'] := 'FPR12';

// 关键:给子节点指定空命名空间,避免继承父节点的p:前缀
CurNode := RootNode.AddChild('HeadNode', '');
CurNode := CurNode.AddChild('SubNode', '');
CurNode.Text := 'Test';
CurNode := CurNode.ParentNode;
CurNode := CurNode.AddChild('Codice', '');
CurNode.Text := '01234567890';

s := 'C:\Users\web\Desktop\file.xml';
XML.SaveToFile(s);
end;

生成的XML结果

运行这段代码后,你会得到完全符合预期的XML:

<?xml version="1.0" encoding="utf-8"?>
<p:test xmlns:ds="Attributes1" xmlns:p="Attributes2" versione="FPR12">
 <HeadNode>
 <SubNode>Test</SubNode>
 <Codice>01234567890</Codice>
 </HeadNode>
</p:test>

额外小提示

如果之后你需要给某个子节点指定其他命名空间(比如ds:前缀),只需要把AddChild的第二个参数改成对应的命名空间值即可。比如:

CurNode := RootNode.AddChild('ds:OtherNode', 'Attributes1');

这样生成的节点就会带有ds:前缀,且正确关联对应的命名空间。

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:42:17