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
相关产品推荐
相关产品推荐

