簡體   English   中英

如何使IXmlDomDocument2.XML正確轉義引號?

[英]How to get IXmlDomDocument2.XML to escape quotes properly?

我正在解決一個問題,即從我們的程序中導出的XML不會轉義引號(將"變成" ,)導致接收端出現問題,它會正確地轉義&s和尖括號,但不會轉引號。

在研究XML導出代碼時,我發現它是一個非常簡單的IXmlDomDocument2 DOM接口。 但是當我到達通過調用.XML方法生成XML字符串輸出的步驟時,我碰到了我無法追蹤的專有性牆,因為所有工作都在C:\\Windows\\System32\\msxml3.dll內部進行C:\\Windows\\System32\\msxml3.dll

因此,顯然,Microsoft的IXmlDomDocument2實現知道如何轉義某些符號,而不能轉義其他符號。 而且,更糟糕的是,顯而易見的,丑陋的解決方案(通過遞歸遍歷整個文檔並在我調用.XML之前用'“'替換值中的所有引號來運行預處理步驟)將不起作用,因為.XML方法會看到那些&s在那里並逃脫它們!有什么辦法可以解決這個問題?

可以將其視為另一端使用的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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM