2011-02-03 25 views
1

我正在處理從我們的程序導出的XML不會導致接收端出現問題的引號(將"轉換爲")的問題。它逃脫了& s和尖括號,但沒有引號。如何讓IXmlDomDocument2.XML正確地轉義引號?

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

顯然,微軟的IXmlDomDocument2實現知道如何逃避某些符號,但不知道其他符號。更糟糕的是,這個顯而易見的解決方案(運行預處理步驟,遞歸遍歷整個文檔並在我調用.XML之前用'"'替換值中的所有引號)將不起作用,因爲.XML方法將會看到那些&在那裏逃跑!有沒有什麼辦法解決這一問題?

+0

非常糟糕,但你可以添加一個後處理步驟再次更換那些& QUOT;再次使用&。 – jachguate 2011-02-03 23:28:49

+0

@jachguate:是的,我想到了,但要做到這一點,我需要某種解析器來區分帶引號和正常數據的屬性。 – 2011-02-03 23:41:10

回答

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. 
相關問題