gpt4 book ai didi

xml - 如何让 IXmlDomDocument2.XML 正确转义引号?

转载 作者:行者123 更新时间:2023-12-02 08:35:58 27 4
gpt4 key购买 nike

我正在解决一个问题,从我们的程序导出的 XML 没有转义引号(将 " 转换为 "),导致接收问题end。它可以很好地转义 &s 和尖括号,但不能转义引号。

当我深入研究 XML 导出代码时,我发现它是一个非常简单的 IXmlDomDocument2 DOM 接口(interface)。但是,当我到达通过调用 .XML 方法生成 XML 字符串输出的步骤时,我遇到了无法追踪的专有性之墙,因为所有工作都在进行放置在 C:\Windows\System32\msxml3.dll 内。

显然,微软的 IXmlDomDocument2 实现知道如何转义某些符号,但不知道如何转义其他符号。更糟糕的是,显而易见但丑陋的解决方案(在调用 .XML 之前,通过递归遍历整个文档并用 '"' 替换值中的所有引号来运行预处理步骤)不会'不起作用,因为 .XML 方法会看到其中的 & 并转义它们!有什么方法可以解决这个问题吗?

最佳答案

这可能被视为另一端使用的 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.

关于xml - 如何让 IXmlDomDocument2.XML 正确转义引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892834/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com