如何使TXMLDocument(使用MSXML实现)始终包含编码属性?
我有一个遗留代码(我没有编写它),它总是包含编码属性,但是重新编译到D2010,TXMLDocument不再包含编码。因为XML数据在标记和数据上都有重音字符,所以TXMLDocument.LoadFromFile只会抛出一个比较错误,表示在文件上发现了无效字符。相关代码:如何使TXMLDocument(使用MSXML实现)始终包含编码属性?,xml,delphi,encoding,delphi-2010,txmldocument,Xml,Delphi,Encoding,Delphi 2010,Txmldocument,我有一个遗留代码(我没有编写它),它总是包含编码属性,但是重新编译到D2010,TXMLDocument不再包含编码。因为XML数据在标记和数据上都有重音字符,所以TXMLDocument.LoadFromFile只会抛出一个比较错误,表示在文件上发现了无效字符。相关代码: Doc := TXMLDocument.Create(nil); try Doc.Active := True; Doc.Encoding := XMLEncoding; Roo
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
您需要查看IXMLDocument.CreateProcessingStruction。我使用,但它的语法类似,应该让您开始:
var
FDoc: IXMLDocument;
PI: IXMLProcessingInstruction;
begin
FDoc := OmniXML.CreateXMLDoc();
PI := FDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
FDoc.AppendChild(PI);
end;
var
XMLStream:TStringStream;
开始
Doc:=TXMLDocument.Create(无);
尝试
单据激活:=真;
单据编码:=XMLEncoding;
RootNode:=Doc.CreateElement('Test','');
Doc.DocumentElement:=根节点;
XMLStream:=TStringStream.Create;
Doc.SaveToStream(XMLStream);
结果:=XmlStream.DataString;
XMLStream.Free;
由于Ken的回答和MSXML文章的链接,我决定研究XML属性和SaveToXML方法。这两种方法都使用MSXMLDOM实现的XML属性——本文中说,直接读取时不带编码(在使用CreateProcessInstruction方法之后的“使用MSXML创建新的XML文档”一节中)
更新:
我发现重音字符在生成的XML中被截断。当XML的处理器开始抛出奇怪的错误时,我们看到字符被转换为数字字符常量(#13是回车的数字字符常量)。因此,我使用了TStringStream,使其最终正确。这也正是微软对MSXML的建议:。然而,文档开头的东西从技术上讲不是一个处理指令。这是一个XML声明;处理指令的名称实际上不允许使用字符串“xml”,因此,
CreateProcessingInstruction
方法似乎在执行双重任务。@Rob:这可能就是我几年前花了一段时间才弄明白的原因(当时没有您提供的MSDN链接)。然而,如果它告诉解析器如何解释内容,它实际上可以被视为一条处理指令,不是吗?“这是XML,它在这个字符集中-这将使它更容易理解。”
<?xml version="1.0"?>
XMLEncoding = 'ISO-8859-1';
var
FDoc: IXMLDocument;
PI: IXMLProcessingInstruction;
begin
FDoc := OmniXML.CreateXMLDoc();
PI := FDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
FDoc.AppendChild(PI);
end;
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;