- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我知道这将是一个重复的问题,但仍然再次询问,因为没有解决此问题的方法。让我先解释一下问题陈述,然后我也会提到我尝试了什么。
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 文件中,我放置了 TXMLTransformProvider 和 Clientdataset。在 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򢷾
我尝试过的解决方法:
获取该节点值后将 & 替换为#13#10。
InfoNode := StringReplace(InfoNode, '&', #13#10, [rfReplaceAll]);
但这不是正确的解决方案,因为信息节点实际上可以包含数据库中的 &。
我将我的 XML 硬编码为:
<Order><XMLversion>2</XMLversion><Info>*-first line *-second line</Info></Order>
和
<Order><XMLversion>2</XMLversion><Info>*-first line
*-second line</Info></Order>
还有
<Order><XMLversion>2</XMLversion><Info><![CDATA[*-first line
*-second line]]></Info></Order>
没有任何效果。每次我得到与上面提到的相同的结果。符号。
Ken White 的 回答对我也不起作用,他在上一个问题中提供给我。
@TLama - 你在我之前的问题中建议我(抱歉,但出于某种原因我已经删除了它)这是 TXMLTransformProvider 中的错误 并且我应与 Remy 的解决方案一起使用。但现在没有任何工作。那么接下来我应该采取什么步骤来解决这个直接的问题呢?您是否向 Embarcadero 提出了这个错误?
请给我建议任何可以解决此问题的解决方法?
最佳答案
我需要在这个回答的开头说,与 Remy 或 Ken 不同,我绝对不是 Unicode 方面的专家,我什至不确定它是否与您的问题有关。
不过,我查看了您的 XMLTransformProvider 生成的磁盘字节,并将其与执行 CDS.SaveToFile('Test.Xml', dfXML) 时写入磁盘的字节进行了比较。
很明显,虽然 CDS 将嵌入在 DB 备注字段中的换行符保存为:
XMLTransformProvider 为类似的换行符生成的是:
因此,我头脑简单的建议解决方法是连接到您打开 XML 数据文件的代码,像这样,以其自己的格式加载带有 XML 的 CDS:
const
TransformNewLine = '
';
CDSNewLine = '
';
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/
我正在构建一个使用 Oracle 数据库 10g 作为数据库后端的 Web 应用程序。我意识到 Express 版本有限制,但我只是想确保连接数不是其中之一。 Oracle 快捷版 (XE) 是否限制
我是一名开始使用 Oracle 数据库的新手,在将 Oracle XE 11g x64 的最新版本安装到 Microsoft Windows 7 x64 Enterprise 时遇到了问题。 安装过程
我有一个 USB 连接到 device发出串行信息。当我运行下面的 Python 脚本(在 Jupyter Notebook 中)时,我从中得到了奇怪的信息。 import serial ser =
我们有一台运行 Delphi XE Professional 的机器,它会在 IDE 中键入时更改某些键的值。它将字母和数字键更改为数字。按下下一个键将按顺序输入下一个数字,直到 9,然后从 0 重新
从昨天开始,我的源代码中的所有蓝点(编译行)都移动了一行。因此,第一个点从“var”而不是“begin”开始,最后一个点是函数最后一个“end”之前的一行。 我删除了除 DPR、PAS、DFM 和 D
我在 RegexBuddy 中构建了一个匹配模式,其行为完全符合我的预期。但我无法将其转移到 Delphi XE,至少在使用最新内置的 TRegEx 或 TPerlRegEx 时是这样。 我的现实世界
TBytes 变量的正确使用模式是什么?根据我的理解,TBytes不是一个类,而是一个“动态字节数组”。我不确定内存在哪里分配,何时释放,以及将其从生产者传递到消费者的最佳方式是什么。我希望我的生产者
我创建了一个自定义 MSBuild .targets我通过 IDE 将其包含在 Delphi XE 项目中,并从项目管理器的上下文菜单中启用它。尽管文件有效,但在我重新保存项目文件后它总是被禁用。 这
有谁知道 http://reportman.sourceforge.net/可用于 Delphi XE 吗? 最佳答案 我已经成功获得Reportmanager 2.9b通过将以下行添加到文件 rpc
Oracle XE Oracle是这样介绍XE的:11g XE(Express Edition)简化版是在Oracle11gR2基础之上一个入门级的小体量数据库,免费用于开发/部署与发布,下载很快
我已经安装了 docker 在 Ubuntu 21.10 并跟随官方 instructions 我拉甲骨文 11g xe 图片:docker pull oracleinanutshell/oracle
一段时间以来,我一直在寻找解决问题的方法,但似乎没有任何效果,这是我重新安装之前的最后一次尝试。 我今天通过其安装向导安装了 Oracle XE 11g 第 2 版,并且一切顺利。我似乎遇到的麻烦是我
我需要模拟汽车在平方区域上移动(比方说)。 任何人都可以轻松想象计算(x/y 坐标、轨迹、速度、加速度、暂停......) 之前的版本(跨千年错误开发...... 21 年前)运行到 Applicat
我已经下载了适用于 Windows 64 位的 Oracle XE 18c,并尝试将其安装在 Windows 10 机器上。我检查了 SHA-256 校验和,它是正确的。 安装开始正常,但是当它复制新
我需要通过客户端操作删除服务器上的物理文件,然后将文件删除事件通知远程数据库-希望这完全在serverSide上发生。 更高版本的Delphi公开了许多以前在WinAPI调用中被锁定的目录服务。目前,
这几年来我一直没有使用Delphi(我使用的最新版本是D2005),现在我需要在DelphiXE中做一些工作。我的问题是,如何在Delphi IDE中禁用声明包装?目前,我使用Modelmaker的代
如何打开应用程序初始化所在的程序单元?我需要进行一些更改。 另外,除了显示的当前单位以外,还可以在程序中搜索所有单位吗? Delphi 5有一个弹出窗口,您可以选择它。 最佳答案 每个项目均由sing
如何配置Datasnap REST服务器(在Windows上作为服务运行)以处理Delphi XE中的https调用?周围有什么好的例子吗? 向上的Delphi XE2似乎具有其他组件-这是否意味着X
我尝试以这种方式列出程序: type TProc = procedure of object; TMyClass=class private fList:Tlist; function getItem
我刚刚发现了 Delphi 的实时绑定(bind)。并创建了我的第一个组件来处理变频器的控制字。该组件本身似乎在表单设计器中测试它效果很好。但是,编译和运行应用程序不起作用。来自 livbinding
我是一名优秀的程序员,十分优秀!