[英]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.