本来XML 文件中的内容为下面:
<?xml version="1.0" encoding="GB2312" ?>
<基础信息>
<商品信息>
<商品编号>00001</商品编号>
<商品名称>成品</商品名称>
<助记码>CP</助记码>
<基本单位>5</基本单位>
<条码>123456</条码>
<预售价>0</预售价>
<最近进价>0</最近进价>
</商品信息>
<往来单位>
<单位编码>C001</单位编码>
<单位名称>一级单位</单位名称>
<助记码>YJDW</助记码>
<往来类别>两者皆是</往来类别>
</往来单位>
</基础信息>
但是为了 传送方便,别人直接 把XML中内容用 String类型作为参数传过来;我读取这些字符并且 把这些字符转换成XML好方便读取里面的记录;
Function TWsGetSysMsg.UpLoadData(FileString:String):String;stdCall;
FileString 参数里面的类容就为上面(<?xml version="1.0" encoding="GB2312"?>
<基础信息><商品信息><商品编号>00001</商品编号> <商品名称>成品</商品名称> <助记码>CP</助记码> <基本单位>5<基本单位> <条码>123456</条码> <预售价>0</预售价> <最近进价>0</最近进价> </商品信息><往来单位><单位编码>C001</单位编码> <单位名称>一级单位</单位名称> <助记码>YJDW</助记码> <往来类别>两者皆是</往来类别> </往来单位></基础信息>)
var
BaseData:TXMLDocument;
Root,Parent_Node,Child_Node :IXmlNode;
begin
try
BaseData:=TXMLDocument.Create(nil);
BaseData.FileName:=FIleName;
BaseData.Active:=True;
Root:=BaseData.DocumentElement;//在这里报地址错误
Parent_Node := Root.ChildNodes.First;;//加载文件会在这里报NO ACTIVE Document
while (Parent_Node<>nil) do //循环取多个商品信息
begin
if (Parent_Node.NodeName = '商品信息') then //判断是否为商品信息
begin
StringList.Add('//////商品信息///////');
Child_Node := Parent_Node.ChildNodes.First;
while (Child_Node<>nil) do //循环取商品信息的各个子各点
begin
if (Child_Node.NodeName = '商品编码') then //判断是否为商品编码结点
StringList.Add('商品编码:'+Child_Node.Text) //取商品编码结点的值,取于name字段中
else if (Child_Node.NodeName = '商品名称') then
StringList.Add('商品名称:'+Child_Node.Text)
else if (Child_Node.NodeName = '助记码') then
StringList.Add('助记码:'+Child_Node.Text);
Child_Node := Child_Node.NextSibling; //顺序取下一个商品信息的子结点信息
end;
end
else
if (Parent_Node.NodeName = '往来单位') then //判断是否为往来单位
begin
StringList.Add('//////往来单位///////');
Child_Node := Parent_Node.ChildNodes.First;
while (Child_Node<>nil) do //循环取往来单位的各个子各点
begin
if (Child_Node.NodeName = '单位编码') then //判断是否为商品编码结点
StringList.Add('单位编码:'+Child_Node.Text)
else if (Child_Node.NodeName = '单位名称') then
StringList.Add('单位名称:'+Child_Node.Text)
else if (Child_Node.NodeName = '助记码') then
StringList.Add('助记码:'+Child_Node.Text);
Child_Node := Child_Node.NextSibling; //顺序取下一个往来单位的子结点信息
end;
end;
Parent_Node := Parent_Node.NextSibling; //顺序取下一个基础信息的子节点
end;
finally
BaseData.Free;
StringList.Free;
end;
Result:=StringList.Text;
end;上面问题如何解决,或者那位大虾给个 列子。读取字符内容(其类容为XML 格式),将字符类容转换成XML,能读取XML 记录
<?xml version="1.0" encoding="GB2312" ?>
<基础信息>
<商品信息>
<商品编号>00001</商品编号>
<商品名称>成品</商品名称>
<助记码>CP</助记码>
<基本单位>5</基本单位>
<条码>123456</条码>
<预售价>0</预售价>
<最近进价>0</最近进价>
</商品信息>
<往来单位>
<单位编码>C001</单位编码>
<单位名称>一级单位</单位名称>
<助记码>YJDW</助记码>
<往来类别>两者皆是</往来类别>
</往来单位>
</基础信息>
但是为了 传送方便,别人直接 把XML中内容用 String类型作为参数传过来;我读取这些字符并且 把这些字符转换成XML好方便读取里面的记录;
Function TWsGetSysMsg.UpLoadData(FileString:String):String;stdCall;
FileString 参数里面的类容就为上面(<?xml version="1.0" encoding="GB2312"?>
<基础信息><商品信息><商品编号>00001</商品编号> <商品名称>成品</商品名称> <助记码>CP</助记码> <基本单位>5<基本单位> <条码>123456</条码> <预售价>0</预售价> <最近进价>0</最近进价> </商品信息><往来单位><单位编码>C001</单位编码> <单位名称>一级单位</单位名称> <助记码>YJDW</助记码> <往来类别>两者皆是</往来类别> </往来单位></基础信息>)
var
BaseData:TXMLDocument;
Root,Parent_Node,Child_Node :IXmlNode;
begin
try
BaseData:=TXMLDocument.Create(nil);
BaseData.FileName:=FIleName;
BaseData.Active:=True;
Root:=BaseData.DocumentElement;//在这里报地址错误
Parent_Node := Root.ChildNodes.First;;//加载文件会在这里报NO ACTIVE Document
while (Parent_Node<>nil) do //循环取多个商品信息
begin
if (Parent_Node.NodeName = '商品信息') then //判断是否为商品信息
begin
StringList.Add('//////商品信息///////');
Child_Node := Parent_Node.ChildNodes.First;
while (Child_Node<>nil) do //循环取商品信息的各个子各点
begin
if (Child_Node.NodeName = '商品编码') then //判断是否为商品编码结点
StringList.Add('商品编码:'+Child_Node.Text) //取商品编码结点的值,取于name字段中
else if (Child_Node.NodeName = '商品名称') then
StringList.Add('商品名称:'+Child_Node.Text)
else if (Child_Node.NodeName = '助记码') then
StringList.Add('助记码:'+Child_Node.Text);
Child_Node := Child_Node.NextSibling; //顺序取下一个商品信息的子结点信息
end;
end
else
if (Parent_Node.NodeName = '往来单位') then //判断是否为往来单位
begin
StringList.Add('//////往来单位///////');
Child_Node := Parent_Node.ChildNodes.First;
while (Child_Node<>nil) do //循环取往来单位的各个子各点
begin
if (Child_Node.NodeName = '单位编码') then //判断是否为商品编码结点
StringList.Add('单位编码:'+Child_Node.Text)
else if (Child_Node.NodeName = '单位名称') then
StringList.Add('单位名称:'+Child_Node.Text)
else if (Child_Node.NodeName = '助记码') then
StringList.Add('助记码:'+Child_Node.Text);
Child_Node := Child_Node.NextSibling; //顺序取下一个往来单位的子结点信息
end;
end;
Parent_Node := Parent_Node.NextSibling; //顺序取下一个基础信息的子节点
end;
finally
BaseData.Free;
StringList.Free;
end;
Result:=StringList.Text;
end;上面问题如何解决,或者那位大虾给个 列子。读取字符内容(其类容为XML 格式),将字符类容转换成XML,能读取XML 记录
解决方案 »
- 关于ADO的ADOdataSet、ADOtable和ADOquery的区别
- 过大年大散分-3
- 我用我的机器delphi编写的ocx控件,放到服务器上,用我的机器访问没有问题,可是别人的机器访问都不好使,各位大哥说说会是什么问题??
- 请问这是什么意思? 在线等.谢谢.
- 2000下 如何使Windows F8健无效
- 怎么做这语音提示
- 大家谈谈如何为应用服务器配置安全属性?
- 我发现Delphi的帮助写的真烂
- 基础问题:类似窗体的AfterShow--在线等,即可给分。
- MDI应用程序中子窗口最大化打开时,会出现闪烁——为什么???
- TOraQuery Ehlib 实现自动排序的字段排序
- 加载数据量很大,怎么提高加载数据速度?
改为
BaseData:=TXMLDocument.Create(Application);
改为
BaseData:=TXMLDocument.Create(Application) 和 BaseData:=TXMLDocument.Create(self) 都可以解决。
但是 我是在没有FORM 窗体中,只有unit单元写的,就只能写成BaseData:=TXMLDocument.Create(nil) 这样,其他两种 都不能编译通过。提示错误
[Error] WsGetSysMsgImpl.pas(409): There is no overloaded version of 'Create' that can be called with these arguments
无form的情况下用IXMLDocument声明,如下所示:procedure TForm1.Button1Click(Sender: TObject);
var
mxml: IXMLDocument;
Root,Parent_Node,Child_Node :IXmlNode;
begin
mxml := TXMLDocument.Create(nil);
mxml.FileName := 'd:\test.xml';
mxml.Active := True;
Root:=mxml.DocumentElement;
Parent_Node := Root.ChildNodes.First;
showmessage(Parent_Node.NodeName);
mxml._Release;
end;
非常感谢,按照以下代码修改成功了procedure TForm1.Button1Click(Sender: TObject);
var
mxml: IXMLDocument;
Root,Parent_Node,Child_Node :IXmlNode;
begin
mxml := TXMLDocument.Create(nil);
mxml.FileName := 'd:\test.xml';
mxml.Active := True;
Root:=mxml.DocumentElement;
Parent_Node := Root.ChildNodes.First;
showmessage(Parent_Node.NodeName);
mxml._Release;
end;