Delphi7读取和处理xml文件的方式和组件-更新

Delphi7读取和处理xml文件的方式和组件-更新,xml,delphi,delphi-7,Xml,Delphi,Delphi 7,我有一个客户端,它提供一个混合了逗号分隔数据和xml的文件。逗号分隔不是问题,但xml对我来说是全新的 我试图找到一个组件来做我需要的事情(omnixml-放弃-使用delphi内置的xml组件)似乎是可能的 我有如下数据: 1. 夫人 安妮 XXXXXXXX 33 接受 4.01 1292 假的 4. 假的 假的 假的 3. 1292 -1 癫痫 1. 如果醒着#$你在发作/癫痫发作时通常会失去知觉吗? 对 1. 2. 在过去的四周内,您有多少次发作/癫痫导致意识丧失? 0 1. 3. 在过

我有一个客户端,它提供一个混合了逗号分隔数据和xml的文件。逗号分隔不是问题,但xml对我来说是全新的

我试图找到一个组件来做我需要的事情(omnixml-放弃-使用delphi内置的xml组件)似乎是可能的

我有如下数据:


1.
夫人
安妮
XXXXXXXX
33
接受
4.01
1292
假的
4.
假的
假的
假的
3.
1292
-1
癫痫
1.
如果醒着#$你在发作/癫痫发作时通常会失去知觉吗?
对
1.
2.
在过去的四周内,您有多少次发作/癫痫导致意识丧失?
0
1.
3.
在过去的六个月中,您有多少次发作/癫痫导致意识丧失?
0
1.
4.
在过去一年中,您因癫痫/癫痫发作而计划外入院的人数有多少?
1.
2.
5.
您服用多少种不同的药物治疗癫痫/癫痫?
1.
2.
6.
你第一次发作是多久以前?
6至12个月前
2.
7.
如果尚未向我们申报#$您的癫痫/癫痫是否由以下原因引起:
这些都不是
4.
7.
假的
假的
3.56
345.9
0
真的
真的
没有一个
1332
-1
血压
1.
你的医生建议你服用多少治疗高血压的药物?
1.
2.
2.
在过去的六个月里,你的剂量增加了吗,或者给你开了新的药片?
不
2.
3.
有人建议你服用药物来降低胆固醇水平吗?
不
1.
4.
你曾经吸烟吗?
是的-不到一年前就放弃了
3.
4.
假的
假的
1.45
401.9
1.
真的
真的
没有一个

xml都是在一个字段中提供的,没有空格(我已经格式化了),如果有多个人,则显示为新的乘客记录

我需要能够处理这些信息并提取类似的信息

乘客记录中的标题/姓名/姓氏字段 然后从分支和与之相关的and,对每个条件的每个答案都重复

我认为这相当容易,但我正在努力

代码我到目前为止

第一个人是对的第二个人失去了一个兄弟姐妹?是有虫子还是我

StartItemNode:=XMLDoc.DocumentElement.ChildNodes.First;
ANode := StartItemNode;

repeat
  Title := ANode.ChildNodes['Title'].Text;
  Forename := ANode.ChildNodes['ForeName'].Text;
  Surname := ANode.ChildNodes['SurName'].Text;
  Age:=Anode.ChildNodes['Age'].Text;
  memo1.Lines.Add(Title+' '+Forename+' '+Surname+' '+Age);

  CNode:=Anode.ChildNodes.FindNode('Screening');
  CNode:=CNode.ChildNodes.FindNode('ScreeningData');
  CNode:=CNode.ChildNodes.FindNode('ScreeningPath');
  CNode:=CNode.ChildNodes.FindNode('ScreeningHistory');
  CNode:=Cnode.ChildNodes.FindNode('DeclaredCondition');
  CNode:=Cnode.ChildNodes.FindNode('conditions');
  CNode:=Cnode.ChildNodes.FindNode('Condition');
  (* Missing the 2nd illness on the 2nd node - but why *)

  repeat
   ill:=Cnode.ChildNodes['name'].text;
   memo1.Lines.add(ill);
   Unode:=Cnode;
   CNode:=Cnode.NextSibling;
  until cnode=nil;
如蒙帮助,将不胜感激。 当做
Phil

我们在旧版本的Delphi中广泛使用了TurboPower XML Partner。(不记得我们是否在Delphi 7中使用过它)。以下是指向SourceForge上最新版本的链接:。您可能会找到适合您的早期版本


也可以使用msxml.dll中的xml com对象。它工作得很好。以下是有关它的更多信息:。显然,“XMLDoc.pas中的对象TXMLDocument(对于delphi 7)是MSXML 4o版本的包装器。”。但是如果您导入版本6,您应该状态良好。

我非常喜欢SimDesign使用NativeXML。它有不错的文档,并且是开源的。
您不需要单独的库:Delphi已经有了一个库

