Это можно считать ошибкой в XML-парсере, используемом на другом конце. Спецификация XML детализирует сущности, которые можно экранировать. Но их нужно только экранировать внутри атрибутов, что работает, как показано здесь:
program Project2;
{$APPTYPE CONSOLE}
uses
ActiveX,
MSXML2_TLB,
SysUtils;
var
Dom : IXMLDOMDocument2;
Root : IXMLDOMNode;
Attr : IXMLDOMNode;
begin
CoInitialize(nil);
try
DOM := CoDOMDocument40.Create;
Root := Dom.createElement('root');
Attr := Dom.createAttribute('attr');
Attr.text := '"';
root.attributes.setNamedItem(Attr);
root.text := '"Hello World"';
DOM.appendChild(Root);
writeln(Root.xml);
readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Но реальность такова, что вы не можете контролировать другую сторону уравнения.
Таким образом, вы можете получить желаемое поведение, выполнив следующее:
program Project2;
{$APPTYPE CONSOLE}
uses
ActiveX,
MSXML2_TLB,
SysUtils;
function QuoteEscape(const v : String) : String;
begin
result := StringReplace(V,'"','"',[rfReplaceAll]);
end;
var
Dom : IXMLDOMDocument2;
Root : IXMLDOMNode;
Attr : IXMLDOMNode;
begin
CoInitialize(nil);
try
DOM := CoDOMDocument40.Create;
Root := Dom.createElement('root');
Attr := Dom.createAttribute('attr');
Attr.text := '"';
root.attributes.setNamedItem(Attr);
root.text := QuoteEscape('"Hello World"');
DOM.appendChild(Root);
writeln(StringReplace(Root.xml,'"','"',[rfReplaceAll]));
readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.