Ken*_*ran 3 xml delphi xml-namespaces txmldocument
我使用XML绑定向导来创建TXMLDocument的后代.此类生成的文件将在根节点中声明命名空间,并为文档的其余部分创建简单,朴素的节点.
<?xml version="1.0"?>
<RootNode xmlns="URL" xmlns:xsi="URL" xsi:schemaLocation="URL">
<SomeNode>
<AnotherNode>Value</AnotherNode>
</SomeNode>
</RootNode>
Run Code Online (Sandbox Code Playgroud)
我完全没有阅读或验证这一点.但是,现在发送这些文件的处理器要求每个节点都有前缀的命名空间,以便正确处理文件.
<?xml version="1.0"?>
<NS:RootNode xmlns:NS="URL" xmlns:xsi="URL" xsi:schemaLocation="URL">
<NS:SomeNode>
<NS:AnotherNode>Value</NS:AnotherNode>
</NS:SomeNode>
</NS:RootNode>
Run Code Online (Sandbox Code Playgroud)
如何使用TXMLDocument后代完成此操作?我希望它不涉及手动编辑10000行生成的代码.
好的,解决方案需要很长时间才能发现,但却非常简单.
XML数据绑定向导生成的代码将使用默认命名空间创建xml.您可以通过检查看到Get
,Load
并且New
在生成单元的功能.所有三个都调用GetDocBinding
,TargetNamespace
作为最终参数传入.TargetNamespace
是一个全局常量字符串,其中包含从您提供给绑定向导的架构或xml文档中提取的URI.
因为TargetNamespace
作为默认命名空间分配给根元素,所以没有子元素将具有前缀.
这样做的方法:
FDocumentName :=
NewXMLDocument.GetDocBinding(
'ns:DocumentName', // <-- Just add the prefix to the root node.
TXMLDocumentName,
TargetNamespace) as IXMLDocumentName;
Run Code Online (Sandbox Code Playgroud)
现在根节点看起来像:
<ns:DocumentName xmlns:ns="URI">
Run Code Online (Sandbox Code Playgroud)
并且所有子节点在创建时都将具有前缀.