使用XML数据绑定向导(仅适用于企业版中的D7)为(未格式化的)XML文件创建接口单元,请参见文件>新建>其他>新建>XML数据绑定。可以随意调整,但只需单击“确定”即可传递每个向导页面,默认情况下效果良好。(请注意,其他Delphi版本的默认设置可能与我的不同。)尽管我个人喜欢去掉的一件事是每个接口类型的“Type”后缀。(一)
procedure TForm1.Button1Click(Sender: TObject);
var
 StartItemNode:IXMLNode;
 ANode:IXMLNode;
 CNode:IXMLNode;
 LNode:IXMLNode;
 QNode:IXMLNode;
 UNode:IXMLNode;
 hnode:ixmlnode;
INode:IXMLNode;
number:widestring;  
Title:widestring;
Forename:widestring;
Surname:widestring;
Age:widestring;
ill:widestring;
quest:widestring;
answer:widestring;
first:boolean;
who:string;
begin
 opendialog1.Execute;
 who:=extractfilepath(opendialog1.FileName)+extractfilename(opendialog1.filename)
 +'_TXT.TXT';
 XMLDOC.FileName:=opendialog1.FileName;

 XMLDoc.Active:=True;

memo1.Clear;
XMLDOC.SaveToFile('c:\philxx.xml');

StartItemNode:=XMLDoc.DocumentElement.ChildNodes.First;
ANode := StartItemNode;

memo1.Lines.add('Filename '+opendialog1.FileName);
if anode<>nil then
begin

repeat
  memo1.Lines.Add('====== New Person ======');
  number :=anode.childnodes['number'].Text;
  Title := ANode.ChildNodes['Title'].Text;
  Forename := ANode.ChildNodes['ForeName'].Text;
  Surname := ANode.ChildNodes['SurName'].Text;
  Age:=Anode.ChildNodes['Age'].Text;
  memo1.lines.add(number);
  memo1.Lines.Add(Title+' '+Forename+' '+Surname+' '+Age);

  CNode:=Anode.ChildNodes.FindNode('Screening');
  CNode:=CNode.ChildNodes.FindNode('ScreeningData');
  CNode:=CNode.ChildNodes.FindNode('ScreeningPath');
  CNode:=CNode.ChildNodes.FindNode('ScreeningHistory');

  HNode:=Cnode.ChildNodes.FindNode('DeclaredCondition');
  while hnode<>nil do
  begin
    unode:=hnode;
  memo1.lines.add('==== Illnesses ===');
  if unode<>nil then
  begin
   UNode:=Unode.ChildNodes.FindNode('conditions');
   Cnode:=Unode;
   Inode:=CNode.ChildNodes.FindNode('Condition');
  while unode<>nil do
  begin
   ill:=Inode.ChildNodes['name'].text;
   memo1.Lines.add(ill);
   lnode:=Unode;
   unode:=unode.nextsibling;
   if unode=nil then
    begin
     unode:=lnode;
     inode:=inode.NextSibling;
     if inode=nil then unode:=nil;
    end
    else
    begin
     CNode:=Unode.ChildNodes.FindNode('conditions');
     Inode:=CNode.ChildNodes.FindNode('Condition');
    end;


  end;

  end;
   hnode:=hnode.nextsibling;
  end;
  CNode:=Anode.ChildNodes.FindNode('Screening');
  CNode:=CNode.ChildNodes.FindNode('ScreeningData');
  CNode:=CNode.ChildNodes.FindNode('ScreeningPath');
  CNode:=CNode.ChildNodes.FindNode('ScreeningHistory');
  HNode:=Cnode.ChildNodes.FindNode('DeclaredCondition');


  while hnode<>nil do
  begin
    unode:=hnode;

  (* Gets all the questions but seems to have same issue with missing questions for 2nd illness *)
  if unode<>nil then
  begin
   UNode:=Unode.ChildNodes.FindNode('conditions');
   Cnode:=Unode;
   Inode:=CNode.ChildNodes.FindNode('Condition');



  while unode<>nil do
   begin
     QNode:=inode.ChildNodes.FindNode('questions');
     if qnode=nil then
      begin
       memo1.lines.add('=== No questions for Illness === ');
      end;
     if qnode<>nil then
      begin
        qNode:=qNode.ChildNodes.FindNode('Question');
        memo1.Lines.add('==== New Questions ====');
        while qnode<>nil do
         begin
          quest:=qnode.ChildNodes['Text'].text;
          memo1.Lines.add(quest);
          answer:=qnode.ChildNodes['currentAnswer'].ChildNodes['Text'].text;
          memo1.lines.add(answer);
          qNode:=qnode.NextSibling;
         end;
      end;
     lnode:=unode;
     unode:=unode.NextSibling;
     if unode=nil then
     begin
       unode:=lnode;
       inode:=inode.NextSibling;
       if inode=nil then unode:=nil;
     end
     else
     begin
      CNode:=Unode.ChildNodes.FindNode('conditions');
      Inode:=CNode.ChildNodes.FindNode('Condition');
     end;
   end;
  end;
   hnode:=hnode.nextsibling;
  end;

  ANode := ANode.NextSibling;
until ANode = nil;
end
  else memo1.lines.Add('No Illness or Questions Found ');
  memo1.Lines.SaveToFile(who);
  showmessage('done');