我使用字符串列表来制作一个简单的 xml,其中通过 Add 插入节点以制作 UTF8 编码的 xml
例如。
myXML.Add('<myNode>'+UTF8Encode('υτφ8στρινγ')+'</myNode>');
但是我想切换到 IXMLDocument 以获得更简洁的代码和多功能性
我正在 Delphi 中制作一个简单的 xml
procedure myxml;
var
xmlDoc : IXMLDocument;
xNode : IXMLNode;
begin
xmlDoc := TXMLDocument.Create(nil);
try
xmlDoc.Active := TRUE;
xmlDoc.Version := '1.0';
xmlDoc.Encoding := 'utf-8';
xNode := xmlDoc.AddChild('myNode');
xNode.Text := UTF8Encode('υτφ8στρινγ'); //greek chars
xmlDoc.XML.SaveToFile('test.xml');
finally
FreeAndNil(xmlDoc);
end;
end;
问题在于输出 XML 以 UTF-8 编码两次。我认为问题与 MSXML 有关,默认情况下,MSXML 以 UTF-8 进行编码(通过 MSXML.save())。
所以我需要的是以某种方式让 MSXML 不对 XML 进行编码,而是具有 header
<?xml version="1.0" encoding="utf-8"?>
最佳答案
问题是您不应该执行任何 UTF-8 编码。将字符串传递给 XML 库,并让它进行编码。所以,替换
xNode.Text := UTF8Encode('υτφ8στρινγ');
与
xNode.Text := 'υτφ8στρινγ';
您必须删除对 FreeAndNil
的调用。您正在传递一个接口(interface)引用,FreeAndNil
用于对象实例引用。只需将其删除,然后让接口(interface)引用计数代码完成其工作即可。
关于Delphi:如何防止 MSXML 以 UTF-8 编码已编码的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17107253/