我有一个客户,他提供的文件包含混合的逗号分隔数据和 xml。逗号分隔不是问题,但 xml 对我来说是全新的。
我试图找到一个组件来做我需要的(omnixml -abandoned - using delphi built in xml component)似乎是可能的......
我有如下数据:
<Passengers>
<Passenger>
<No>1</No>
<Title>mrs</Title>
<ForeName>Anne</ForeName>
<SurName>XXXXXXXX</SurName>
<Age>33</Age>
<UWStatus>accept</UWStatus>
<Screening>
<ScreeningData>
<ScreeningPath SL="2.2" DATA="1">
<MedicalRisk>4.01</MedicalRisk>
<rootConditionId>1292</rootConditionId>
<isAMT>false</isAMT>
<regionId>4</regionId>
<isWinterSport>false</isWinterSport>
<isRetScheme>false</isRetScheme>
<isPair>false</isPair>
<LinkedCondition>3</LinkedCondition>
<LinkedConditions>
<LinkedCondition Name="High blood pressure" ICD="401.9" Type="D"/>
<LinkedCondition Name="Renal failure" ICD="586" Type="D"/>
<LinkedCondition Name="Abdominal aortic aneurysm" ICD="441.4" Type="I"/>
<LinkedCondition Name="Peripheral vascular disease" ICD="443.9" Type="I"/>
<LinkedCondition Name="Angina" ICD="414.9" Type="IS"/>
<LinkedCondition Name="Enlarged heart" ICD="425" Type="IS"/>
<LinkedCondition Name="Heart attack" ICD="414.9" Type="IS"/>
<LinkedCondition Name="Heart failure" ICD="428.0" Type="IS"/>
<LinkedCondition Name="Mini stroke" ICD="435.9" Type="IS"/>
<LinkedCondition Name="Stroke" ICD="434" Type="IS"/>
</LinkedConditions>
<ScreeningHistory>
<DeclaredCondition Score="3.56">
<conditions>
<Condition>
<id>1292</id>
<parentid>-1</parentid>
<name>Epilepsy</name>
<questions>
<Question>
<id>1</id>
<Text>If awake#$ do you normally lose consciousness during a fit/seizure?</Text>
<currentAnswer>
<Text>Yes</Text>
<id>1</id>
</currentAnswer>
</Question>
<Question>
<id>2</id>
<Text>How many fits/seizures causing loss of consciousness have you had in the last four weeks?</Text>
<currentAnswer>
<Text>0</Text>
<id>1</id>
</currentAnswer>
</Question>
<Question>
<id>3</id>
<Text>How many fits/seizures causing loss of consciousness have you had in the last six months?</Text>
<currentAnswer>
<Text>0</Text>
<id>1</id>
</currentAnswer>
</Question>
<Question>
<id>4</id>
<Text>How many unplanned hospital admissions have you had for epilepsy/seizures in the last year?</Text>
<currentAnswer>
<Text>1</Text>
<id>2</id>
</currentAnswer>
</Question>
<Question>
<id>5</id>
<Text>How many different medicines do you take for your epilepsy/seizures?</Text>
<currentAnswer>
<Text>1</Text>
<id>2</id>
</currentAnswer>
</Question>
<Question>
<id>6</id>
<Text>How long ago was your first fit/seizure?</Text>
<currentAnswer>
<Text>6 to 12 months ago</Text>
<id>2</id>
</currentAnswer>
</Question>
<Question>
<id>7</id>
<Text>If not already declared to us#$ is your epilepsy/seizures caused by:</Text>
<currentAnswer>
<Text>None of these</Text>
<id>4</id>
</currentAnswer>
</Question>
</questions>
<currentQuestionId>7</currentQuestionId>
<isAMTExclusion>false</isAMTExclusion>
<isWSExclusion>false</isWSExclusion>
<Score>3.56</Score>
<ICD>345.9</ICD>
<Deterioration>0</Deterioration>
<isOkForWS>true</isOkForWS>
<isOkForAMT>true</isOkForAMT>
<exclusionType>None</exclusionType>
</Condition>
</conditions>
</DeclaredCondition>
<DeclaredCondition Score="1.45">
<conditions>
<Condition>
<id>1332</id>
<parentid>-1</parentid>
<name>Blood pressure</name>
<questions>
<Question>
<id>1</id>
<Text>How many medicines does your doctor advise you to take for high blood pressure?</Text>
<currentAnswer>
<Text>1</Text>
<id>2</id>
</currentAnswer>
</Question>
<Question>
<id>2</id>
<Text>Has your dose been increased or have you been prescribed a new tablet in the last six months?</Text>
<currentAnswer>
<Text>No</Text>
<id>2</id>
</currentAnswer>
</Question>
<Question>
<id>3</id>
<Text>Have you been advised to take a medication to lower your cholesterol level?</Text>
<currentAnswer>
<Text>No</Text>
<id>1</id>
</currentAnswer>
</Question>
<Question MQ="2">
<id>4</id>
<Text>Have you ever been a smoker?</Text>
<currentAnswer>
<Text>Yes - gave up less than a year ago</Text>
<id>3</id>
</currentAnswer>
</Question>
</questions>
<currentQuestionId>4</currentQuestionId>
<isAMTExclusion>false</isAMTExclusion>
<isWSExclusion>false</isWSExclusion>
<Score>1.45</Score>
<ICD>401.9</ICD>
<Deterioration>1</Deterioration>
<isOkForWS>true</isOkForWS>
<isOkForAMT>true</isOkForAMT>
<exclusionType>None</exclusionType>
<LinkedConditions>
<LinkedCondition Name="High blood pressure" ICD="401.9" Type="D"/>
<LinkedCondition Name="Renal failure" ICD="586" Type="D"/>
<LinkedCondition Name="Abdominal aortic aneurysm" ICD="441.4" Type="I"/>
<LinkedCondition Name="Peripheral vascular disease" ICD="443.9" Type="I"/>
<LinkedCondition Name="Angina" ICD="414.9" Type="IS"/>
<LinkedCondition Name="Enlarged heart" ICD="425" Type="IS"/>
<LinkedCondition Name="Heart attack" ICD="414.9" Type="IS"/>
<LinkedCondition Name="Heart failure" ICD="428.0" Type="IS"/>
<LinkedCondition Name="Mini stroke" ICD="435.9" Type="IS"/>
<LinkedCondition Name="Stroke" ICD="434" Type="IS"/>
</LinkedConditions>
</Condition>
</conditions>
</DeclaredCondition>
</ScreeningHistory>
</ScreeningPath>
</ScreeningData>
</Screening>
xml 全部在一个字段中提供,没有空格(我已经格式化了这个),并且在不止一个人的地方,它显示为一个新的乘客记录。
我需要能够处理这个并提取类似的东西
乘客记录中的头衔/名字/姓氏字段 然后从分支和它相关的 和 对每个条件的每个答案重复。
我认为这很容易,但我正在努力。
我到目前为止的代码....
第一个人是正确的,第二个人失去了一个 sibling ?有错误还是我?
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;
如有任何帮助,我们将不胜感激。 问候 菲尔
最佳答案
我们在旧版本的 Delphi 中广泛使用了 TurboPower XML Partner。 (不记得我们是否在 Delphi 7 中使用过它)。这是 SourceForge 上最新版本的链接:http://sourceforge.net/projects/tpxmlpartner/ .您或许可以找到适合您的旧版本。
您还可以使用 msxml.dll 中的 xml com 对象。它工作得很好。以下是有关它的更多信息:https://stackoverflow.com/a/1391413/758074 .显然“位于 XMLDoc.pas 中的对象 TXMLDocument(用于 delphi 7)是 MSXML 4 或以下版本的包装器。”。但如果你导入版本 6,你应该处于良好状态。
关于xml - delphi 7 读取和处理 xml 文件的方式和组件 - 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9003003/