gpt4 book ai didi

xml - 使用 TXMLTransformProvider 组件解决 Delphi XE4 中 & 和 CRLF 问题

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:29 30 4
gpt4 key购买 nike

我知道这将是一个重复的问题,但仍然再次询问,因为没有解决此问题的方法。让我先解释一下问题陈述,然后我也会提到我尝试了什么。

XML:

<Order><XMLversion>2</XMLversion><Info>*-first line
*-second line</Info></Order>

CRLF 在“*-first line”语句之后。

我使用 Delphi XE4 RAD Studio Tools --> XML Mapper 实用程序创建了与此 XML 对应的 XTR 文件。在我得到的 XTR 文件之后:

<XmlTransformation Version="1.0"><Transform Direction="ToCds"><SelectEach dest="DATAPACKET\ROWDATA\ROW" from="\Order"><Select dest="@XMLversion" from="\XMLversion"/><Select dest="@Info" from="\Info"/></SelectEach></Transform><XmlSchema RootName="Order"><![CDATA[<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<element xmlns="http://www.w3.org/2001/XMLSchema" name="Order" type="OrderType"/>
<complexType xmlns="http://www.w3.org/2001/XMLSchema" name="OrderType">
<sequence>
<element name="XMLversion" type="XMLversionType"/>
<element name="Info" type="InfoType"/>
</sequence>
</complexType>
<element xmlns="http://www.w3.org/2001/XMLSchema" name="XMLversion" type="XMLversionType"/>
<simpleType xmlns="http://www.w3.org/2001/XMLSchema" name="XMLversionType">
<restriction base="xs:string"/>
</simpleType>
<element xmlns="http://www.w3.org/2001/XMLSchema" name="Info" type="InfoType"/>
<simpleType xmlns="http://www.w3.org/2001/XMLSchema" name="InfoType">
<restriction base="xs:string"/>
</simpleType>
</xs:schema>]]></XmlSchema><CdsSkeleton/><XslTransform/><Skeleton><![CDATA[<?xml version="1.0"?><DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="XMLversion" fieldtype="string" WIDTH="1"/><FIELD attrname="Info" fieldtype="bin.hex" SUBTYPE="Text"/></FIELDS><PARAMS/></METADATA><ROWDATA/><METADATA><FIELDS><FIELD attrname="XMLversion" fieldtype="string" WIDTH="1"/><FIELD attrname="Info" fieldtype="bin.hex" SUBTYPE="Text"/></FIELDS><PARAMS/></METADATA><ROWDATA/></DATAPACKET>
]]></Skeleton></XmlTransformation>

问题陈述:

在我的 dfm 文件中,我放置了 TXMLTransformProviderClientdataset。在 TXMLTransformProvider 中,我提供了 XML 和 XTR 文件的路径。 TClientdataset 的 ProviderName 设置为 TXMLTransformProvider。

以下是我从 XML 中读取“信息”节点的代码。

procedure TfrmAmpersand.Issue;
var
InfoNode : Variant;
begin
try
InfoNode := ClientDataset1.FieldByName('Info').AsVariant;
ShowMessage(InfoNode);
except on e:exception do
begin
ShowMessage(e.Message);
end;
end;
end;

XML 中有两个字段:XMLVersion 和Info。在Clientdataset中,XMLVersion是TStringField,Info是TMemoField。

ShowMessage(InfoNode),显示消息是这样的

*-first line&*-second line

虽然在 Delphi 7 的情况下,它工作正常并显示如下消息:

*-first line
*-second line

以下是我的保管箱链接,我已经在其中上传了针对此问题的示例项目:

https://www.dropbox.com/s/foi7o3wf7wlx9lh/AmpersandIssue.zip

请注意,我已将 XML 和 XTR 文件的硬编码路径放入 TXMLTransformProvider 中。所以将这个项目保存在 D: 驱动器中或者只更改 TXMLTransformProvider 中的路径。

以下是 EDN 链接,我在其中提出了同样的问题但没有得到回复:

https://forums.embarcadero.com/thread.jspa?messageID=667134&#667134

我尝试过的解决方法:

  1. 获取该节点值后将 & 替换为#13#10

    InfoNode := StringReplace(InfoNode, '&', #13#10, [rfReplaceAll]);

但这不是正确的解决方案,因为信息节点实际上可以包含数据库中的 &。

  1. 我尝试了他在上一个问题中提供的所有Remy 的解决方案:

我将我的 XML 硬编码为:

<Order><XMLversion>2</XMLversion><Info>*-first line&#13;&#10;*-second line</Info></Order>

<Order><XMLversion>2</XMLversion><Info>*-first line&#xD;&#xA;*-second line</Info></Order>

还有

<Order><XMLversion>2</XMLversion><Info><![CDATA[*-first line
*-second line]]></Info></Order>

没有任何效果。每次我得到与上面提到的相同的结果。符号。

  1. Ken White 的 回答对我也不起作用,他在上一个问题中提供给我。

  2. @TLama - 你在我之前的问题中建议我(抱歉,但出于某种原因我已经删除了它)这是 TXMLTransformProvider 中的错误 并且我应与 Remy 的解决方案一起使用。但现在没有任何工作。那么接下来我应该采取什么步骤来解决这个直接的问题呢?您是否向 Embarcadero 提出了这个错误?

请给我建议任何可以解决此问题的解决方法?

最佳答案

我需要在这个回答的开头说,与 Remy 或 Ken 不同,我绝对不是 Unicode 方面的专家,我什至不确定它是否与您的问题有关。

不过,我查看了您的 XMLTransformProvider 生成的磁盘字节,并将其与执行 CDS.SaveToFile('Test.Xml', dfXML) 时写入磁盘的字节进行了比较。

很明显,虽然 CDS 将嵌入在 DB 备注字段中的换行符保存为:

XMLTransformProvider 为类似的换行符生成的是:

因此,我头脑简单的建议解决方法是连接到您打开 XML 数据文件的代码,像这样,以其自己的格式加载带有 XML 的 CDS:

const 
TransformNewLine = '&#xA;';
CDSNewLine = '&#013;&#010;';

function FixCdsXml(Input : String) : String;
begin
Result:= StringReplace(Input, TransformNewLine, CDSNewLine, [rfReplaceAll]);
end;

procedure TfrmAmpersand.TestFix;
var
S : String;
SS : TStringStream;
begin
S := XMLTransformProvider1.TransformRead.Data;
S := FixCdsXml(S);
SS := TStringStream.Create(S);
try
SS.Position := 0;
ClientDataSet1.LoadFromStream(SS);
finally
SS.Free;
end;
end;

在 TXMLTransformerProvider 或其 TXMLTransform 子组件中似乎没有任何方便的事件可用作自动调用 TestFix 的机会。但是,如果您在 CDS 的 AfterOpen 事件中调用它,它似乎工作正常,前提是您向表单添加一个“FixingXML” bool 值以防止重新进入并像这样对事件进行编码:

procedure TfrmAmpersand.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
if FixingXML then exit;
FixingXML := True;
try
TestFix;
finally
FixingXML := False;
end;
end;

顺便说一句,我正在使用 XE6。

关于xml - 使用 TXMLTransformProvider 组件解决 Delphi XE4 中 & 和 CRLF 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24966998/

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