delphi操作xml的问题

qq22345111 2009-06-02 04:04:13
僵哥您好:首先我把完整的xml贴出来,内容可能很多
<?xml version="1.0" encoding="GB2312" ?> 
- <data>
<YKC201>医院门诊交易流水号</YKC201>
<yka026>门诊大病编码</yka026>
<ykc102>科室名称</ykc102>
<ykc103>医师姓名</ykc103>
<ykc104>诊断病种</ykc104>
<ykc06>收费员</ykc06>
- <datasetyp> --//药品清单
- <row>
<ykc120>序号</ykc120>
<aka060>药品编码</aka060>
<aka079>医疗机构药品编码</aka079>
<aka061>药品名称</aka061>
<aka067>计量单位</aka067>
<aka073>规格</aka073>
<yka200>单价</yka200>
<yak201>数量</yak201>
<yka202>金额</yka202>
</row>
</datasetyp>
- <datasetzl>--//诊疗清单
- <row>
<ykc120>序号</ykc120>
<aka090>诊疗编码</aka090>
<aka079>医疗机构诊疗编码</aka079>
<aka061>医疗机构诊疗名称</aka061>
<aka067>计量单位</aka067>
<yka200>单价</yka200>
<yka201>数量</yka201>
<yka202>金额</yka202>
</row>
</datasetzl>
</data>

