Это нормальное поведение, любой узел, созданный под родительским узлом, будет нести пространство имен родительского узла.Поскольку вы хотите, чтобы узел HeadNode
не содержал пространство имен, вы должны назначить пустое пространство имен при создании этого узла.Если вы посмотрите на функцию TXMLNode.AddChild
, вы увидите, что существует функция перегрузки, которая принимает второй параметр, представляющий NameSpaceUri
для этого узла.Таким образом, чтобы исправить ваш XML, все, что вам нужно сделать, это изменить строку CurNode := RootNode.AddChild('HeadNode');
на CurNode := RootNode.AddChild('HeadNode', '');
Скомпилируемый пример:
program SO58008911;
{$APPTYPE CONSOLE}
{$R *.res}
uses
ActiveX,
XMLIntf,
XMLDoc,
System.SysUtils;
procedure TestXML;
var
XML : IXMLDOCUMENT;
RootNode, CurNode : IXMLNODE;
begin
XML := NewXMLDocument;
XML.Encoding := 'utf-8';
XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
RootNode := XML.AddChild('p:test');
RootNode.Attributes['xmlns:ds'] := 'Attributes1';
RootNode.Attributes['xmlns:p'] := 'Attributes2';
RootNode.Attributes['versione'] := 'FPR12';
CurNode := RootNode.AddChild('HeadNode', '');
CurNode := CurNode.AddChild('SubNode');
CurNode.Text := 'Test';
CurNode := CurNode.ParentNode;
CurNode := CurNode.AddChild('Codice');
CurNode.Text := '01234567890';
Writeln(XML.XML.Text);
end;
begin
try
CoInitialize(nil);
try
TestXML;
finally
CoUninitialize;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Вывод:
<?xml version="1.0"?>
<p:test xmlns:ds="Attributes1" xmlns:p="Attributes2" versione="FPR12">
<HeadNode>
<SubNode>Test</SubNode>
<Codice>01234567890</Codice>
</HeadNode>
</p:test>