以正确的格式编写 XML 字符串?

Jer*_*dge 2 xml delphi formatting standards xml-serialization

请原谅我缺乏正确的术语,因为我确信有一个术语可以形容这一点。我正在使用原始字符串编写 XML 文本(为了便于使用,不使用任何类型的 XML 生成器/解析器)。但是,我面临一个问题,即我提供的数据中的某些字符脱离了标准化。例如,&符号。当字符串包含此内容时,最终解析器就会被抛出。我如何正确适应这一点并将字符串转换为 XML 标准?

我正在将纯字符串写入字符串列表并读取其Text属性,如下所示。请注意该子例程A(const S: String);,它是向 XML 文件添加一行并添加必要的缩进的缩短方法。看子程序Standardize,这是我需要填写的。

uses Windows, Classes, SysUtils, DB, ADODB, ActiveX;

function TSomething.FetchXML(const SQL: String): String;
var
  L: TStringList;
  Q: TADOQuery;
  X, Y: Integer;
  function Standardize(const S: String): String;
  begin
    Result:= S; //<<<--- Need to convert string to XML standards
  end;
  procedure A(const Text: String; const Indent: Integer = 0);
  var
    I: Integer;
    S: String;
  begin
    if Indent > 0 then
      for I := 0 to Indent do
        S:= S + '  ';
    L.Append(S + Text);
  end;
begin
  Result:= '';
  L:= TStringList.Create;
  try
    Q:= TADOQuery.Create(nil);
    try
      Q.ConnectionString:= FCredentials.ConnectionString;
      Q.SQL.Text:= SQL;
      Q.Open;
      A('<?xml version="1.0" encoding="UTF-8"?>');
      A('<dataset Source="ECatAPI">');
      A('<table>');
      A('<fields>', 1);
      for X := 0 to Q.FieldCount - 1 do begin
        A('<field Name="'+Q.Fields[X].FieldName+'" '+
          'Type="'+IntToStr(Integer(Q.Fields[X].DataType))+'" '+
          'Width="'+IntToStr(Q.Fields[X].DisplayWidth)+'" />', 2);
      end;
      A('</fields>', 1);
      A('<rows>', 1);
      if not Q.IsEmpty then begin
        Q.First;
        while not Q.Eof do begin
          A('<row>', 2);
          for Y:= 0 to Q.FieldCount - 1 do begin
            A('<value Field="'+Q.Fields[Y].FieldName+'">'+
              Standardize(Q.Fields[Y].AsString)+'</value>', 3);
          end;
          A('</row>', 2);
          Q.Next;
        end;
      end;
      A('</rows>', 1);
      A('</table>');
      A('</dataset>');
      Result:= L.Text;
      Q.Close;
    finally
      Q.Free;
    end;
  finally
    L.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

笔记

以上是伪代码,复制和修改,不相关的东西已被更改/排除......

更多信息

该应用程序是一个独立的 Web 服务器,提供对数据的只读访问。我只需要写入 XML 数据,不需要读取它。即使我这样做了,我也已经有了一个涵盖该部分的 XML 解析器库。我试图尽可能保持轻量级,而不用不必要的对象填充内存。

Jer*_*ers 5

不要手动生成 XML。

编写正确的代码来转义复杂数据(例如 XML、HTML 或 XML 中的其他 SGML、转义的 CDATA)是不值得的。

你所做的逃跑只是一个开始。等到有人在您的数据中添加了不兼容的内容。

无论如何,许多数据库都支持从查询创建格式良好的 XML(请参阅其他答案),这是您应该研究的方向。

  • 这取决于:如果您绝对确定数据的来源,您可能会想要这样做。根据我的经验,您的用户将比您预期更快地找到不完整的解决方案。 (2认同)