我有遗留代码(我没写过),它总是包含编码属性,但是重新编译为D2010,TXMLDocument不再包含编码。由于XML数据在标记和数据上都有重音字符,因此TXMLDocument.LoadFromFile只会抛出EDOMParseErros,表示在文件中找到了无效字符。相关代码:
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
//Result := Doc.XMl.Text;
Doc.SaveToXML(Result); // Both lines gives the same result
在旧版本的Delphi中,生成以下行:
<?xml version="1.0" encoding="ISO-8859-1"?>
在D2010上,生成:
<?xml version="1.0"?>
如果我手动更改线路,所有工作都会像过去几年一直有效。
更新:XMLEncoding是一个常量,定义如下
XMLEncoding = 'ISO-8859-1';
答案 0 :(得分:6)
您需要查看IXMLDocument.CreateProcessingStruction。我使用OmniXML,但它的语法类似,应该让你开始:
var
FDoc: IXMLDocument;
PI: IXMLProcessingInstruction;
begin
FDoc := OmniXML.CreateXMLDoc();
PI := FDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
FDoc.AppendChild(PI);
end;
答案 1 :(得分:4)
var
XMLStream: TStringStream;
begin
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
XMLStream := TStringStream.Create;
Doc.SaveToStream(XMLStream);
Result := XmlStream.DataString;
XMLStream.Free;
自Ken的回答和MSXML文章链接以来,我决定研究XML属性和SaveToXML方法。两者都使用MSXMLDOM实现的XML属性 - 在文章中说直接读取时不会带来编码(在使用CreateProcessInstruction方法后立即在“使用MSXML创建新的XML文档”部分)。
更新:
我发现重音字符在生成的XML中被截断了。当该XML的处理器开始抛出奇怪的错误时,我们看到chars正被转换为数字char常量(#13是回车的数字char常量)。所以,我使用TStringStream来使它 FINALLY 正确。