由于 Child1 的子元素不具有相同的命名空间,因此它必须是未声明的,这就是 Child2 持有空(默认)命名空间的原因。
这被称为命名空间未声明 http://en.wikipedia.org/wiki/XML_namespace#Namespace_undeclaration
当元素带有属性 xmlns="" 时,该元素及其后代的默认命名空间将恢复为“无命名空间”:也就是说,无前缀的名称被视为不在任何命名空间中。
XML 命名空间 1.1 还引入了取消声明其他命名空间前缀的选项。例如,如果属性 xmlns:p="" 出现在某个元素上,则命名空间前缀 p 不再处于该元素或其后代的范围内(因此不能使用),除非由另一个命名空间声明重新引入
话虽这么说,修复方法很简单;包括所有后续子节点上的名称空间:
program SO20424534;
{$APPTYPE CONSOLE}
uses
ActiveX,
XMLdom,
XMLDoc,
XMLIntf,
SysUtils;
function TestXML : String;
var
RootNode,
CurNode : IXMLNODE;
Doc : IXmlDocument;
ns : String;
begin
Doc := Newxmldocument;
ns := 'apenootje';
Doc.Encoding := 'utf-8';
Doc.Options := [doNodeAutoIndent];
RootNode := Doc.AddChild('Document');
CurNode := RootNode.AddChild('Child1');
CurNode.DeclareNamespace('', ns);
CurNode := CurNode.AddChild('Child2', ns);
CurNode := CurNode.AddChild('Child3', ns);
Result := Doc.XML.Text;
end;
begin
try
CoInitialize(nil);
try
Writeln(TestXML);
finally
CoUninitialize;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end;
Output:
<?xml version="1.0"?>
<Document>
<Child1 xmlns="apenootje">
<Child2>
<Child3/>
</Child2>
</Child1>
</Document>