如何使用TXMLDocument为每个节点添加名称空间前缀

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行生成的代码.

Ken*_*ran 6

好的,解决方案需要很长时间才能发现,但却非常简单.

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)

并且所有子节点在创建时都将具有前缀.