我正在解决的一个问题是,从我们的程序导出的XML不能转义引号(将"
转换为"
),从而导致接收端出现问题。它可以很好地转义&s和尖括号,但不能用引号。
当我深入研究XML导出代码时,我发现它是一个非常简单的IXmlDomDocument2
DOM接口。但是,当我到达通过调用.XML
方法生成XML字符串输出的步骤时,我遇到了一个无法追踪的专有性墙,因为所有的工作都发生在C:\Windows\System32\msxml3.dll
内部。
显然,微软的IXmlDomDocument2
实现知道如何转义某些符号,但不知道如何转义其他符号。更糟糕的是,显而易见但丑陋的解决方案(在我调用.XML
之前,通过递归遍历整个文档并将值中的所有引号都替换为'"‘来运行预处理步骤)将不起作用,因为.XML
方法将看到其中的那些&s并对它们进行转义!有什么方法可以解决这个问题吗?
发布于 2011-02-04 07:55:04
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.
https://stackoverflow.com/questions/4892834
复制相似问题