Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使TXMLDocument(使用MSXML实现)始终包含编码属性?_Xml_Delphi_Encoding_Delphi 2010_Txmldocument - Fatal编程技术网

如何使TXMLDocument(使用MSXML实现)始终包含编码属性?

如何使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

我有一个遗留代码(我没有编写它),它总是包含编码属性,但是重新编译到D2010,TXMLDocument不再包含编码。因为XML数据在标记和数据上都有重音字符,所以TXMLDocument.LoadFromFile只会抛出一个比较错误,表示在文件上发现了无效字符。相关代码:

   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;