這可能被認爲是另一端使用的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.
非常糟糕,但你可以添加一個後處理步驟再次更換那些& QUOT;再次使用&。 – jachguate 2011-02-03 23:28:49
@jachguate:是的,我想到了,但要做到這一點,我需要某種解析器來區分帶引號和正常數據的屬性。 – 2011-02-03 23:41:10