【问题标题】:How to make TXMLDocument (with the MSXML Implementation) always include the encoding attribute?如何使 TXMLDocument(使用 MSXML 实现)始终包含编码属性?
【发布时间】:2011-02-15 03:21:42
【问题描述】:

我有始终包含编码属性的旧代码(我没有编写它),但是将其重新编译到 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';

【问题讨论】:

    标签: xml delphi encoding delphi-2010 txmldocument


    【解决方案1】:

    您会想查看 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;
    

    【讨论】:

    • 这正是微软对 MSXML 的推荐:msdn.microsoft.com/en-us/library/aa468560.aspx。但是,文档开头的内容在技术上并不是处理指令。这是一个XML 声明;处理指令的名称实际上不允许使用字符串“xml”,因此看起来CreateProcessingInstruction 方法正在执行双重任务。
    • @Rob:这可能是几年前我花了一段时间才弄清楚的原因(当时没有你提供的 MSDN 链接)。但是,它实际上可以被认为是一个处理指令,不是吗,如果它告诉解析器如何解释内容? “这是 XML,它在这个字符集中 - 这将使它更容易弄清楚。”
    【解决方案2】:
    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 的处理器开始抛出奇怪的错误时,我们看到字符正在转换为数字 char 常量(#13 是用于回车的数字 char 常量)。所以,我使用了一个 TStringStream 来得到它FINALLY正确。

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2012-07-29
      • 2010-12-07
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多