在这个帖子当中
http://topic.csdn.net/u/20090601/17/cc36277e-3cfd-4adf-add7-3ff00fc56441.html
你给出了的恢复,与我写的代码一样,只是产生了一个xml文件!
我来解释一下问题:
<data>//首节点下面有很多节点
<YKC201>医院门诊交易流水号</YKC201>
<yka026>门诊大病编码</yka026>
<ykc102>科室名称</ykc102>
<ykc103>医师姓名</ykc103>
<ykc104>诊断病种</ykc104>
<ykc06>收费员</ykc06>
------------------
PS://上面的信息表示某一个医生的处方基本信息,然后,他肯定会开出很多的“药品清单”与“诊疗清单”;
在回答这个帖子,
http://topic.csdn.net/u/20090601/17/cc36277e-3cfd-4adf-add7-3ff00fc56441.html
这个帖子里面,你的代码和我的代码都实现了创建一个xml的功能。
我的问题是,要往这个xml循环的插入“药品清单”与“诊疗清单”;而不是没插入一个“药品清单”与“诊疗清单”就去创建一个新的xml;
我今天仔细的想了想,创建上面xml的大小为1KB,如果一个医生开了100种药(甚至与更多),100个诊疗项目,那么xml文件的大小大概就要用兆来计算,同时肯定有输入就有输出,那么我们采用建立每中药多一个xml的方法肯定不对。注意的一点,量变引起质变,
[color=#FF6600]xmldoc.free
肯定不行,为什么呢?1个病人结算完成了,不可能让下一个病人在等待2-3分钟的程序释放时间....我想的方法是,如果某一个医生的完成了,就直接删除xml文件,然后新建立一个,所以在我代码中用到if not fileExists(name) then[/color]
我想生成的最后结果是:第一次创建医生的第一个药品序号,第一个诊疗序号
<?xml version="1.0" encoding="GB2312" ?>
- <data>
<YKC201>医院门诊交易流水号</YKC201>
<yka026>门诊大病编码</yka026>
<ykc102>科室名称</ykc102>
<ykc103>医师姓名</ykc103>
<ykc104>诊断病种</ykc104>
<ykc06>收费员</ykc06>
- <datasetyp> --//药品清单
- <row>
<ykc120>序号</ykc120>
<aka060>药品编码</aka060>
<aka079>医疗机构药品编码</aka079>
<aka061>药品名称</aka061>
<aka067>计量单位</aka067>
<aka073>规格</aka073>
<yka200>单价</yka200>
<yak201>数量</yak201>
<yka202>金额</yka202>
</row>
</datasetyp>
- <datasetzl>--//诊疗清单
- <row>
<ykc120>序号</ykc120>
<aka090>诊疗编码</aka090>
<aka079>医疗机构诊疗编码</aka079>
<aka061>医疗机构诊疗名称</aka061>
<aka067>计量单位</aka067>
<yka200>单价</yka200>
<yka201>数量</yka201>
<yka202>金额</yka202>
</row>
</datasetzl>
</data>
-------------
PS:
当操作人员进行第二次传递的时候得到的结果为:某医生的第二个药品清单:
<?xml version="1.0" encoding="GB2312" ?>
- <data>
<YKC201>医院门诊交易流水号</YKC201>
<yka026>门诊大病编码</yka026>
<ykc102>科室名称</ykc102>
<ykc103>医师姓名</ykc103>
<ykc104>诊断病种</ykc104>
<ykc06>收费员</ykc06>
- <datasetyp> --//药品清单
- <row>
<ykc120>序号</ykc120>
<aka060>药品编码</aka060>
<aka079>医疗机构药品编码</aka079>
<aka061>药品名称</aka061>
<aka067>计量单位</aka067>
<aka073>规格</aka073>
<yka200>单价</yka200>
<yak201>数量</yak201>
<yka202>金额</yka202>
</row>
<row>
<ykc120>序号2/ykc120>
<aka060>药品编码2/aka060>
<aka079>医疗机构药品编码2/aka079>
<aka061>药品名称2</aka061>
<aka067>计量单位2</aka067>
<aka073>规格2</aka073>
<yka200>单价2</yka200>
<yak201>数量2</yak201>
<yka202>金额2</yka202>
</row>
</datasetyp>
- <datasetzl>--//诊疗清单
- <row>
<ykc120>序号</ykc120>
<aka090>诊疗编码</aka090>
<aka079>医疗机构诊疗编码</aka079>
<aka061>医疗机构诊疗名称</aka061>
<aka067>计量单位</aka067>
<yka200>单价</yka200>
<yka201>数量</yka201>
<yka202>金额</yka202>
</row>
<row>
<ykc120>序号2/ykc120>
<aka090>诊疗编码2/aka090>
<aka079>医疗机构诊疗编码2/aka079>
<aka061>医疗机构诊疗名称2/aka061>
<aka067>计量单位2/aka067>
<yka200>单价2/yka200>
<yka201>数量2/yka201>
<yka202>金额2/yka202>
</row>

</datasetzl>
</data>

PS:----------我是万恶的分割线-------
在第一次建立的"某医生"的所创建的xml的基础上插入数据,而不是
http://topic.csdn.net/u/20090601/17/cc36277e-3cfd-4adf-add7-3ff00fc56441.html中的录入一次就讲上一次的结果覆盖!

在上一帖中,感觉大家的回答都是答非所问。不知道我这一次的意思表达清楚没有!谢谢!我的代码随后贴出



...全文
488 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq22345111 2009-06-03
  • 打赏
  • 举报
回复
问题我已自己想办法解决 结帖给分
僵哥 2009-06-02
  • 打赏
  • 举报
回复
先判断XML文件是否有存在,如果没有就创建并填充一个模板数据,然后通过XMLDOM定位到如datasetyp或datasetzl等等,然后添加新的row
haitao 2009-06-02
  • 打赏
  • 举报
回复
xml的效率从来就不看好
那些搞java的是不怕慢,反正加钱提高硬件配置是客户的事情——关键是他们的客户就是愿意
xiaosacao 2009-06-02
  • 打赏
  • 举报
回复
如果可以查找节点的话,你查找I_XML_11.xml文件中,要插入位置的节点名称,找到后创建新的element,然后插入进去.
qq22345111 2009-06-02
  • 打赏
  • 举报
回复
SaveToFile换一个文件名不就好了吗?
这样处理只是重新建立了一个新的xml文件
我要的在I_XML_11.xml里面插入
xiaosacao 2009-06-02
  • 打赏
  • 举报
回复
帮顶!不用给我分..
qq22345111 2009-06-02
  • 打赏
  • 举报
回复
只是重新建立了一个新的xml文件
我要的在I_XML_11.xml里面插入
僵哥 2009-06-02
  • 打赏
  • 举报
回复
SaveToFile换一个文件名不就好了吗?
qq22345111 2009-06-02
  • 打赏
  • 举报
回复
function TForm1.I_XML_11(XMLDocument1:IXMLDocument):IXMLNode;
var
XMLNode,topNode,dataNode,Parent_Node:IXMLNode;
i:integer;
name:string;

begin
name:=ExtractFilePath(Application.Exename)+'I_XML_11.xml';
if not fileExists(name) then //如果delphi2008.txt不存在
begin
XMLDocument1.Active:=true;
XMLDocument1.version := '1.0';
XMLDocument1.Encoding:='GB2312';
XMLNode:=XMLDocument1.AddChild('data');
topNode:=XMLNode.AddChild('YKC201');
topNode.Text:='医院门诊交易流水号';
topNode:=XMLNode.AddChild('yka026');
topNode.Text:='门诊大病编码';
topNode:=XMLNode.AddChild('ykc102');
topNode.Text:='科室名称';
topNode:=XMLNode.AddChild('ykc103');
topNode.Text:='医师姓名';
topNode:=XMLNode.AddChild('ykc104');
topNode.Text:='诊断病种';
topNode:=XMLNode.AddChild('ykc06');
topNode.Text:='收费员';

topNode:=XMLNode.AddChild('datasetyp');
begin
topNode:=topNode.AddChild('row');
//parent_Node.SetAttributeNS('');
dataNode:=topNode.AddChild('ykc120');
dataNode.Text:='序号';
dataNode:=topNode.AddChild('aka060');
dataNode.Text:='药品编码';

dataNode:=topNode.AddChild('aka079');
dataNode.Text:='医疗机构药品编码';

dataNode:=topNode.AddChild('aka061');
dataNode.Text:='药品名称';

dataNode:=topNode.AddChild('aka067');
dataNode.Text:='计量单位';

dataNode:=topNode.AddChild('aka073');
dataNode.Text:='规格';

dataNode:=topNode.AddChild('yka200');
dataNode.Text:='单价';

dataNode:=topNode.AddChild('yak201');
dataNode.Text:='数量';

dataNode:=topNode.AddChild('yka202');
dataNode.Text:='金额';
end;

topNode:=XMLNode.AddChild('datasetzl');

topNode:=topNode.AddChild('row');
dataNode:=topNode.AddChild('ykc120');
dataNode.Text:='序号';

dataNode:=topNode.AddChild('aka090');
dataNode.Text:='诊疗编码';

dataNode:=topNode.AddChild('aka079');
dataNode.Text:='医疗机构诊疗编码';

dataNode:=topNode.AddChild('aka061');
dataNode.Text:='医疗机构诊疗名称';

dataNode:=topNode.AddChild('aka067');
dataNode.Text:='计量单位';
dataNode:=topNode.AddChild('yka200');
dataNode.Text:='单价';
dataNode:=topNode.AddChild('yka201');
dataNode.Text:='数量';
dataNode:=topNode.AddChild('yka202');
dataNode.Text:='金额';

XMLDocument1.SaveToFile('I_XML_11.xml');
//在这里肯定有一个else 加载文件,然后把第二次的清单插入----能力有限,无法处理else
XMLDocument1.LoadFromFile(ExtractFilePath(Application.Exename)+'I_XML_11.xml');
XMLDocument1.Active:=true;
end;
这是我创建的代码

问题:如何实现第二次执行程序的时候插入数据到I_XML_11.xml而不是新建立一个把他覆盖(每完成一个医生的数据就会删除掉xml,让下一个医生在创建!)
我需要的结果已经在上面了!

谢谢,僵哥,如果有空解决不胜感激
PS-------我是万恶的分割线-------
如果有源代码就更开心了

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