【发布时间】:2012-01-25 12:48:59
【问题描述】:
我有一个客户正在提供一个包含混合逗号分隔数据和 xml 的文件。逗号分隔不是问题,但 xml 对我来说是全新的。
我试图找到一个组件来做我需要的事情(omnixml -已放弃 - 使用 delphi 内置的 xml 组件)似乎是可能的......
我有如下数据:
<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 全部在一个字段中提供,没有空格(我已对此进行了格式化),并且如果有多个人,它会显示为新的乘客记录。
我需要能够处理这个并提取类似的东西
乘客记录中的职务/姓名/姓氏字段 然后从分支和与它相关的 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;
如果收到任何帮助,将不胜感激。 问候 菲尔
【问题讨论】:
-
This question 似乎提供了使用 OmniXML 所需的所有信息。
-
嗨,Ken,我试过了,但我还在苦苦挣扎,我的问题是如果我做一个循环来选择主乘客节点,那么我如何子选择其他节点,如
-
好的。试试this link,看看它是否能让事情变得更清楚。 :)
-
Ken 试过这对我的文件不起作用,基本上最终选择了每个人的所有兄弟数据 - 所以如果你有 2 个人记录,你会得到第一个人的所有疾病和问题。放弃并尝试上述方法。
-
你能把别人的XML数据加到上面的XML数据中吗?当前的示例数据仅适用于 1 人(并且不完整!)。如果我们可以测试更多人,那就太好了,因为您对此有特别的麻烦。