これには用語があると確信しているため、適切な用語が不足していることをご容赦ください。生の文字列を使用して 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;
ノート
上記は疑似コードであり、コピペして改変したもので、関係ないものは改変・除外してあります...
より詳しい情報
このアプリケーションは、データへの読み取り専用アクセスを提供するスタンドアロンの Web サーバーです。XML データを書き込むだけで済み、読み取る必要はありません。仮にそうしたとしても、その部分をカバーする XML パーサー ライブラリが既にあります。不要なオブジェクトでメモリをいっぱいにすることなく、この軽量化を可能な限り維持しようとしています。