1

プログラムからエクスポートされた XML が引用符をエスケープせず (, に変わる") "、受信側で問題が発生するという問題に取り組んでいます。&s と山かっこは問題なくエスケープされますが、引用符はエスケープされません。

XML エクスポート コードを調べてみたところ、これは非常に単純なIXmlDomDocument2DOM インターフェースであることがわかりました。しかし、.XMLメソッドを呼び出して XML 文字列出力を生成するステップに到達したとき、すべての作業が の内部で行われているため、追跡できない独自性の壁にぶち当たりましたC:\Windows\System32\msxml3.dll

したがって、明らかに Microsoft のIXmlDomDocument2実装は、一部のシンボルをエスケープする方法を知っていますが、他のシンボルはエスケープしません。さらに悪いことに、明白だが醜い解決策 (ドキュメント全体を再帰的にトラバースし、値のすべての引用符を '"' に置き換えることによって前処理ステップを実行してから、 を呼び出す.XML) は機能しません.XML。これを修正する方法はありますか?

4

1 に答える 1

3

これは、相手側で使用されている XML パーサーのバグと考えられます。XML 仕様では、エスケープできるエンティティについて詳しく説明しています。ただし、属性内でエスケープする必要があるだけで、次のように機能します。

program Project2;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  MSXML2_TLB,
  SysUtils;
var
  Dom : IXMLDOMDocument2;
  Root :  IXMLDOMNode;
  Attr : IXMLDOMNode;
begin
  CoInitialize(nil);
  try
    DOM := CoDOMDocument40.Create;
    Root := Dom.createElement('root');
    Attr := Dom.createAttribute('attr');
    Attr.text := '"';
    root.attributes.setNamedItem(Attr);
    root.text := '"Hello World"';
    DOM.appendChild(Root);
    writeln(Root.xml);
    readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

しかし、現実には、方程式の反対側を制御できない場合があります。したがって、次のようにして、目的の動作を得ることができます。

program Project2;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  MSXML2_TLB,
  SysUtils;
function QuoteEscape(const v : String) : String;
begin
  result := StringReplace(V,'"','"',[rfReplaceAll]);
end;


var
  Dom : IXMLDOMDocument2;
  Root :  IXMLDOMNode;
  Attr : IXMLDOMNode;
begin
  CoInitialize(nil);
  try
    DOM := CoDOMDocument40.Create;
    Root := Dom.createElement('root');
    Attr := Dom.createAttribute('attr');
    Attr.text := '"';
    root.attributes.setNamedItem(Attr);
    root.text :=  QuoteEscape('"Hello World"');
    DOM.appendChild(Root);
    writeln(StringReplace(Root.xml,'"','"',[rfReplaceAll]));
    readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
于 2011-02-03T23:55:04.210 に答える